Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void QuickDirtyUpload(vk::PhysicalDevice *physical_device, vk::Device *device, vk::Queue *queue, VkCommandBuffer command_buffer, uint32_t count, VkImage const *images, VkImageLayout initial_layout, VkImageLayout final_layout, VkExtent3D const *extents, size_t const *sizes, void const **data)
- {
- VkFence transfer_fence = VK_NULL_HANDLE;
- VkDeviceMemory staging_memory = VK_NULL_HANDLE;
- VkBuffer staging_buffer = VK_NULL_HANDLE;
- VkDeviceSize staging_size = 0;
- VkDeviceSize *offsets = Reserve<VkDeviceSize>(count);
- VkImageMemoryBarrier *IMB0s = Reserve<VkImageMemoryBarrier>(count);
- VkImageMemoryBarrier *IMB1s = Reserve<VkImageMemoryBarrier>(count);
- for (uint32_t i = 0; i < count; ++i)
- {
- IMB0s[i] ={
- VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
- 0, VK_ACCESS_TRANSFER_WRITE_BIT,
- initial_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
- images[i], { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
- };
- IMB1s[i] ={
- VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
- VK_ACCESS_TRANSFER_WRITE_BIT, 0,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, final_layout,
- VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
- images[i], { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
- };
- }
- for (uint32_t i = 0; i < count; ++i)
- {
- offsets[i] = staging_size;
- staging_size += sizes[i];
- }
- VK_CALL(vk::CreateFence(device, &transfer_fence, VK_FALSE));
- VK_CALL(vk::CreateBufferAndMemory(physical_device, device, staging_size,
- VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_TRUE,
- &staging_memory, &staging_buffer));
- {
- uintptr_t staging_pointer = 0;
- VK_CALL(device->vkMapMemory(*device, staging_memory, 0, VK_WHOLE_SIZE, 0, (void **)&staging_pointer));
- for (uint32_t i = 0; i < count; ++i)
- {
- memcpy((void *)(staging_pointer + offsets[i]), data[i], sizes[i]);
- }
- device->vkUnmapMemory(*device, staging_memory);
- }
- VK_CALL(vk::BeginPrimaryCommandBuffer(device, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, command_buffer));
- device->vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, count, IMB0s);
- for (uint32_t i = 0; i < count; ++i)
- {
- VkBufferImageCopy region ={ offsets[i], 0, 0, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }, { 0, 0, 0 }, extents[i], };
- device->vkCmdCopyBufferToImage(command_buffer, staging_buffer, images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
- }
- device->vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, count, IMB1s);
- VK_CALL(device->vkEndCommandBuffer(command_buffer));
- VK_CALL(vk::QueueSubmit(device, queue, { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &command_buffer, 0, nullptr, }, transfer_fence));
- VK_CALL(device->vkWaitForFences(*device, 1, &transfer_fence, VK_TRUE, UINT64_MAX));
- vk::FreeMemory(device, staging_memory);
- vk::DestroyBuffer(device, staging_buffer);
- vk::DestroyFence(device, transfer_fence);
- Release(IMB1s);
- Release(IMB0s);
- Release(offsets);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement