From 1e5705779852c5bc36a5c77fc632809494ab36a1 Mon Sep 17 00:00:00 2001 From: Matt Coster Date: Wed, 14 Sep 2022 15:06:17 +0100 Subject: [PATCH 1/2] Fixes to dynamic state behavior in pipelines demo This patch includes three fixes: - Allow wideLines to be enabled when fillModeNotSolid isn't, - Check against enabledFeatures for runtime conditionals instead of the theoretical values in deviceFeatures, and - Always call vkCmdSetLineWidth() before any draw command occurs. This is required by the spec, since any state declared as dynamic is explicitly not initialized by VkPipeline*StateCreateInfo. Signed-off-by: Matt Coster --- examples/pipelines/pipelines.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/pipelines/pipelines.cpp b/examples/pipelines/pipelines.cpp index 13034073..ee135ca6 100644 --- a/examples/pipelines/pipelines.cpp +++ b/examples/pipelines/pipelines.cpp @@ -50,7 +50,7 @@ public: // Clean up used Vulkan resources // Note : Inherited destructor cleans up resources stored in base class vkDestroyPipeline(device, pipelines.phong, nullptr); - if (deviceFeatures.fillModeNonSolid) + if (enabledFeatures.fillModeNonSolid) { vkDestroyPipeline(device, pipelines.wireframe, nullptr); } @@ -68,11 +68,12 @@ public: // Fill mode non solid is required for wireframe display if (deviceFeatures.fillModeNonSolid) { enabledFeatures.fillModeNonSolid = VK_TRUE; - // Wide lines must be present for line width > 1.0f - if (deviceFeatures.wideLines) { - enabledFeatures.wideLines = VK_TRUE; - } }; + + // Wide lines must be present for line width > 1.0f + if (deviceFeatures.wideLines) { + enabledFeatures.wideLines = VK_TRUE; + } } void buildCommandBuffers() @@ -114,6 +115,7 @@ public: viewport.width = (float)width / 3.0; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phong); + vkCmdSetLineWidth(drawCmdBuffers[i], 1.0f); scene.draw(drawCmdBuffers[i]); // Center : Toon @@ -121,12 +123,12 @@ public: vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toon); // Line width > 1.0f only if wide lines feature is supported - if (deviceFeatures.wideLines) { + if (enabledFeatures.wideLines) { vkCmdSetLineWidth(drawCmdBuffers[i], 2.0f); } scene.draw(drawCmdBuffers[i]); - if (deviceFeatures.fillModeNonSolid) + if (enabledFeatures.fillModeNonSolid) { // Right : Wireframe viewport.x = (float)width / 3.0 + (float)width / 3.0; @@ -268,7 +270,7 @@ public: // Pipeline for wire frame rendering // Non solid rendering is not a mandatory Vulkan feature - if (deviceFeatures.fillModeNonSolid) + if (enabledFeatures.fillModeNonSolid) { rasterizationState.polygonMode = VK_POLYGON_MODE_LINE; shaderStages[0] = loadShader(getShadersPath() + "pipelines/wireframe.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -342,7 +344,7 @@ public: virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay) { - if (!deviceFeatures.fillModeNonSolid) { + if (!enabledFeatures.fillModeNonSolid) { if (overlay->header("Info")) { overlay->text("Non solid fill modes not supported!"); } From 38213eb2a519f07d37e3d67cc4985631ce363d37 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Mon, 26 Sep 2022 17:47:59 +0200 Subject: [PATCH 2/2] Removed unused combined sampler from layout Refs #995 --- data/shaders/glsl/rayquery/scene.frag | 2 +- data/shaders/glsl/rayquery/scene.frag.spv | Bin 1924 -> 1924 bytes examples/rayquery/rayquery.cpp | 8 +++----- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/data/shaders/glsl/rayquery/scene.frag b/data/shaders/glsl/rayquery/scene.frag index a0273b83..4f40a1a1 100644 --- a/data/shaders/glsl/rayquery/scene.frag +++ b/data/shaders/glsl/rayquery/scene.frag @@ -2,7 +2,7 @@ #extension GL_EXT_ray_tracing : enable #extension GL_EXT_ray_query : enable -layout (binding = 2, set = 0) uniform accelerationStructureEXT topLevelAS; +layout (binding = 1, set = 0) uniform accelerationStructureEXT topLevelAS; layout (location = 0) in vec3 inNormal; layout (location = 1) in vec3 inColor; diff --git a/data/shaders/glsl/rayquery/scene.frag.spv b/data/shaders/glsl/rayquery/scene.frag.spv index 0a90da4751795ca307e28d6139a07c1f6521904d..2465e577618667817a210cd8051d6e55a244091c 100644 GIT binary patch delta 22 dcmZqSZ{cTSW>RKnVA;rK#Kg$B*^RKnVBN@O#Kg$7*^ setLayoutBindings = { // Binding 0 : Vertex shader uniform buffer vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0), - // Binding 1 : Fragment shader image sampler (shadow map) - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 1), - // Binding 2: Acceleration structure - vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_FRAGMENT_BIT, 2), + // Binding 1: Acceleration structure + vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_FRAGMENT_BIT, 1), }; VkDescriptorSetLayoutCreateInfo descriptorLayout = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings); VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); @@ -338,7 +336,7 @@ public: // The specialized acceleration structure descriptor has to be chained accelerationStructureWrite.pNext = &descriptorAccelerationStructureInfo; accelerationStructureWrite.dstSet = descriptorSet; - accelerationStructureWrite.dstBinding = 2; + accelerationStructureWrite.dstBinding = 1; accelerationStructureWrite.descriptorCount = 1; accelerationStructureWrite.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;