implement buffer uploads
This commit is contained in:
parent
2c58c198ea
commit
6dd98807ca
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user