diff --git a/vulkan.d b/vulkan.d index 3a756de..0142033 100644 --- a/vulkan.d +++ b/vulkan.d @@ -1306,15 +1306,18 @@ CreateImageView(Descriptor* desc) // TODO: also handle here VkCheck("CreateImageView failure: vkCreateImageView error", result); - if(desc.image.usage == IU.Draw || desc.image.usage == IU.Depth || desc.image.usage == IU.Convert) - { - desc.image.shader_layout = IL.General; - } - else if(desc.image.usage == IU.Texture) - { - desc.image.shader_layout = IL.ReadOnly; - } - else assert(false, "Unimplemented usage"); + switch(desc.image.usage) + { + case IU.Draw, IU.Depth, IU.Convert, IU.Storage: + { + desc.image.shader_layout = IL.General; + } break; + case IU.Texture: + { + desc.image.shader_layout = IL.ReadOnly; + } break; + default: assert(false, "Unimplemented usage"); + } desc.image.layout = IL.Undefined; } @@ -1427,7 +1430,7 @@ TransferReady() } bool -Transfer(bool image, T)(Descriptor* desc, T data) if(isArray!(T) || isPointer!(T)) +Transfer(bool image, T)(Descriptor* desc, T data_param) if(isArray!(T) || isPointer!(T)) { bool success = true; @@ -1435,11 +1438,13 @@ Transfer(bool image, T)(Descriptor* desc, T data) if(isArray!(T) || isPointer!(T static if(isArray!(T)) { - u64 data_length = cast(u64)(data.length * (*data.init.ptr).sizeof); + u64 data_length = cast(u64)(data_param.length * (*data_param.init.ptr).sizeof); + u8[] data = (cast(u8*)data_param.ptr)[0 .. data_length]; } else static if(isPointer!(T)) { u64 data_length = cast(u64)(*T).sizeof; + T* data = data_param; } u64 copied = 0; @@ -1458,7 +1463,7 @@ Transfer(bool image, T)(Descriptor* desc, T data) if(isArray!(T) || isPointer!(T vkCmdCopyBufferToImage(g_vk.imm_cmd, g_vk.transfer_buf.buffer, desc.image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©); - Transition(g_vk.imm_cmd, desc, IL.ReadOnly); + Transition(g_vk.imm_cmd, desc, desc.image.shader_layout); }; VkBufferImageCopy copy = { @@ -3395,3 +3400,4 @@ version(VULKAN_RENDERER_TEST) unittest } +