summaryrefslogtreecommitdiffstats
path: root/src/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/render.c')
-rw-r--r--src/render.c121
1 files changed, 107 insertions, 14 deletions
diff --git a/src/render.c b/src/render.c
index 5e9202b..0fd2561 100644
--- a/src/render.c
+++ b/src/render.c
@@ -621,7 +621,12 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex)
/* vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, s.vk_compute_pipeline); */
- /* vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, s.vk_compute_pipeline_layout, 0, 1, &s.frames[imageIndex].vk_compute_descriptor_set, 0, 0); */
+ /* vkCmdBindDescriptorSets(commandBuffer, */
+ /* VK_PIPELINE_BIND_POINT_COMPUTE, */
+ /* s.vk_compute_pipeline_layout, */
+ /* 0, 1, */
+ /* &s.frames[imageIndex].vk_compute_descriptor_set, */
+ /* 0, NULL); */
/* vkCmdDispatch(commandBuffer, PARTICLE_COUNT / 256, 1, 1); */
@@ -633,11 +638,11 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex)
vks_transition_image_layout_info transition_info = { 0 };
- transition_info.image = s.vk.swapchain.images[imageIndex];
- transition_info.format = VK_FORMAT_R8G8B8A8_SRGB;
- transition_info.srcAccessMask = 0;
- transition_info.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- transition_info.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
+ transition_info.image = s.vk.swapchain.images[imageIndex];
+ transition_info.format = VK_FORMAT_R8G8B8A8_SRGB;
+ transition_info.srcAccessMask = 0;
+ transition_info.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ transition_info.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
transition_info.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
transition_info.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
transition_info.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
@@ -854,19 +859,19 @@ vulkan_create_uniform_buffers()
void
vulkan_create_descriptor_pool()
{
- VkDescriptorPoolSize poolSizes[3] = {0};
+ VkDescriptorPoolSize poolSizes[2] = {0};
poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
poolSizes[0].descriptorCount = MAX_FRAMES_IN_FLIGHT;
poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
poolSizes[1].descriptorCount = MAX_FRAMES_IN_FLIGHT;
- poolSizes[2].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- poolSizes[2].descriptorCount = (uint32_t)(MAX_FRAMES_IN_FLIGHT) * 2;
+ /* poolSizes[2].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; */
+ /* poolSizes[2].descriptorCount = (uint32_t)(MAX_FRAMES_IN_FLIGHT) * 2; */
VkDescriptorPoolCreateInfo poolInfo = {0};
poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
poolInfo.poolSizeCount = VK_ARRAY_LEN(poolSizes);
poolInfo.pPoolSizes = poolSizes;
- poolInfo.maxSets = MAX_FRAMES_IN_FLIGHT;
+ poolInfo.maxSets = MAX_FRAMES_IN_FLIGHT; //* 3; // why 3?
VK_CHECK(vkCreateDescriptorPool(s.vk.device, &poolInfo, NULL, &s.vk_descriptor_pool));
}
@@ -882,6 +887,9 @@ vulkan_create_descriptor_sets()
/* compute_layouts[i] = s.vk_compute_descriptor_set_layout; */
}
+ /* layouts[0] = s.vk_descriptor_set_layout; */
+ /* layouts[1] = s.vk_compute_descriptor_set_layout; */
+
// TODO Find a way to group allocation
for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
VkDescriptorSetAllocateInfo allocInfo = {0};
@@ -935,7 +943,7 @@ vulkan_create_descriptor_sets()
/* storageBufferInfoLastFrame.range = sizeof(Particle) * PARTICLE_COUNT; */
/* descriptorWrites[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; */
- /* descriptorWrites[2].dstSet = s.frames[i].vk_compute_descriptor_set; */
+ /* descriptorWrites[2].dstSet = s.frames[i].vk_descriptor_sets[1]; */
/* descriptorWrites[2].dstBinding = 1; */
/* descriptorWrites[2].dstArrayElement = 0; */
/* descriptorWrites[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; */
@@ -948,7 +956,7 @@ vulkan_create_descriptor_sets()
/* storageBufferInfoCurrentFrame.range = sizeof(Particle) * PARTICLE_COUNT; */
/* descriptorWrites[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; */
- /* descriptorWrites[3].dstSet = s.frames[i].vk_compute_descriptor_set; */
+ /* descriptorWrites[3].dstSet = s.frames[i].vk_descriptor_sets[1]; */
/* descriptorWrites[3].dstBinding = 2; */
/* descriptorWrites[3].dstArrayElement = 0; */
/* descriptorWrites[3].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; */
@@ -1366,7 +1374,8 @@ float rand_float() {
return rand() / (float)RAND_MAX;
}
-void vulkan_create_compute_stuff()
+void
+vulkan_create_compute_stuff()
{
shaderc_compilation_result_t comp_result = load_compile_shader_data("src/shader.comp", shaderc_compute_shader);
if (!comp_result) {
@@ -1388,7 +1397,6 @@ void vulkan_create_compute_stuff()
computeShaderStageInfo.module = compShaderModule;
computeShaderStageInfo.pName = "main";
-
srand((unsigned int)time(NULL));
Particle particles[PARTICLE_COUNT];
@@ -1478,6 +1486,89 @@ void vulkan_create_compute_stuff()
}
void
+vulkan_create_compute_descriptor_stuff()
+{
+
+ // descriptor pool
+ VkDescriptorPoolSize poolSizes[2] = {0};
+ poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ poolSizes[0].descriptorCount = MAX_FRAMES_IN_FLIGHT;
+ poolSizes[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ poolSizes[1].descriptorCount = (uint32_t)(MAX_FRAMES_IN_FLIGHT) * 2;
+
+ VkDescriptorPoolCreateInfo poolInfo = {0};
+ poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ poolInfo.poolSizeCount = VK_ARRAY_LEN(poolSizes);
+ poolInfo.pPoolSizes = poolSizes;
+ poolInfo.maxSets = MAX_FRAMES_IN_FLIGHT; //* 3; // why 3?
+
+ VK_CHECK(vkCreateDescriptorPool(s.vk.device, &poolInfo, NULL, &s.vk_compute_descriptor_pool));
+
+ // descriptor sets
+ VkDescriptorSetLayout compute_layouts[MAX_FRAMES_IN_FLIGHT] = {0};
+
+ for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
+ compute_layouts[i] = s.vk_compute_descriptor_set_layout;
+ }
+
+ // TODO Find a way to group allocation
+ for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
+ VkDescriptorSetAllocateInfo allocInfo = {0};
+ allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ allocInfo.descriptorPool = s.vk_compute_descriptor_pool;
+ allocInfo.descriptorSetCount = 1;
+ allocInfo.pSetLayouts = compute_layouts;
+
+ VK_CHECK(vkAllocateDescriptorSets(s.vk.device, &allocInfo, &s.frames[i].vk_compute_descriptor_set));
+ }
+
+ for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
+ VkWriteDescriptorSet descriptorWrites[3] = {0};
+
+ VkDescriptorBufferInfo bufferInfo = {0};
+ bufferInfo.buffer = s.frames[i].uniform_buffer.handle;
+ bufferInfo.offset = 0;
+ bufferInfo.range = sizeof(UniformBufferObject);
+
+ descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptorWrites[0].dstSet = s.frames[i].vk_compute_descriptor_set;
+ descriptorWrites[0].dstBinding = 0;
+ descriptorWrites[0].dstArrayElement = 0;
+ descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptorWrites[0].descriptorCount = 1;
+ descriptorWrites[0].pBufferInfo = &bufferInfo;
+
+ VkDescriptorBufferInfo storageBufferInfoLastFrame = {0};
+ storageBufferInfoLastFrame.buffer = s.frames[(i - 1) % MAX_FRAMES_IN_FLIGHT].shader_storage_buffer.handle;
+ storageBufferInfoLastFrame.offset = 0;
+ storageBufferInfoLastFrame.range = sizeof(Particle) * PARTICLE_COUNT;
+
+ descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptorWrites[1].dstSet = s.frames[i].vk_compute_descriptor_set;
+ descriptorWrites[1].dstBinding = 1;
+ descriptorWrites[1].dstArrayElement = 0;
+ descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ descriptorWrites[1].descriptorCount = 1;
+ descriptorWrites[1].pBufferInfo = &storageBufferInfoLastFrame;
+
+ VkDescriptorBufferInfo storageBufferInfoCurrentFrame = {0};
+ storageBufferInfoCurrentFrame.buffer = s.frames[i].shader_storage_buffer.handle;
+ storageBufferInfoCurrentFrame.offset = 0;
+ storageBufferInfoCurrentFrame.range = sizeof(Particle) * PARTICLE_COUNT;
+
+ descriptorWrites[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptorWrites[2].dstSet = s.frames[i].vk_compute_descriptor_set;
+ descriptorWrites[2].dstBinding = 2;
+ descriptorWrites[2].dstArrayElement = 0;
+ descriptorWrites[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ descriptorWrites[2].descriptorCount = 1;
+ descriptorWrites[2].pBufferInfo = &storageBufferInfoCurrentFrame;
+
+ vkUpdateDescriptorSets(s.vk.device, VK_ARRAY_LEN(descriptorWrites), descriptorWrites, 0, NULL);
+ }
+}
+
+void
init_vulkan()
{
vk_log(VK_WARN, "====================================\n");
@@ -1505,6 +1596,8 @@ init_vulkan()
vulkan_create_descriptor_pool();
vulkan_create_descriptor_sets();
+ vulkan_create_compute_descriptor_stuff();
+
vulkan_create_command_buffer();
vulkan_create_sync_objects();
}