Advertisement
Guest User

Untitled

a guest
Jan 14th, 2025
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.78 KB | Source Code | 0 0
  1. void vk_cmd_buffers_compute_record(VkPipeline compute, VkPipelineLayout compute_layout, VkCommandBuffer compute_cmds, VkBuffer compute_count, uint32_t graphics_queue_index, uint32_t compute_queue_index, VkDescriptorSet *sets)
  2. {
  3.     VkCommandBufferBeginInfo compute_cmds_begin_info = vk_cmd_buffers_begin_info_init(0);
  4.  
  5.     if (vkBeginCommandBuffer(compute_cmds, &compute_cmds_begin_info)!= VK_SUCCESS)
  6.     {
  7.         printf("Failed to begin recording compute command buffer\n");
  8.     }
  9.  
  10.     galaxy_params g =
  11.     {
  12.         .star_count = STAR_COUNT,
  13.         .max_rad = 3500.0,
  14.         .bulge_rad = 1250.0,
  15.         .angle = 6.28,
  16.         .eccentricity = 0.85,
  17.         .base_height = 300.0,
  18.         .height = 250.0,
  19.         .dust_temp = 4000.0,
  20.         .min_temp = 1900.0,
  21.         .max_temp = 50000.0,
  22.         .min_star_opacity = 0.1,
  23.         .max_star_opacity = 0.5,
  24.         .min_dust_opacity = 0.01,
  25.         .max_dust_opacity = 0.05,
  26.         .speed = 10.0
  27.     };
  28.  
  29.     if (graphics_queue_index != compute_queue_index)
  30.     {
  31.         VkBufferMemoryBarrier buffer_barrier =
  32.         {
  33.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  34.             .pNext = NULL,
  35.             .srcAccessMask =  VK_ACCESS_NONE,
  36.             .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
  37.             .srcQueueFamilyIndex = graphics_queue_index,
  38.             .dstQueueFamilyIndex = compute_queue_index,
  39.             .buffer = compute_count,
  40.             .offset = 0,
  41.             .size = sizeof(uint32_t)
  42.         };
  43.  
  44.         vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_NONE, 0, NULL, 1, &buffer_barrier, 0, NULL);
  45.     }
  46.  
  47.     uint32_t offsets[2] = {0, 0};
  48.     vkCmdBindPipeline(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute);
  49.     vkCmdBindDescriptorSets(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute_layout, 0, 1, sets, 2, offsets);
  50.     vkCmdPushConstants(compute_cmds, compute_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(g), &g);
  51.  
  52.     vkCmdFillBuffer(compute_cmds, compute_count, 0, sizeof(uint32_t), 0);
  53.  
  54.     VkMemoryBarrier memory_barrier =
  55.     {
  56.         .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
  57.         .pNext = NULL,
  58.         .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
  59.         .dstAccessMask = VK_ACCESS_SHADER_READ_BIT
  60.     };
  61.  
  62.     vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_NONE, 1, &memory_barrier, 0, NULL, 0, NULL);
  63.  
  64.     vkCmdDispatch(compute_cmds, PARTICLE_COUNT / PARTICLE_DISPATCH_SIZE, 1, 1);
  65.  
  66.     if (graphics_queue_index != compute_queue_index)
  67.     {
  68.         VkBufferMemoryBarrier buffer_barrier =
  69.         {
  70.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  71.             .pNext = NULL,
  72.             .srcAccessMask =  VK_ACCESS_SHADER_WRITE_BIT,
  73.             .dstAccessMask = VK_ACCESS_NONE,
  74.             .srcQueueFamilyIndex = compute_queue_index,
  75.             .dstQueueFamilyIndex = graphics_queue_index,
  76.             .buffer = compute_count,
  77.             .offset = 0,
  78.             .size = sizeof(uint32_t)
  79.         };
  80.  
  81.         vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_NONE, 0, NULL, 1, &buffer_barrier, 0, NULL);
  82.     }
  83.  
  84.     if (vkEndCommandBuffer(compute_cmds) != VK_SUCCESS)
  85.     {
  86.         printf("Failed to record compute command buffer\n");
  87.     }
  88. }
  89.  
  90. static void vk_cmd_buffers_galaxy_record(VkPipeline galaxy, VkPipelineLayout galaxy_layout, VkCommandBuffer cmd_buffers, VkBuffer indirect_cmds, VkBuffer compute_count, uint32_t graphics_queue_index, uint32_t compute_queue_index, VkDescriptorSet *sets)
  91. {
  92.     if (graphics_queue_index != compute_queue_index)
  93.     {
  94.         VkBufferMemoryBarrier buffer_barrier =
  95.         {
  96.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  97.             .pNext = NULL,
  98.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  99.             .dstAccessMask = VK_ACCESS_NONE,
  100.             .srcQueueFamilyIndex = compute_queue_index,
  101.             .dstQueueFamilyIndex = graphics_queue_index,
  102.             .buffer = indirect_cmds,
  103.             .offset = 0,
  104.             .size = VK_WHOLE_SIZE
  105.         };
  106.  
  107.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  108.     }
  109.  
  110.     uint32_t offset = 0;
  111.     vkCmdBindPipeline(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy);
  112.     vkCmdBindDescriptorSets(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy_layout, 0, 1, sets, 1, &offset);
  113.  
  114.     galaxy_info info =
  115.     {
  116.         .star_count = STAR_COUNT,
  117.         .time = glfwGetTime(),
  118.         .min_temp = 1900.0,
  119.         .max_temp = 50000.0,
  120.         .star_size = 10.0,
  121.         .dust_size = 500.0,
  122.         .h2size = 150.0,
  123.         .h2dist = 300.0
  124.     };
  125.  
  126.     vkCmdPushConstants(cmd_buffers, galaxy_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(info), &info);
  127.     vkCmdDrawIndirectCount(cmd_buffers, indirect_cmds, 0, compute_count, 0, 6 * PARTICLE_COUNT, sizeof(VkDrawIndirectCommand));
  128.  
  129.     if (graphics_queue_index != compute_queue_index)
  130.     {
  131.         VkBufferMemoryBarrier buffer_barrier =
  132.         {
  133.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  134.             .pNext = NULL,
  135.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  136.             .dstAccessMask = VK_ACCESS_NONE,
  137.             .srcQueueFamilyIndex = graphics_queue_index,
  138.             .dstQueueFamilyIndex = compute_queue_index,
  139.             .buffer = indirect_cmds,
  140.             .offset = 0,
  141.             .size = VK_WHOLE_SIZE
  142.         };
  143.  
  144.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  145.     }
  146. }
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement