implement buffer uploads

This commit is contained in:
Matthew 2025-05-11 18:33:34 +10:00
parent 2c58c198ea
commit 6dd98807ca

View File

@ -1917,6 +1917,7 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
rawptr ptr = transfer->ptr;
u64 ptr_pos = 0;
u64 transfer_size = 0;
VkDeviceSize offset = 0;
b32 imm_started = false;
u32 i = 0;
@ -1927,8 +1928,6 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
if (data_ptr == NULL)
{
data_ptr = transfers[i]->data;
if (transfers[i]->type == vTT_IMAGE)
{
data_len = transfers[i]->w * transfers[i]->h * transfers[i]->ch;
@ -1937,6 +1936,8 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
{
data_len = transfers[i]->size;
}
data_ptr = transfers[i]->data;
}
if (ptr_pos == transfer->cap)
@ -1955,11 +1956,10 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
imm_started = true;
}
if (transfers[i]->type == vTT_NONE) {}
else if (transfers[i]->type == vTT_IMAGE)
if (transfers[i]->type != vTT_NONE)
{
u64 remaining = Diff(TRANSFER_BUFFER_CAP, ptr_pos);
u64 transfer_size = data_len;
transfer_size = data_len;
if (transfer_size > remaining)
transfer_size = remaining;
@ -1968,7 +1968,10 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
ptr = PtrAdd(ptr, transfer_size);
PtrAddAdjustLen(data_ptr, data_len, transfer_size);
ptr_pos += transfer_size;
}
if (transfers[i]->type == vTT_IMAGE)
{
MemZero(&transfers[i]->image_copy, sizeof(VkBufferImageCopy));
transfers[i]->image_copy.bufferRowLength = transfers[i]->w;
@ -1998,16 +2001,24 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
offset += (VkDeviceSize)transfer_size;
}
else if (transfers[i]->type == vTT_BUFFER)
{
transfers[i]->buffer_copy.srcOffset = offset;
transfers[i]->buffer_copy.dstOffset = cast(VkDeviceSize, 0);
transfers[i]->buffer_copy.size = transfer_size;
// TODO: batch buffer types into one vulkan command
vkCmdCopyBuffer(buffer, transfer->alloc.buffer, transfers[i]->buffer, 1, &transfers[i]->buffer_copy);
offset += cast(VkDeviceSize, transfer_size);
}
if (data_len == 0)
{
data_ptr = NULL;
data_len = 0;
i += 1;
}
}
else if (transfers[i]->type == vTT_BUFFER)
{
transfer_size = 0;
i += 1;
}
}