Advertisement
Guest User

Untitled

a guest
Jan 21st, 2025
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.90 KB | Source Code | 0 0
  1. void vk_cmd_buffers_compute_record(VkPipeline compute, VkPipelineLayout compute_layout, VkCommandBuffer compute_cmds, VkBuffer indirect_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_INDIRECT_COMMAND_READ_BIT,
  36.             .dstAccessMask = VK_ACCESS_NONE,
  37.             .srcQueueFamilyIndex = graphics_queue_index,
  38.             .dstQueueFamilyIndex = compute_queue_index,
  39.             .buffer = indirect_cmds,
  40.             .offset = 0,
  41.             .size = sizeof(VkDrawIndirectCommand) * PARTICLE_COUNT
  42.         };
  43.  
  44.         vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  45.     }
  46.  
  47.     if (graphics_queue_index != compute_queue_index)
  48.     {
  49.         VkBufferMemoryBarrier buffer_barrier =
  50.         {
  51.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  52.             .pNext = NULL,
  53.             .srcAccessMask =  VK_ACCESS_NONE,
  54.             .dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
  55.             .srcQueueFamilyIndex = graphics_queue_index,
  56.             .dstQueueFamilyIndex = compute_queue_index,
  57.             .buffer = compute_count,
  58.             .offset = 0,
  59.             .size = sizeof(uint32_t)
  60.         };
  61.  
  62.         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);
  63.     }
  64.  
  65.     uint32_t offset = 0;
  66.     vkCmdBindPipeline(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute);
  67.     vkCmdBindDescriptorSets(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute_layout, 0, 1, sets, 0, &offset);
  68.     vkCmdPushConstants(compute_cmds, compute_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(g), &g);
  69.  
  70.     vkCmdFillBuffer(compute_cmds, compute_count, 0, sizeof(uint32_t), 0);
  71.  
  72.     VkMemoryBarrier memory_barrier =
  73.     {
  74.         .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
  75.         .pNext = NULL,
  76.         .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
  77.         .dstAccessMask = VK_ACCESS_SHADER_READ_BIT
  78.     };
  79.  
  80.     vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_NONE, 1, &memory_barrier, 0, NULL, 0, NULL);
  81.  
  82.     vkCmdDispatch(compute_cmds, PARTICLE_COUNT / PARTICLE_DISPATCH_SIZE, 1, 1);
  83.  
  84.     if (graphics_queue_index != compute_queue_index)
  85.     {
  86.         VkBufferMemoryBarrier buffer_barrier =
  87.         {
  88.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  89.             .pNext = NULL,
  90.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  91.             .dstAccessMask = VK_ACCESS_NONE,
  92.             .srcQueueFamilyIndex = compute_queue_index,
  93.             .dstQueueFamilyIndex = graphics_queue_index,
  94.             .buffer = indirect_cmds,
  95.             .offset = 0,
  96.             .size = sizeof(VkDrawIndirectCommand) * PARTICLE_COUNT
  97.         };
  98.  
  99.         vkCmdPipelineBarrier(compute_cmds, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  100.     }
  101.  
  102.     if (graphics_queue_index != compute_queue_index)
  103.     {
  104.         VkBufferMemoryBarrier buffer_barrier =
  105.         {
  106.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  107.             .pNext = NULL,
  108.             .srcAccessMask =  VK_ACCESS_SHADER_WRITE_BIT,
  109.             .dstAccessMask = VK_ACCESS_NONE,
  110.             .srcQueueFamilyIndex = compute_queue_index,
  111.             .dstQueueFamilyIndex = graphics_queue_index,
  112.             .buffer = compute_count,
  113.             .offset = 0,
  114.             .size = sizeof(uint32_t)
  115.         };
  116.  
  117.         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);
  118.     }
  119.  
  120.     if (vkEndCommandBuffer(compute_cmds) != VK_SUCCESS)
  121.     {
  122.         printf("Failed to record compute command buffer\n");
  123.     }
  124. }
  125.  
  126. 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)
  127. {
  128.     if (graphics_queue_index != compute_queue_index)
  129.     {
  130.         VkBufferMemoryBarrier buffer_barrier =
  131.         {
  132.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  133.             .pNext = NULL,
  134.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  135.             .dstAccessMask = VK_ACCESS_NONE,
  136.             .srcQueueFamilyIndex = compute_queue_index,
  137.             .dstQueueFamilyIndex = graphics_queue_index,
  138.             .buffer = indirect_cmds,
  139.             .offset = 0,
  140.             .size = sizeof(VkDrawIndirectCommand) * PARTICLE_COUNT
  141.         };
  142.  
  143.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  144.     }
  145.  
  146.     if (graphics_queue_index != compute_queue_index)
  147.     {
  148.         VkBufferMemoryBarrier buffer_barrier =
  149.         {
  150.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  151.             .pNext = NULL,
  152.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  153.             .dstAccessMask = VK_ACCESS_NONE,
  154.             .srcQueueFamilyIndex = compute_queue_index,
  155.             .dstQueueFamilyIndex = graphics_queue_index,
  156.             .buffer = compute_count,
  157.             .offset = 0,
  158.             .size = sizeof(uint32_t)
  159.         };
  160.  
  161.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  162.     }
  163.  
  164.     uint32_t offset = 0;
  165.     vkCmdBindPipeline(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy);
  166.     vkCmdBindDescriptorSets(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy_layout, 0, 1, sets, 0, &offset);
  167.  
  168.     galaxy_info info =
  169.     {
  170.         .star_count = STAR_COUNT,
  171.         .time = glfwGetTime(),
  172.         .min_temp = 1900.0,
  173.         .max_temp = 50000.0,
  174.         .star_size = 10.0,
  175.         .dust_size = 500.0,
  176.         .h2size = 150.0,
  177.         .h2dist = 300.0
  178.     };
  179.  
  180.     vkCmdPushConstants(cmd_buffers, galaxy_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(info), &info);
  181.     /*vkCmdDraw(cmd_buffers, 6 * PARTICLE_COUNT, 1, 0, 0);
  182.     printf("Indirect cmds: %p, compute count: %p\n", (void *) indirect_cmds, (void *) compute_count);*/
  183.  
  184.     vkCmdDrawIndirectCount(cmd_buffers, indirect_cmds, 0, compute_count, 0, PARTICLE_COUNT, sizeof(VkDrawIndirectCommand));
  185.  
  186.     if (graphics_queue_index != compute_queue_index)
  187.     {
  188.         VkBufferMemoryBarrier buffer_barrier =
  189.         {
  190.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  191.             .pNext = NULL,
  192.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  193.             .dstAccessMask = VK_ACCESS_NONE,
  194.             .srcQueueFamilyIndex = graphics_queue_index,
  195.             .dstQueueFamilyIndex = compute_queue_index,
  196.             .buffer = indirect_cmds,
  197.             .offset = 0,
  198.             .size = sizeof(VkDrawIndirectCommand) * PARTICLE_COUNT
  199.         };
  200.  
  201.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  202.     }
  203.  
  204.     if (graphics_queue_index != compute_queue_index)
  205.     {
  206.         VkBufferMemoryBarrier buffer_barrier =
  207.         {
  208.             .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
  209.             .pNext = NULL,
  210.             .srcAccessMask = VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
  211.             .dstAccessMask = VK_ACCESS_NONE,
  212.             .srcQueueFamilyIndex = graphics_queue_index,
  213.             .dstQueueFamilyIndex = compute_queue_index,
  214.             .buffer = compute_count,
  215.             .offset = 0,
  216.             .size = sizeof(uint32_t)
  217.         };
  218.  
  219.         vkCmdPipelineBarrier(cmd_buffers, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, NULL, 1, &buffer_barrier, 0, NULL);
  220.     }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement