From 51618acc1f6df47cfb47d599f4877bf2c129c899 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sun, 14 Jan 2024 11:04:43 +0100 Subject: [PATCH] Code cleanup and simplification --- examples/geometryshader/geometryshader.cpp | 157 ++++++------------ shaders/glsl/geometryshader/normaldebug.geom | 2 +- .../glsl/geometryshader/normaldebug.geom.spv | Bin 2780 -> 2780 bytes shaders/hlsl/geometryshader/normaldebug.geom | 2 +- .../hlsl/geometryshader/normaldebug.geom.spv | Bin 3108 -> 2244 bytes 5 files changed, 51 insertions(+), 110 deletions(-) diff --git a/examples/geometryshader/geometryshader.cpp b/examples/geometryshader/geometryshader.cpp index d245ec54..8174a8d8 100644 --- a/examples/geometryshader/geometryshader.cpp +++ b/examples/geometryshader/geometryshader.cpp @@ -16,30 +16,20 @@ public: vkglTF::Model scene; - struct { + struct UniformData { glm::mat4 projection; glm::mat4 modelView; - } uboVS; + } uniformData; + vks::Buffer uniformBuffer; struct { - glm::mat4 projection; - glm::mat4 modelView; - glm::vec2 viewportDim; - } uboGS; - - struct { - vks::Buffer VS; - vks::Buffer GS; - } uniformBuffers; - - struct { - VkPipeline solid; - VkPipeline normals; + VkPipeline solid{ VK_NULL_HANDLE }; + VkPipeline normals{ VK_NULL_HANDLE }; } pipelines; - VkPipelineLayout pipelineLayout; - VkDescriptorSet descriptorSet; - VkDescriptorSetLayout descriptorSetLayout; + VkPipelineLayout pipelineLayout{ VK_NULL_HANDLE }; + VkDescriptorSet descriptorSet{ VK_NULL_HANDLE }; + VkDescriptorSetLayout descriptorSetLayout{ VK_NULL_HANDLE }; VulkanExample() : VulkanExampleBase() { @@ -52,16 +42,13 @@ public: ~VulkanExample() { - // Clean up used Vulkan resources - // Note : Inherited destructor cleans up resources stored in base class - vkDestroyPipeline(device, pipelines.solid, nullptr); - vkDestroyPipeline(device, pipelines.normals, nullptr); - - vkDestroyPipelineLayout(device, pipelineLayout, nullptr); - vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - - uniformBuffers.GS.destroy(); - uniformBuffers.VS.destroy(); + if (device) { + vkDestroyPipeline(device, pipelines.solid, nullptr); + vkDestroyPipeline(device, pipelines.normals, nullptr); + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); + uniformBuffer.destroy(); + } } // Enable physical device features required for this example @@ -137,56 +124,41 @@ public: scene.loadFromFile(getAssetPath() + "models/suzanne.gltf", vulkanDevice, queue, vkglTF::FileLoadingFlags::PreTransformVertices | vkglTF::FileLoadingFlags::PreMultiplyVertexColors | vkglTF::FileLoadingFlags::FlipY); } - void setupDescriptorPool() + void setupDescriptors() { - // Example uses two ubos - std::vector poolSizes = - { - vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2), + // Pool + std::vector poolSizes = { + vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1), }; VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes, 2); VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); - } - void setupDescriptorSetLayout() - { - std::vector setLayoutBindings = - { - // Binding 0 : Vertex shader ubo - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), - // Binding 1 : Geometry shader ubo - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_GEOMETRY_BIT, 1) + // Layout + std::vector setLayoutBindings = { + // Binding 0 : Shader uniform ubo + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT, 0), }; VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); - VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1); - VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, nullptr, &pipelineLayout)); - } - - void setupDescriptorSet() - { - VkDescriptorSetAllocateInfo allocInfo = - vks::initializers::descriptorSetAllocateInfo( - descriptorPool, - &descriptorSetLayout, - 1); + // Set + VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayout, 1); VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); - - std::vector writeDescriptorSets = - { - // Binding 0 : Vertex shader ubo - vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.VS.descriptor), - // Binding 1 : Geometry shader ubo - vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &uniformBuffers.GS.descriptor) + std::vector writeDescriptorSets = { + // Binding 0 : Shader uniform buffer + vks::initializers::writeDescriptorSet(descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor), }; - vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr); } void preparePipelines() { + //Layout + VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayout, 1); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, nullptr, &pipelineLayout)); + + // Pipelines VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = vks::initializers::pipelineInputAssemblyStateCreateInfo(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, VK_FALSE); VkPipelineRasterizationStateCreateInfo rasterizationState = vks::initializers::pipelineRasterizationStateCreateInfo(VK_POLYGON_MODE_FILL, VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE, 0); VkPipelineColorBlendAttachmentState blendAttachmentState = vks::initializers::pipelineColorBlendAttachmentState(0xf, VK_FALSE); @@ -230,51 +202,17 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - &uniformBuffers.VS, - sizeof(uboVS))); - - // Geometry shader uniform buffer block - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - &uniformBuffers.GS, - sizeof(uboGS))); - + VK_CHECK_RESULT(vulkanDevice->createBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &uniformBuffer, sizeof(UniformData))); // Map persistent - VK_CHECK_RESULT(uniformBuffers.VS.map()); - VK_CHECK_RESULT(uniformBuffers.GS.map()); - - updateUniformBuffers(); + VK_CHECK_RESULT(uniformBuffer.map()); } void updateUniformBuffers() { // Vertex shader - uboVS.projection = camera.matrices.perspective; - uboVS.modelView = camera.matrices.view; - memcpy(uniformBuffers.VS.mapped, &uboVS, sizeof(uboVS)); - // Geometry shader - uboGS.projection = camera.matrices.perspective; - uboGS.modelView = camera.matrices.view; - uboGS.viewportDim = glm::vec2(width, height); - memcpy(uniformBuffers.GS.mapped, &uboGS, sizeof(uboGS)); - } - - void draw() - { - VulkanExampleBase::prepareFrame(); - - // Command buffer to be submitted to the queue - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; - - // Submit to queue - VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); - - VulkanExampleBase::submitFrame(); + uniformData.projection = camera.matrices.perspective; + uniformData.modelView = camera.matrices.view; + memcpy(uniformBuffer.mapped, &uniformData, sizeof(UniformData)); } void prepare() @@ -282,24 +220,27 @@ public: VulkanExampleBase::prepare(); loadAssets(); prepareUniformBuffers(); - setupDescriptorSetLayout(); + setupDescriptors(); preparePipelines(); - setupDescriptorPool(); - setupDescriptorSet(); buildCommandBuffers(); prepared = true; } + void draw() + { + VulkanExampleBase::prepareFrame(); + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + VulkanExampleBase::submitFrame(); + } + virtual void render() { if (!prepared) return; - draw(); - } - - virtual void viewChanged() - { updateUniformBuffers(); + draw(); } virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay) diff --git a/shaders/glsl/geometryshader/normaldebug.geom b/shaders/glsl/geometryshader/normaldebug.geom index 3ed02158..beafe6ef 100644 --- a/shaders/glsl/geometryshader/normaldebug.geom +++ b/shaders/glsl/geometryshader/normaldebug.geom @@ -3,7 +3,7 @@ layout (triangles) in; layout (line_strip, max_vertices = 6) out; -layout (binding = 1) uniform UBO +layout (binding = 0) uniform UBO { mat4 projection; mat4 model; diff --git a/shaders/glsl/geometryshader/normaldebug.geom.spv b/shaders/glsl/geometryshader/normaldebug.geom.spv index d5eb49e268893e78c7cc0a4713d235d1a65c3692..c4894518996ed960a65db404f2ca4c67c5f067ae 100644 GIT binary patch delta 25 hcmca3dPkI#nMs+Qfq{{Mdn4z4W=4k1FPT5H0RT$C23!CD delta 25 hcmca3dPkI#nMs+Qfq{{MVdvp9v|{mZLEZ!7CV<$Pi4=~O;@ z5p$}*z6#rHK0h-yjm65Wv$|1BLF4&!KA-q{-!T_^XvgpQLcUR3+o&ND*_=4#a`jEh zq>uH@R@YZ56lneq^tH-*WhI@kylVIavCeoqaH%`{{-o7)>s2?OcI#}k+xJo6(yl&` zv@Dy%+gZ5=>)St^wk|M9T=-c}#CfK1qyKUL$LSYwK4Vv$H^H-!v#-6#_F4jGiBR4F zI=+0my9a$IatWAEyZSER3cVBAnS^fr`tQTPo86q&qQ1M(!(Uqu$g<6Qaei;ov+NvI z>c0o*BQJvYZU?8mkNo@CJ=630`FAdIqQB@{u7s_R-5EFwd)=RS{#e$c?)zn}htLnQ zn_JF!-zWQ&*M6AYdcz)fL|*?R?B+6uda2Nj>7kMV_5nP+JIdDYz13eI&lqHvi!+WP z+mF0Cj~BZBz2rPm@FxpC&OU{1@6P28an8bfDyMF5%3BKEUaUQIdvV5c`j^;!57e(C z4Y2F$vY(%1JI$`IHT&*a_b|HiI|DpV-Fck_=9(jyHJ=0exa92bJkZZohI1}MKwoVU zdjZ*4>xo!CB`H=eVlN@o>Y~b$RnDk5P-y{x0zB z$nTt;>u_PqdHT+Dq~PRT&c{B@{HiInh3T_rzuCa%_;2L`Tw^u>21s_#X(6kT|FBEp#(&eXgpns=B+X`c7}pcz>3y$+B#H_ACEgo3bAM zWO|dWcSAOiEcM04!jcYSjHrMr*odb8e9%|2Q4_zBX#HE0FV`tDLYn8k?T41#+u zbbZUM=Kb^cwilXI<=)1mI-B>+A3-9>xIQAY ztnkg$58gRBjYr=4nk(&;w7))GKbZKuU(ru%xQw`ax@wnmMeW+&Z>HH=Y;ZyM--*54 zXf+no2@6ZMuA22{SDeLjgSmEVzOk51(NpJk4sdBZ&yi&1wzX(`mVRp}`|ZgN;L@)> z28_RhX#40I&&63BkB;|ZT;=~b?-P0MVP36^>&`PS@?zF;-W1c2v#zb^=8l40WT>wN zgTI~Hy9IjyeH6H#e(gcv3fo@Uldy--jo(K6dZc@L7wrv&ZTtwfZ`v6733k!8{8>=sJuS1W!Meg-* zp6h)h_Xc!h_02LV-_VV~`?#WC7 z^f-|7x8zS^enFlAu79xgKLO<3OFi~_61@W^xu@^&Dd4^2y@PS~{Ar-C&MoctGX*E_ zvUm2tT6_=shd9d>iPuCjHu*f%U9Iz611o zPtQFGgKnxX;nuM_b^uhe6EtdvyIV z+aJ*7Trpd@nC*|~`pdJGbGCl~e}m3o`@5m^oB`xdpp#Hd_Rj?u_tGa<{tff@=U?{R G1O5Y!i0B*u