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; rawptr ptr = transfer->ptr;
u64 ptr_pos = 0; u64 ptr_pos = 0;
u64 transfer_size = 0;
VkDeviceSize offset = 0; VkDeviceSize offset = 0;
b32 imm_started = false; b32 imm_started = false;
u32 i = 0; u32 i = 0;
@ -1927,8 +1928,6 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
if (data_ptr == NULL) if (data_ptr == NULL)
{ {
data_ptr = transfers[i]->data;
if (transfers[i]->type == vTT_IMAGE) if (transfers[i]->type == vTT_IMAGE)
{ {
data_len = transfers[i]->w * transfers[i]->h * transfers[i]->ch; 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_len = transfers[i]->size;
} }
data_ptr = transfers[i]->data;
} }
if (ptr_pos == transfer->cap) if (ptr_pos == transfer->cap)
@ -1955,11 +1956,10 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
imm_started = true; imm_started = true;
} }
if (transfers[i]->type == vTT_NONE) {} if (transfers[i]->type != vTT_NONE)
else if (transfers[i]->type == vTT_IMAGE)
{ {
u64 remaining = Diff(TRANSFER_BUFFER_CAP, ptr_pos); u64 remaining = Diff(TRANSFER_BUFFER_CAP, ptr_pos);
u64 transfer_size = data_len; transfer_size = data_len;
if (transfer_size > remaining) if (transfer_size > remaining)
transfer_size = remaining; transfer_size = remaining;
@ -1968,7 +1968,10 @@ static void vTransferUpload(vTransfer **transfers, u32 count, u32 idx)
ptr = PtrAdd(ptr, transfer_size); ptr = PtrAdd(ptr, transfer_size);
PtrAddAdjustLen(data_ptr, data_len, transfer_size); PtrAddAdjustLen(data_ptr, data_len, transfer_size);
ptr_pos += transfer_size; ptr_pos += transfer_size;
}
if (transfers[i]->type == vTT_IMAGE)
{
MemZero(&transfers[i]->image_copy, sizeof(VkBufferImageCopy)); MemZero(&transfers[i]->image_copy, sizeof(VkBufferImageCopy));
transfers[i]->image_copy.bufferRowLength = transfers[i]->w; 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); VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
offset += (VkDeviceSize)transfer_size; 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) if (data_len == 0)
{ {
data_ptr = NULL; data_ptr = NULL;
data_len = 0; data_len = 0;
i += 1; transfer_size = 0;
}
}
else if (transfers[i]->type == vTT_BUFFER)
{
i += 1; i += 1;
} }
} }