Advertisement
Chillzy

Descriptors

Jan 7th, 2025
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.29 KB | Source Code | 0 0
  1. typedef struct
  2. {
  3.     VkDescriptorSetLayout layout;
  4.     VkDescriptorPool pool;
  5.     VkDescriptorSet sets[MAX_FRAMES_IN_FLIGHT];
  6.     vk_uniform compute_frustum[MAX_FRAMES_IN_FLIGHT];
  7.     vk_buffer compute_indirect_cmds[MAX_FRAMES_IN_FLIGHT], compute_count[MAX_FRAMES_IN_FLIGHT];
  8.     vk_buffer galaxy_particles[MAX_FRAMES_IN_FLIGHT];
  9.     vk_uniform graphics_camera[MAX_FRAMES_IN_FLIGHT], galaxy_camera[MAX_FRAMES_IN_FLIGHT];
  10. }   vk_desc_set;
  11.  
  12. VkDescriptorSetLayoutBinding vk_desc_set_layout_binding_init(uint32_t binding, VkDescriptorType type, uint32_t desc_count, VkShaderStageFlags stage)
  13. {
  14.     VkDescriptorSetLayoutBinding desc_set =
  15.     {
  16.         .binding = binding,
  17.         .descriptorType = type,
  18.         .descriptorCount = desc_count,
  19.         .stageFlags = stage,
  20.         .pImmutableSamplers = NULL
  21.     };
  22.  
  23.     return desc_set;
  24. }
  25.  
  26. static VkDescriptorSetLayoutCreateInfo vk_desc_set_layout_info_init(VkDescriptorSetLayoutBinding *binding, uint32_t binding_count)
  27. {
  28.     VkDescriptorSetLayoutCreateInfo layout_info =
  29.     {
  30.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
  31.         .pNext = NULL,
  32.         .flags = 0,
  33.         .bindingCount = binding_count,
  34.         .pBindings = binding
  35.     };
  36.  
  37.     return layout_info;
  38. }
  39.  
  40. static VkDescriptorSetLayout vk_desc_set_layout_init(vk_device *d, VkDescriptorSetLayoutBinding *binding, uint32_t binding_count)
  41. {
  42.     VkDescriptorSetLayout layout = {0};
  43.  
  44.     VkDescriptorSetLayoutCreateInfo layout_info = vk_desc_set_layout_info_init(binding, binding_count);
  45.  
  46.     if (vkCreateDescriptorSetLayout(d->device, &layout_info, NULL, &layout) != VK_SUCCESS)
  47.     {
  48.         printf("Failed to create descriptor set layout\n");
  49.     }
  50.  
  51.     return layout;
  52. }
  53.  
  54. void vk_desc_set_compute_update(vk_uniform *ub, camera *c, frustum *f)
  55. {
  56.     camera_frustum_init(c, f);
  57.     memcpy(ub->mapped, f->planes, sizeof(f->planes));
  58. }
  59.  
  60. void vk_desc_set_graphics_update(vk_uniform *ub, camera *c, VkExtent2D img_extent)
  61. {
  62.     c->camera = camera_buffer_init(c, img_extent);
  63.     memcpy(ub->mapped, &c->camera, sizeof(c->camera));
  64. }
  65.  
  66. void vk_desc_set_galaxy_update(vk_uniform *ub, camera *c, VkExtent2D img_extent)
  67. {
  68.     c->view = camera_view_mat_init(c);
  69.     c->camera = camera_buffer_init(c, img_extent);
  70.     mat4s mats[2] = {c->view, c->camera};
  71.     memcpy(ub->mapped, mats, sizeof(mats));
  72. }
  73.  
  74. VkDescriptorPoolSize vk_desc_set_pool_size_init(VkDescriptorType type, uint32_t descriptor_count)
  75. {
  76.     VkDescriptorPoolSize size =
  77.     {
  78.         .type = type,
  79.         .descriptorCount = descriptor_count
  80.     };
  81.  
  82.     return size;
  83. }
  84.  
  85. static VkDescriptorPoolCreateInfo vk_desc_set_pool_info_init(VkDescriptorPoolSize *size, uint32_t pool_count)
  86. {
  87.     VkDescriptorPoolCreateInfo pool_info =
  88.     {
  89.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
  90.         .pNext = NULL,
  91.         .flags = 0,
  92.         .maxSets = MAX_FRAMES_IN_FLIGHT,
  93.         .poolSizeCount = pool_count,
  94.         .pPoolSizes = size
  95.     };
  96.  
  97.     return pool_info;
  98. }
  99.  
  100. static VkDescriptorPool vk_desc_set_pool_init(vk_device *d, VkDescriptorPoolSize *size, uint32_t size_count)
  101. {
  102.     VkDescriptorPool pool = {0};
  103.  
  104.     VkDescriptorPoolCreateInfo pool_info = vk_desc_set_pool_info_init(size, size_count);
  105.  
  106.     if (vkCreateDescriptorPool(d->device, &pool_info, NULL, &pool) != VK_SUCCESS)
  107.     {
  108.         printf("Failed to create descriptor pool\n");
  109.     }
  110.  
  111.     return pool;
  112. }
  113.  
  114. static VkDescriptorSetAllocateInfo vk_desc_set_alloc_info_init(VkDescriptorPool pool, VkDescriptorSetLayout *layouts)
  115. {
  116.     VkDescriptorSetAllocateInfo alloc_info =
  117.     {
  118.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
  119.         .pNext = NULL,
  120.         .descriptorPool = pool,
  121.         .descriptorSetCount = MAX_FRAMES_IN_FLIGHT,
  122.         .pSetLayouts = layouts
  123.     };
  124.  
  125.     return alloc_info;
  126. }
  127.  
  128. static VkDescriptorBufferInfo vk_desc_set_buffer_info_init(VkBuffer buffer, uint32_t offset, size_t size)
  129. {
  130.     VkDescriptorBufferInfo buffer_info =
  131.     {
  132.         .buffer = buffer,
  133.         .offset = offset,
  134.         .range = size
  135.     };
  136.  
  137.     return buffer_info;
  138. }
  139.  
  140. static VkWriteDescriptorSet vk_desc_set_write_info_init(VkDescriptorSet set, uint32_t binding, VkDescriptorType type, VkDescriptorBufferInfo *buffer_info)
  141. {
  142.     VkWriteDescriptorSet write_info =
  143.     {
  144.         .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
  145.         .pNext = NULL,
  146.         .dstSet = set,
  147.         .dstBinding = binding,
  148.         .dstArrayElement = 0,
  149.         .descriptorCount = 1,
  150.         .descriptorType = type,
  151.         .pImageInfo = NULL,
  152.         .pBufferInfo = buffer_info,
  153.         .pTexelBufferView = NULL
  154.     };
  155.  
  156.     return write_info;
  157. }
  158.  
  159. void vk_desc_compute_sets_init(vk_device *d, vk_desc_set *ds, vk_desc_set *galaxy)
  160. {
  161.     VkDescriptorSetLayout layouts[MAX_FRAMES_IN_FLIGHT] = {0};
  162.  
  163.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  164.     {
  165.         layouts[i] = ds->layout;
  166.         ds->compute_frustum[i] = vk_uniform_buffer_init(d, sizeof(vec4s) * 6);
  167.         ds->compute_indirect_cmds[i] = vk_storage_buffer_init(d, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, sizeof(VkDrawIndirectCommand) * 6 * PARTICLE_COUNT);
  168.         ds->compute_count[i] = vk_storage_buffer_init(d, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, sizeof(uint32_t) * PARTICLE_COUNT);
  169.     }
  170.  
  171.     VkDescriptorSetAllocateInfo alloc_info = vk_desc_set_alloc_info_init(ds->pool, layouts);
  172.  
  173.     if (vkAllocateDescriptorSets(d->device, &alloc_info, ds->sets) != VK_SUCCESS)
  174.     {
  175.         printf("Failed to allocate compute descriptor sets\n");
  176.     }
  177.  
  178.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  179.     {
  180.         VkDescriptorBufferInfo uniform_info = vk_desc_set_buffer_info_init(ds->compute_frustum[i].b.buffer, 0, sizeof(vec4s) * 6);
  181.         VkWriteDescriptorSet uniform_write_info = vk_desc_set_write_info_init(ds->sets[i], 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniform_info);
  182.  
  183.         VkDescriptorBufferInfo storage_info = vk_desc_set_buffer_info_init(galaxy->galaxy_particles[i].buffer, 0, VK_WHOLE_SIZE);
  184.         VkWriteDescriptorSet storage_write_info = vk_desc_set_write_info_init(ds->sets[i], 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, &storage_info);
  185.  
  186.         VkDescriptorBufferInfo indirect_info = vk_desc_set_buffer_info_init(ds->compute_indirect_cmds[i].buffer, 0, VK_WHOLE_SIZE);
  187.         VkWriteDescriptorSet indirect_write_info = vk_desc_set_write_info_init(ds->sets[i], 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, &indirect_info);
  188.  
  189.         VkDescriptorBufferInfo count_info = vk_desc_set_buffer_info_init(ds->compute_count[i].buffer, 0, VK_WHOLE_SIZE);
  190.         VkWriteDescriptorSet count_write_info = vk_desc_set_write_info_init(ds->sets[i], 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, &count_info);
  191.  
  192.         VkWriteDescriptorSet desc_writes[4] = {uniform_write_info, storage_write_info, indirect_write_info, count_write_info};
  193.  
  194.         vkUpdateDescriptorSets(d->device, 4, desc_writes, 0, NULL);
  195.     }
  196. }
  197.  
  198. void vk_desc_graphics_sets_init(vk_device *d, vk_desc_set *ds)
  199. {
  200.     VkDescriptorSetLayout layouts[MAX_FRAMES_IN_FLIGHT] = {0};
  201.  
  202.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  203.     {
  204.         layouts[i] = ds->layout;
  205.         ds->graphics_camera[i] = vk_uniform_buffer_init(d, sizeof(mat4s));
  206.     }
  207.  
  208.     VkDescriptorSetAllocateInfo alloc_info = vk_desc_set_alloc_info_init(ds->pool, layouts);
  209.  
  210.     if (vkAllocateDescriptorSets(d->device, &alloc_info, ds->sets) != VK_SUCCESS)
  211.     {
  212.         printf("Failed to allocate graphics descriptor sets\n");
  213.     }
  214.  
  215.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  216.     {
  217.         VkDescriptorBufferInfo uniform_info = vk_desc_set_buffer_info_init(ds->graphics_camera[i].b.buffer, 0, sizeof(mat4s));
  218.         VkWriteDescriptorSet uniform_write_info = vk_desc_set_write_info_init(ds->sets[i], 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniform_info);
  219.  
  220.         vkUpdateDescriptorSets(d->device, 1, &uniform_write_info, 0, NULL);
  221.     }
  222. }
  223.  
  224. void vk_desc_galaxy_sets_init(vk_device *d, vk_desc_set *ds)
  225. {
  226.     VkDescriptorSetLayout layouts[MAX_FRAMES_IN_FLIGHT] = {0};
  227.  
  228.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  229.     {
  230.         layouts[i] = ds->layout;
  231.         ds->galaxy_camera[i] = vk_uniform_buffer_init(d, sizeof(galaxy_camera));
  232.         ds->galaxy_particles[i] = vk_storage_buffer_init(d, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, sizeof(galaxy_particle) * PARTICLE_COUNT);
  233.     }
  234.  
  235.     VkDescriptorSetAllocateInfo alloc_info = vk_desc_set_alloc_info_init(ds->pool, layouts);
  236.  
  237.     if (vkAllocateDescriptorSets(d->device, &alloc_info, ds->sets) != VK_SUCCESS)
  238.     {
  239.         printf("Failed to allocate galaxy descriptor sets\n");
  240.     }
  241.  
  242.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  243.     {
  244.         VkDescriptorBufferInfo uniform_info = vk_desc_set_buffer_info_init(ds->galaxy_camera[i].b.buffer, 0, sizeof(galaxy_camera));
  245.         VkWriteDescriptorSet uniform_write_info = vk_desc_set_write_info_init(ds->sets[i], 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniform_info);
  246.  
  247.         VkDescriptorBufferInfo storage_info = vk_desc_set_buffer_info_init(ds->galaxy_particles[i].buffer, 0, VK_WHOLE_SIZE);
  248.         VkWriteDescriptorSet storage_write_info = vk_desc_set_write_info_init(ds->sets[i], 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, &storage_info);
  249.  
  250.         VkWriteDescriptorSet desc_writes[2] = {uniform_write_info, storage_write_info};
  251.  
  252.         vkUpdateDescriptorSets(d->device, 2, desc_writes, 0, NULL);
  253.     }
  254. }
  255.  
  256. vk_desc_set vk_desc_set_init(vk_device *d, VkDescriptorSetLayoutBinding *binding, uint32_t binding_count, VkDescriptorPoolSize *size, uint32_t size_count)
  257. {
  258.     vk_desc_set ds =
  259.     {
  260.         .layout = vk_desc_set_layout_init(d, binding, binding_count),
  261.         .pool = vk_desc_set_pool_init(d, size, size_count)
  262.     };
  263.  
  264.     return ds;
  265. }
  266.  
  267. static void vk_desc_set_layout_destroy(vk_device *d, VkDescriptorSetLayout layout)
  268. {
  269.     vkDestroyDescriptorSetLayout(d->device, layout, NULL);
  270. }
  271.  
  272. static void vk_desc_set_pool_destroy(vk_device *d, VkDescriptorPool pool)
  273. {
  274.     vkDestroyDescriptorPool(d->device, pool, NULL);
  275. }
  276.  
  277. void vk_desc_set_destroy(vk_device *d, vk_desc_set *ds)
  278. {
  279.    vk_desc_set_layout_destroy(d, ds->layout);
  280.    vk_desc_set_pool_destroy(d, ds->pool);
  281.  
  282.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  283.     {
  284.         vkDestroyBuffer(d->device, ds->compute_frustum[i].b.buffer, NULL);
  285.         vkFreeMemory(d->device, ds->compute_frustum[i].b.memory, NULL);
  286.  
  287.         vkDestroyBuffer(d->device, ds->compute_indirect_cmds[i].buffer, NULL);
  288.         vkFreeMemory(d->device, ds->compute_indirect_cmds[i].memory, NULL);
  289.  
  290.         vkDestroyBuffer(d->device, ds->compute_count[i].buffer, NULL);
  291.         vkFreeMemory(d->device, ds->compute_count[i].memory, NULL);
  292.  
  293.         vkDestroyBuffer(d->device, ds->galaxy_particles[i].buffer, NULL);
  294.         vkFreeMemory(d->device, ds->galaxy_particles[i].memory, NULL);
  295.  
  296.         vkDestroyBuffer(d->device, ds->graphics_camera[i].b.buffer, NULL);
  297.         vkFreeMemory(d->device, ds->graphics_camera[i].b.memory, NULL);
  298.  
  299.         vkDestroyBuffer(d->device, ds->galaxy_camera[i].b.buffer, NULL);
  300.         vkFreeMemory(d->device, ds->galaxy_camera[i].b.memory, NULL);
  301.     }
  302.  
  303.    ds = NULL;
  304. }
  305.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement