diff --git a/src/renderer_vulkan.c b/src/renderer_vulkan.c index ed09162..9af2717 100644 --- a/src/renderer_vulkan.c +++ b/src/renderer_vulkan.c @@ -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; - - if (data_len == 0) - { - data_ptr = NULL; - data_len = 0; - i += 1; - } } 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; + transfer_size = 0; i += 1; } }