From: Piers Daniell Date: Wed, 17 Jun 2020 17:40:15 +0000 (+0200) Subject: Fix minor VU issue with VK_EXT_extended_dynamic_state X-Git-Tag: upstream/1.3.5~1255^2~19 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=41b1b389ad0247efca34ef8da2e15112ad4a6f6f;p=platform%2Fupstream%2FVK-GL-CTS.git Fix minor VU issue with VK_EXT_extended_dynamic_state The VUs for vkCreateGraphicsPipeline when VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is enabled state that the viewportCount must be specified as zero. Similarily with VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT enabled scissorCount must be specified as zero in the pipeline. Affects: dEQP-VK.pipeline.extended_dynamic_state.* Components: Vulkan VK-GL-CTS issue: 2424 Change-Id: I7f4aca4e02b82389fa8bacbb915ac3ed625c49b0 --- diff --git a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp index 90131f6..4c8084b 100644 --- a/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp +++ b/external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp @@ -914,15 +914,35 @@ tcu::TestStatus ExtendedDynamicStateInstance::iterate (void) else DE_ASSERT(m_testConfig.scissorConfig.staticValue.size() > 0u); - const vk::VkPipelineViewportStateCreateInfo viewportStateCreateInfo = + // The viewport and scissor counts must match in the static part, which will be used by the static pipeline. + const auto minCounter = static_cast(std::min(m_testConfig.viewportConfig.staticValue.size(), m_testConfig.scissorConfig.staticValue.size())); + + // For the static pipeline. + const vk::VkPipelineViewportStateCreateInfo staticViewportStateCreateInfo = { - vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; - nullptr, // const void* pNext; - 0u, // VkPipelineViewportStateCreateFlags flags; - static_cast(m_testConfig.viewportConfig.staticValue.size()), // deUint32 viewportCount; - m_testConfig.viewportConfig.staticValue.data(), // const VkViewport* pViewports; - static_cast(m_testConfig.scissorConfig.staticValue.size()), // deUint32 scissorCount; - m_testConfig.scissorConfig.staticValue.data(), // const VkRect2D* pScissors; + + vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; + nullptr, // const void* pNext; + 0u, // VkPipelineViewportStateCreateFlags flags; + minCounter, // deUint32 viewportCount; + m_testConfig.viewportConfig.staticValue.data(), // const VkViewport* pViewports; + minCounter, // deUint32 scissorCount; + m_testConfig.scissorConfig.staticValue.data(), // const VkRect2D* pScissors; + }; + + // For the dynamic pipeline. The viewport and scissor counts must be zero when a dynamic value will be provided, as per the spec. + const vk::VkPipelineViewportStateCreateInfo dynamicViewportStateCreateInfo = + { + + vk::VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; + nullptr, // const void* pNext; + 0u, // VkPipelineViewportStateCreateFlags flags; + (m_testConfig.viewportConfig.dynamicValue) ? 0u : + static_cast(m_testConfig.viewportConfig.staticValue.size()), // deUint32 viewportCount; + m_testConfig.viewportConfig.staticValue.data(), // const VkViewport* pViewports; + (m_testConfig.scissorConfig.dynamicValue) ? 0u : + static_cast(m_testConfig.scissorConfig.staticValue.size()), // deUint32 scissorCount; + m_testConfig.scissorConfig.staticValue.data(), // const VkRect2D* pScissors; }; // Rasterization state. @@ -1057,7 +1077,7 @@ tcu::TestStatus ExtendedDynamicStateInstance::iterate (void) { 0.0f, 0.0f, 0.0f, 0.0f } // float blendConstants[4] }; - const vk::VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfo = + const vk::VkGraphicsPipelineCreateInfo graphicsPipelineCreateInfoTemplate = { vk::VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; nullptr, // const void* pNext; @@ -1067,30 +1087,39 @@ tcu::TestStatus ExtendedDynamicStateInstance::iterate (void) &vertexInputStateCreateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; &inputAssemblyStateCreateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; nullptr, // const VkPipelineTessellationStateCreateInfo* pTessellationState; - &viewportStateCreateInfo, // const VkPipelineViewportStateCreateInfo* pViewportState; + nullptr, // const VkPipelineViewportStateCreateInfo* pViewportState; &rasterizationStateCreateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; &multisampleStateCreateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; &depthStencilStateCreateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; &colorBlendStateCreateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; - &dynamicStateCreateInfo, // const VkPipelineDynamicStateCreateInfo* pDynamicState; + nullptr, // const VkPipelineDynamicStateCreateInfo* pDynamicState; pipelineLayout.get(), // VkPipelineLayout layout; renderPass.get(), // VkRenderPass renderPass; 0u, // deUint32 subpass; DE_NULL, // VkPipeline basePipelineHandle; 0, // deInt32 basePipelineIndex; }; - const auto graphicsPipeline = vk::createGraphicsPipeline(vkd, device, DE_NULL, &graphicsPipelineCreateInfo); - const bool useStaticPipeline = (m_testConfig.sequenceOrdering == SequenceOrdering::BETWEEN_PIPELINES || m_testConfig.sequenceOrdering == SequenceOrdering::AFTER_PIPELINES); + vk::Move staticPipeline; + const bool useStaticPipeline = (m_testConfig.sequenceOrdering == SequenceOrdering::BETWEEN_PIPELINES || m_testConfig.sequenceOrdering == SequenceOrdering::AFTER_PIPELINES); - vk::Move staticPipeline; + // Create static pipeline when needed. if (useStaticPipeline) { - auto staticPipelineCreateInfo = graphicsPipelineCreateInfo; - staticPipelineCreateInfo.pDynamicState = nullptr; + auto staticPipelineCreateInfo = graphicsPipelineCreateInfoTemplate; + staticPipelineCreateInfo.pViewportState = &staticViewportStateCreateInfo; staticPipeline = vk::createGraphicsPipeline(vkd, device, DE_NULL, &staticPipelineCreateInfo); } + // Create dynamic pipeline. + vk::Move graphicsPipeline; + { + auto dynamicPipelineCreateInfo = graphicsPipelineCreateInfoTemplate; + dynamicPipelineCreateInfo.pDynamicState = &dynamicStateCreateInfo; + dynamicPipelineCreateInfo.pViewportState = &dynamicViewportStateCreateInfo; + graphicsPipeline = vk::createGraphicsPipeline(vkd, device, DE_NULL, &dynamicPipelineCreateInfo); + } + // Command buffer. const auto cmdPool = vk::makeCommandPool(vkd, device, queueIndex); const auto cmdBufferPtr = vk::allocateCommandBuffer(vkd , device, cmdPool.get(), vk::VK_COMMAND_BUFFER_LEVEL_PRIMARY);