Chillzy

Untitled

Nov 6th, 2024
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.15 KB | Source Code | 0 0
  1. typedef struct
  2. {
  3.     VkBuffer buffer;
  4.     VkDeviceMemory memory;
  5. }   vk_buffer;
  6.  
  7. typedef struct
  8. {
  9.     vk_buffer b;
  10.     void *mapped;
  11. }   vk_uniform;
  12.  
  13. static VkBuffer vk_buffer_create(vk_device *d, VkBufferUsageFlags usage, size_t size)
  14. {
  15.     VkBuffer buffer = {0};
  16.  
  17.     uint32_t queue_families[2] = {d->indices.graphics.index, d->indices.transfer.index};
  18.     uint32_t queue_family_count = 2;
  19.     bool separate_queues = (d->indices.graphics.index != d->indices.transfer.index) ? 1 : 0;
  20.  
  21.     VkBufferCreateInfo buffer_info = vk_buffer_info_init(separate_queues, queue_families, queue_family_count, usage, size);
  22.  
  23.     if (vkCreateBuffer(d->device, &buffer_info, NULL, &buffer) != VK_SUCCESS)
  24.     {
  25.         printf("Failed to create buffer\n");
  26.     }
  27.  
  28.     return buffer;
  29. }
  30.  
  31. static VkDeviceMemory vk_buffer_memory_init(vk_device *d, VkBuffer buffer, VkMemoryPropertyFlags properties)
  32. {
  33.     VkDeviceMemory memory = {0};
  34.  
  35.     VkMemoryRequirements mem_requirements = {0};
  36.     vkGetBufferMemoryRequirements(d->device, buffer, &mem_requirements);
  37.  
  38.     VkMemoryAllocateInfo alloc_info = vk_memory_alloc_info_init(d, mem_requirements, properties);
  39.  
  40.     if (vkAllocateMemory(d->device, &alloc_info, NULL, &memory) != VK_SUCCESS)
  41.     {
  42.         printf("Failed to allocate vertex buffer memory\n");
  43.     }
  44.  
  45.     if (vkBindBufferMemory(d->device, buffer, memory, 0) != VK_SUCCESS)
  46.     {
  47.         printf("Failed to bind buffer memory\n");
  48.     }
  49.  
  50.     return memory;
  51. }
  52.  
  53. static vk_buffer vk_buffer_init(vk_device *d, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, size_t size)
  54. {
  55.     vk_buffer b =
  56.     {
  57.         .buffer = vk_buffer_create(d, usage, size),
  58.         .memory = vk_buffer_memory_init(d, b.buffer, properties)
  59.     };
  60.  
  61.     return b;
  62. }
  63.  
  64. vk_uniform vk_uniform_buffer_init(vk_device *d, size_t ub_size)
  65. {
  66.     vk_uniform ub = {0};
  67.     ub.b = vk_buffer_init(d, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, ub_size);
  68.  
  69.     vkMapMemory(d->device, ub.b.memory, 0, ub_size, 0, &ub.mapped);
  70.  
  71.     return ub;
  72. }
  73.  
  74. vk_buffer vk_storage_buffer_init(vk_device *d)
  75. {
  76.     vk_buffer sb = vk_buffer_init(d, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, sizeof(galaxy_particle) * PARTICLE_COUNT); // galaxy_particle = 32 bytes
  77.  
  78.     return sb;
  79. }
  80.  
  81. typedef struct
  82. {
  83.     VkDescriptorSetLayout layout;
  84.     VkDescriptorPool pool;
  85.     VkDescriptorSet sets[MAX_FRAMES_IN_FLIGHT];
  86.     vk_buffer particles[MAX_FRAMES_IN_FLIGHT];
  87.     vk_uniform camera[MAX_FRAMES_IN_FLIGHT];
  88. }   vk_desc_set;
  89.  
  90. VkDescriptorSetLayoutBinding vk_desc_set_layout_binding_init(uint32_t binding, VkDescriptorType type, uint32_t desc_count, VkShaderStageFlags stage)
  91. {
  92.     VkDescriptorSetLayoutBinding desc_set =
  93.     {
  94.         .binding = binding,
  95.         .descriptorType = type,
  96.         .descriptorCount = desc_count,
  97.         .stageFlags = stage,
  98.         .pImmutableSamplers = NULL
  99.     };
  100.  
  101.     return desc_set;
  102. }
  103.  
  104. static VkDescriptorSetLayoutCreateInfo vk_desc_set_layout_info_init(VkDescriptorSetLayoutBinding *binding, uint32_t binding_count)
  105. {
  106.     VkDescriptorSetLayoutCreateInfo layout_info =
  107.     {
  108.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
  109.         .pNext = NULL,
  110.         .flags = 0,
  111.         .bindingCount = binding_count,
  112.         .pBindings = binding
  113.     };
  114.  
  115.     return layout_info;
  116. }
  117.  
  118. static VkDescriptorSetLayout vk_desc_set_layout_init(vk_device *d, VkDescriptorSetLayoutBinding *binding, uint32_t binding_count)
  119. {
  120.     VkDescriptorSetLayout layout = {0};
  121.  
  122.     VkDescriptorSetLayoutCreateInfo layout_info = vk_desc_set_layout_info_init(binding, binding_count);
  123.  
  124.     if (vkCreateDescriptorSetLayout(d->device, &layout_info, NULL, &layout) != VK_SUCCESS)
  125.     {
  126.         printf("Failed to create descriptor set layout\n");
  127.     }
  128.  
  129.     return layout;
  130. }
  131.  
  132. // Updates camera position; camera code not necessary for this problem
  133. void vk_desc_set_update(vk_uniform *ub, camera *c, VkExtent2D img_extent)
  134. {
  135.     c->camera = camera_buffer_init(c, img_extent);
  136.     memcpy(ub->mapped, &c->camera, sizeof(c->camera));
  137. }
  138.  
  139. VkDescriptorPoolSize vk_desc_set_pool_size_init(VkDescriptorType type, uint32_t descriptor_count)
  140. {
  141.     VkDescriptorPoolSize size =
  142.     {
  143.         .type = type,
  144.         .descriptorCount = descriptor_count
  145.     };
  146.  
  147.     return size;
  148. }
  149.  
  150. static VkDescriptorPoolCreateInfo vk_desc_set_pool_info_init(VkDescriptorPoolSize *size, uint32_t pool_count)
  151. {
  152.     VkDescriptorPoolCreateInfo pool_info =
  153.     {
  154.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
  155.         .pNext = NULL,
  156.         .flags = 0,
  157.         .maxSets = MAX_FRAMES_IN_FLIGHT,
  158.         .poolSizeCount = pool_count,
  159.         .pPoolSizes = size
  160.     };
  161.  
  162.     return pool_info;
  163. }
  164.  
  165. static VkDescriptorPool vk_desc_set_pool_init(vk_device *d, VkDescriptorPoolSize *size, uint32_t size_count)
  166. {
  167.     VkDescriptorPool pool = {0};
  168.  
  169.     VkDescriptorPoolCreateInfo pool_info = vk_desc_set_pool_info_init(size, size_count);
  170.  
  171.     if (vkCreateDescriptorPool(d->device, &pool_info, NULL, &pool) != VK_SUCCESS)
  172.     {
  173.         printf("Failed to create descriptor pool\n");
  174.     }
  175.  
  176.     return pool;
  177. }
  178.  
  179. static VkDescriptorSetAllocateInfo vk_desc_set_alloc_info_init(VkDescriptorPool pool, VkDescriptorSetLayout *layouts)
  180. {
  181.     VkDescriptorSetAllocateInfo alloc_info =
  182.     {
  183.         .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
  184.         .pNext = NULL,
  185.         .descriptorPool = pool,
  186.         .descriptorSetCount = MAX_FRAMES_IN_FLIGHT,
  187.         .pSetLayouts = layouts
  188.     };
  189.  
  190.     return alloc_info;
  191. }
  192.  
  193. static VkDescriptorBufferInfo vk_desc_set_buffer_info_init(VkBuffer buffer, uint32_t offset, size_t size)
  194. {
  195.     VkDescriptorBufferInfo buffer_info =
  196.     {
  197.         .buffer = buffer,
  198.         .offset = offset,
  199.         .range = size
  200.     };
  201.  
  202.     return buffer_info;
  203. }
  204.  
  205. static VkWriteDescriptorSet vk_desc_set_write_info_init(VkDescriptorSet set, uint32_t binding, VkDescriptorType type, VkDescriptorBufferInfo *buffer_info)
  206. {
  207.     VkWriteDescriptorSet write_info =
  208.     {
  209.         .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
  210.         .pNext = NULL,
  211.         .dstSet = set,
  212.         .dstBinding = binding,
  213.         .dstArrayElement = 0,
  214.         .descriptorCount = 1,
  215.         .descriptorType = type,
  216.         .pImageInfo = NULL,
  217.         .pBufferInfo = buffer_info,
  218.         .pTexelBufferView = NULL
  219.     };
  220.  
  221.     return write_info;
  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->camera[i] = vk_uniform_buffer_init(d, sizeof(mat4s));
  232.         ds->particles[i] = vk_storage_buffer_init(d);
  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->camera[i].b.buffer, 0, sizeof(mat4s));
  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->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. void vk_desc_compute_sets_init(vk_device *d, vk_desc_set *ds)
  257. {
  258.     VkDescriptorSetLayout layouts[MAX_FRAMES_IN_FLIGHT] = {0};
  259.  
  260.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  261.     {
  262.         layouts[i] = ds->layout;
  263.         ds->particles[i] = vk_storage_buffer_init(d);
  264.     }
  265.  
  266.     VkDescriptorSetAllocateInfo alloc_info = vk_desc_set_alloc_info_init(ds->pool, layouts);
  267.  
  268.     if (vkAllocateDescriptorSets(d->device, &alloc_info, ds->sets) != VK_SUCCESS)
  269.     {
  270.         printf("Failed to allocate compute descriptor sets\n");
  271.     }
  272.  
  273.     for (uint32_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
  274.     {
  275.         VkDescriptorBufferInfo storage_info = vk_desc_set_buffer_info_init(ds->particles[i].buffer, 0, VK_WHOLE_SIZE);
  276.         VkWriteDescriptorSet storage_write_info = vk_desc_set_write_info_init(ds->sets[i], 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, &storage_info);
  277.  
  278.         vkUpdateDescriptorSets(d->device, 1, &storage_write_info, 0, NULL);
  279.     }
  280. }
  281.  
  282. vk_desc_set vk_desc_set_init(vk_device *d, VkDescriptorSetLayoutBinding *binding, uint32_t binding_count, VkDescriptorPoolSize *size, uint32_t size_count)
  283. {
  284.     vk_desc_set ds =
  285.     {
  286.         .layout = vk_desc_set_layout_init(d, binding, binding_count),
  287.         .pool = vk_desc_set_pool_init(d, size, size_count)
  288.     };
  289.  
  290.     return ds;
  291. }
  292.  
Advertisement
Add Comment
Please, Sign In to add comment