Advertisement
Guest User

SO Question Relevant Code

a guest
Mar 15th, 2022
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 KB | None | 0 0
  1. 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)
  2. {
  3.     VkFence               transfer_fence = VK_NULL_HANDLE;
  4.     VkDeviceMemory        staging_memory = VK_NULL_HANDLE;
  5.     VkBuffer              staging_buffer = VK_NULL_HANDLE;
  6.     VkDeviceSize          staging_size   = 0;
  7.     VkDeviceSize         *offsets        = Reserve<VkDeviceSize>(count);
  8.     VkImageMemoryBarrier *IMB0s          = Reserve<VkImageMemoryBarrier>(count);
  9.     VkImageMemoryBarrier *IMB1s          = Reserve<VkImageMemoryBarrier>(count);
  10.     for (uint32_t i = 0; i < count; ++i)
  11.     {
  12.         IMB0s[i] ={
  13.             VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
  14.             0, VK_ACCESS_TRANSFER_WRITE_BIT,
  15.             initial_layout, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
  16.             VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
  17.             images[i], { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
  18.         };
  19.         IMB1s[i] ={
  20.             VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, nullptr,
  21.             VK_ACCESS_TRANSFER_WRITE_BIT, 0,
  22.             VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, final_layout,
  23.             VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,
  24.             images[i], { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 },
  25.         };
  26.     }
  27.  
  28.     for (uint32_t i = 0; i < count; ++i)
  29.     {
  30.         offsets[i] = staging_size;
  31.         staging_size += sizes[i];
  32.     }
  33.     VK_CALL(vk::CreateFence(device, &transfer_fence, VK_FALSE));
  34.     VK_CALL(vk::CreateBufferAndMemory(physical_device, device, staging_size,
  35.         VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_TRUE,
  36.         &staging_memory, &staging_buffer));
  37.     {
  38.         uintptr_t staging_pointer = 0;
  39.         VK_CALL(device->vkMapMemory(*device, staging_memory, 0, VK_WHOLE_SIZE, 0, (void **)&staging_pointer));
  40.         for (uint32_t i = 0; i < count; ++i)
  41.         {
  42.             memcpy((void *)(staging_pointer + offsets[i]), data[i], sizes[i]);
  43.         }
  44.         device->vkUnmapMemory(*device, staging_memory);
  45.     }
  46.     VK_CALL(vk::BeginPrimaryCommandBuffer(device, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, command_buffer));
  47.     device->vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, count, IMB0s);
  48.     for (uint32_t i = 0; i < count; ++i)
  49.     {
  50.         VkBufferImageCopy region ={ offsets[i], 0, 0, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }, { 0, 0, 0 }, extents[i], };
  51.         device->vkCmdCopyBufferToImage(command_buffer, staging_buffer, images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
  52.     }
  53.     device->vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, count, IMB1s);
  54.     VK_CALL(device->vkEndCommandBuffer(command_buffer));
  55.     VK_CALL(vk::QueueSubmit(device, queue, { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &command_buffer, 0, nullptr, }, transfer_fence));
  56.     VK_CALL(device->vkWaitForFences(*device, 1, &transfer_fence, VK_TRUE, UINT64_MAX));
  57.     vk::FreeMemory(device, staging_memory);
  58.     vk::DestroyBuffer(device, staging_buffer);
  59.     vk::DestroyFence(device, transfer_fence);
  60.     Release(IMB1s);
  61.     Release(IMB0s);
  62.     Release(offsets);
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement