From 8d74bdbc7cc8ed445eb0fcb1631281d179d1fdcf Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Fri, 3 Nov 2023 15:06:50 +0100 Subject: [PATCH] Set additional dynamic states As required per spec (validation is clean) --- examples/shaderobjects/shaderobjects.cpp | 53 ++++++++++++++++++++---- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/examples/shaderobjects/shaderobjects.cpp b/examples/shaderobjects/shaderobjects.cpp index db1a073b..d32b7bdc 100644 --- a/examples/shaderobjects/shaderobjects.cpp +++ b/examples/shaderobjects/shaderobjects.cpp @@ -43,15 +43,25 @@ public: PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR; // With VK_EXT_shader_object pipeline state must be set at command buffer creation using these functions - // VK_EXT_dynamic_state - PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT; - PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT; - PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT; + PFN_vkCmdSetAlphaToCoverageEnableEXT vkCmdSetAlphaToCoverageEnableEXT; + PFN_vkCmdSetColorBlendEnableEXT vkCmdSetColorBlendEnableEXT; + PFN_vkCmdSetColorWriteMaskEXT vkCmdSetColorWriteMaskEXT; PFN_vkCmdSetCullModeEXT vkCmdSetCullModeEXT; + PFN_vkCmdSetDepthBiasEnableEXT vkCmdSetDepthBiasEnableEXT; + PFN_vkCmdSetDepthCompareOpEXT vkCmdSetDepthCompareOpEXT; PFN_vkCmdSetDepthTestEnableEXT vkCmdSetDepthTestEnableEXT; PFN_vkCmdSetDepthWriteEnableEXT vkCmdSetDepthWriteEnableEXT; PFN_vkCmdSetFrontFaceEXT vkCmdSetFrontFaceEXT; + PFN_vkCmdSetPolygonModeEXT vkCmdSetPolygonModeEXT; + PFN_vkCmdSetPrimitiveRestartEnableEXT vkCmdSetPrimitiveRestartEnableEXT; PFN_vkCmdSetPrimitiveTopologyEXT vkCmdSetPrimitiveTopologyEXT; + PFN_vkCmdSetRasterizationSamplesEXT vkCmdSetRasterizationSamplesEXT; + PFN_vkCmdSetRasterizerDiscardEnableEXT vkCmdSetRasterizerDiscardEnableEXT; + PFN_vkCmdSetSampleMaskEXT vkCmdSetSampleMaskEXT; + PFN_vkCmdSetScissorWithCountEXT vkCmdSetScissorWithCountEXT; + PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT; + PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT; + // VK_EXT_vertex_input_dynamic_state PFN_vkCmdSetVertexInputEXT vkCmdSetVertexInputEXT; @@ -316,6 +326,7 @@ public: VkRect2D scissor = vks::initializers::rect2D(width, height, 0, 0); // No more pipelines required, everything is bound at command buffer level + // This also means that we need to explicitly set a lot of the state to be spec compliant vkCmdSetViewportWithCountEXT(drawCmdBuffers[i], 1, &viewport); vkCmdSetScissorWithCountEXT(drawCmdBuffers[i], 1, &scissor); @@ -325,6 +336,22 @@ public: vkCmdSetDepthWriteEnableEXT(drawCmdBuffers[i], VK_TRUE); vkCmdSetDepthCompareOpEXT(drawCmdBuffers[i], VK_COMPARE_OP_LESS_OR_EQUAL); vkCmdSetPrimitiveTopologyEXT(drawCmdBuffers[i], VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); + vkCmdSetRasterizerDiscardEnableEXT(drawCmdBuffers[i], VK_FALSE); + vkCmdSetPolygonModeEXT(drawCmdBuffers[i], VK_POLYGON_MODE_FILL); + vkCmdSetRasterizationSamplesEXT(drawCmdBuffers[i], VK_SAMPLE_COUNT_1_BIT); + vkCmdSetAlphaToCoverageEnableEXT(drawCmdBuffers[i], VK_FALSE); + vkCmdSetDepthBiasEnableEXT(drawCmdBuffers[i], VK_FALSE); + vkCmdSetStencilTestEnableEXT(drawCmdBuffers[i], VK_FALSE); + vkCmdSetPrimitiveRestartEnableEXT(drawCmdBuffers[i], VK_FALSE); + + const uint32_t sampleMask = 0xFF; + vkCmdSetSampleMaskEXT(drawCmdBuffers[i], VK_SAMPLE_COUNT_1_BIT, &sampleMask); + + const VkBool32 colorBlendEnables = false; + const VkColorComponentFlags colorBlendComponentFlags = 0xf; + const VkColorBlendEquationEXT colorBlendEquation{}; + vkCmdSetColorBlendEnableEXT(drawCmdBuffers[i], 0, 1, &colorBlendEnables); + vkCmdSetColorWriteMaskEXT(drawCmdBuffers[i], 0, 1, &colorBlendComponentFlags); VkVertexInputBindingDescription2EXT vertexInputBinding{}; vertexInputBinding.sType = VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT; @@ -400,6 +427,8 @@ public: { VulkanExampleBase::prepare(); + // As this is an extension, we need to explicitly load the function pointers for the shader object commands used in this sample + vkCreateShadersEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCreateShadersEXT")); vkDestroyShaderEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkDestroyShaderEXT")); vkCmdBindShadersEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdBindShadersEXT")); @@ -408,15 +437,25 @@ public: vkCmdBeginRenderingKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdBeginRenderingKHR")); vkCmdEndRenderingKHR = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdEndRenderingKHR")); - vkCmdSetViewportWithCountEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT"));; - vkCmdSetScissorWithCountEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT")); - vkCmdSetDepthCompareOpEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT")); + vkCmdSetAlphaToCoverageEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetAlphaToCoverageEnableEXT")); + vkCmdSetColorBlendEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetColorBlendEnableEXT")); + vkCmdSetColorWriteMaskEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetColorWriteMaskEXT")); vkCmdSetCullModeEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetCullModeEXT")); + vkCmdSetDepthBiasEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetDepthBiasEnableEXT")); + vkCmdSetDepthCompareOpEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetDepthCompareOpEXT")); vkCmdSetDepthTestEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetDepthTestEnableEXT")); vkCmdSetDepthWriteEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetDepthWriteEnableEXT")); vkCmdSetFrontFaceEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT")); + vkCmdSetPolygonModeEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetPolygonModeEXT")); + vkCmdSetPrimitiveRestartEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT")); vkCmdSetPrimitiveTopologyEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT")); + vkCmdSetRasterizationSamplesEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetRasterizationSamplesEXT")); + vkCmdSetRasterizerDiscardEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT")); + vkCmdSetSampleMaskEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetSampleMaskEXT")); + vkCmdSetScissorWithCountEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetScissorWithCountEXT")); + vkCmdSetStencilTestEnableEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetStencilTestEnableEXT")); vkCmdSetVertexInputEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetVertexInputEXT")); + vkCmdSetViewportWithCountEXT = reinterpret_cast(vkGetDeviceProcAddr(device, "vkCmdSetViewportWithCountEXT"));; loadAssets(); prepareUniformBuffers();