Chillzy

Untitled

Nov 6th, 2024
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.70 KB | Source Code | 0 0
  1. VkCommandBufferAllocateInfo vk_cmd_buffers_alloc_info_init(VkCommandPool cmd_pool, uint32_t cmd_buffer_count)
  2. {
  3.     VkCommandBufferAllocateInfo alloc_info =
  4.     {
  5.         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
  6.         .pNext = NULL,
  7.         .commandPool = cmd_pool,
  8.         .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
  9.         .commandBufferCount = cmd_buffer_count
  10.     };
  11.  
  12.     return alloc_info;
  13. }
  14.  
  15. VkCommandBufferBeginInfo vk_cmd_buffers_begin_info_init(VkCommandBufferUsageFlags flags)
  16. {
  17.     VkCommandBufferBeginInfo begin_info =
  18.     {
  19.         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
  20.         .pNext = NULL,
  21.         .flags = flags,
  22.         .pInheritanceInfo = NULL
  23.     };
  24.  
  25.     return begin_info;
  26. }
  27.  
  28. static VkRenderPassBeginInfo vk_cmd_buffers_render_pass_begin_info_init(vk_swapchain *s, uint32_t img_index, VkRenderPass render_pass)
  29. {
  30.     VkRenderPassBeginInfo render_pass_begin_info =
  31.     {
  32.         .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
  33.         .pNext = NULL,
  34.         .renderPass = render_pass,
  35.         .framebuffer = s->framebuffers[img_index],
  36.         .renderArea.offset = {0, 0},
  37.         .renderArea.extent = s->img_extent,
  38.         .clearValueCount = 2,
  39.         .pClearValues = s->clear_values
  40.     };
  41.  
  42.     return render_pass_begin_info;
  43. }
  44.  
  45. void vk_cmd_buffers_init(vk_device *d, VkCommandBuffer *cmd_buffers)
  46. {
  47.     VkCommandBufferAllocateInfo alloc_info = vk_cmd_buffers_alloc_info_init(d->graphics_cmd_pool, MAX_FRAMES_IN_FLIGHT);
  48.  
  49.     if (vkAllocateCommandBuffers(d->device, &alloc_info, cmd_buffers) != VK_SUCCESS)
  50.     {
  51.         printf("Failed to allocate command buffers\n");
  52.     }
  53. }
  54.  
  55. void vk_compute_cmds_record(VkPipeline compute, VkPipelineLayout compute_layout, VkCommandBuffer compute_cmds, VkDescriptorSet *sets)
  56. {
  57.     VkCommandBufferBeginInfo compute_cmds_begin_info = vk_cmd_buffers_begin_info_init(0);
  58.  
  59.     if (vkBeginCommandBuffer(compute_cmds, &compute_cmds_begin_info)!= VK_SUCCESS)
  60.     {
  61.         printf("Failed to begin recording compute command buffer\n");
  62.     }
  63.  
  64.     vkCmdBindPipeline(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute);
  65.  
  66.     galaxy_params g =
  67.     {
  68.         .particle_count = STAR_COUNT,
  69.         .max_rad = 3500.0,
  70.         .bulge_rad = 1250.0,
  71.         .angle = 6.28,
  72.         .eccentricity = 0.85,
  73.         .base_height = 300.0,
  74.         .height = 250.0,
  75.         .dust_temp = 4000.0,
  76.         .min_star_opacity = 0.1,
  77.         .max_star_opacity = 0.5,
  78.         .min_dust_opacity = 0.01,
  79.         .max_dust_opacity = 0.05,
  80.         .speed = 10.0
  81.     };
  82.  
  83.     uint32_t offset = 0;
  84.     vkCmdBindDescriptorSets(compute_cmds, VK_PIPELINE_BIND_POINT_COMPUTE, compute_layout, 0, 1, sets, 1, &offset);
  85.     vkCmdPushConstants(compute_cmds, compute_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(g), &g);
  86.  
  87.     vkCmdDispatch(compute_cmds, PARTICLE_COUNT / PARTICLE_DISPATCH_SIZE, 1, 1);
  88.  
  89.     if (vkEndCommandBuffer(compute_cmds) != VK_SUCCESS)
  90.     {
  91.         printf("Failed to record compute command buffer\n");
  92.     }
  93. }
  94.  
  95. void vk_galaxy_cmds_record(VkPipeline galaxy, VkPipelineLayout galaxy_layout, VkCommandBuffer cmd_buffers, VkDescriptorSet *sets)
  96. {
  97.     uint32_t offset = 0;
  98.     vkCmdBindPipeline(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy);
  99.     vkCmdBindDescriptorSets(cmd_buffers, VK_PIPELINE_BIND_POINT_GRAPHICS, galaxy_layout, 0, 1, sets, 1, &offset);
  100.  
  101.     galaxy_info info =
  102.     {
  103.         .star_count = STAR_COUNT,
  104.         .time = glfwGetTime(),
  105.         .min_temp = 3.60,
  106.         .max_temp = 100.0,
  107.         .star_size = 10.0,
  108.         .dust_size = 500.0,
  109.         .h2size = 150.0,
  110.         .h2dist = 300.0
  111.     };
  112.  
  113.     vkCmdPushConstants(cmd_buffers, galaxy_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(info), &info);
  114.     vkCmdDraw(cmd_buffers, 6 * PARTICLE_COUNT, 1, 0, 0);
  115. }
  116.  
  117. void vk_cmd_buffers_record(vk_swapchain *s, VkPipeline galaxy, VkPipelineLayout galaxy_layout, VkDescriptorSet *galaxy_sets, VkRenderPass render_pass, VkCommandBuffer cmd_buffers, uint32_t img_index)
  118. {
  119.     VkCommandBufferBeginInfo cmd_buffers_begin_info = vk_cmd_buffers_begin_info_init(0);
  120.  
  121.     if (vkBeginCommandBuffer(cmd_buffers, &cmd_buffers_begin_info)!= VK_SUCCESS)
  122.     {
  123.         printf("Failed to begin recording graphics command buffer\n");
  124.     }
  125.  
  126.     VkRenderPassBeginInfo render_pass_begin_info = vk_cmd_buffers_render_pass_begin_info_init(s, img_index, render_pass);
  127.  
  128.     vkCmdBeginRenderPass(cmd_buffers, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
  129.  
  130.     vk_galaxy_cmds_record(galaxy, galaxy_layout, cmd_buffers, galaxy_sets);
  131.  
  132.     vkCmdEndRenderPass(cmd_buffers);
  133.  
  134.     if (vkEndCommandBuffer(cmd_buffers) != VK_SUCCESS)
  135.     {
  136.         printf("Failed to record graphics command buffer\n");
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment