diff options
Diffstat (limited to 'src/render.c')
| -rw-r--r-- | src/render.c | 121 |
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(); } |
