fix transfers/descriptor creation

This commit is contained in:
Matthew 2026-04-18 14:26:10 +10:00
parent 1df3f93a5f
commit 7bef66157b

View File

@ -1306,15 +1306,18 @@ CreateImageView(Descriptor* desc)
// TODO: also handle here // TODO: also handle here
VkCheck("CreateImageView failure: vkCreateImageView error", result); VkCheck("CreateImageView failure: vkCreateImageView error", result);
if(desc.image.usage == IU.Draw || desc.image.usage == IU.Depth || desc.image.usage == IU.Convert) switch(desc.image.usage)
{
case IU.Draw, IU.Depth, IU.Convert, IU.Storage:
{ {
desc.image.shader_layout = IL.General; desc.image.shader_layout = IL.General;
} } break;
else if(desc.image.usage == IU.Texture) case IU.Texture:
{ {
desc.image.shader_layout = IL.ReadOnly; desc.image.shader_layout = IL.ReadOnly;
} break;
default: assert(false, "Unimplemented usage");
} }
else assert(false, "Unimplemented usage");
desc.image.layout = IL.Undefined; desc.image.layout = IL.Undefined;
} }
@ -1427,7 +1430,7 @@ TransferReady()
} }
bool 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; bool success = true;
@ -1435,11 +1438,13 @@ Transfer(bool image, T)(Descriptor* desc, T data) if(isArray!(T) || isPointer!(T
static if(isArray!(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)) else static if(isPointer!(T))
{ {
u64 data_length = cast(u64)(*T).sizeof; u64 data_length = cast(u64)(*T).sizeof;
T* data = data_param;
} }
u64 copied = 0; 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, &copy); vkCmdCopyBufferToImage(g_vk.imm_cmd, g_vk.transfer_buf.buffer, desc.image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy);
Transition(g_vk.imm_cmd, desc, IL.ReadOnly); Transition(g_vk.imm_cmd, desc, desc.image.shader_layout);
}; };
VkBufferImageCopy copy = { VkBufferImageCopy copy = {
@ -3395,3 +3400,4 @@ version(VULKAN_RENDERER_TEST) unittest
} }