Test dynamic topology with tessellation shaders
authorRicardo Garcia <rgarcia@igalia.com>
Fri, 2 Jul 2021 10:56:47 +0000 (12:56 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 15 Jul 2021 11:03:53 +0000 (11:03 +0000)
Add new test variants to the extended dynamic state tests to check using
dynamic topology with tessellation shaders works as expected.

New tests:
dEQP-VK.pipeline.extended_dynamic_state.*topology_patch*

Affected tests:
dEQP-VK.pipeline.extended_dynamic_state.*

Components: Vulkan
VK-GL-CTS issue: 2965

Change-Id: I40a3928e986b83c5a22c3d36431b5d272aa8617e

android/cts/master/vk-master-2021-03-01/pipeline.txt
android/cts/master/vk-master/pipeline.txt
external/vulkancts/modules/vulkan/pipeline/vktPipelineExtendedDynamicStateTests.cpp
external/vulkancts/mustpass/master/vk-default/pipeline.txt

index 912ee90..c43f38c 100644 (file)
@@ -16643,8 +16643,10 @@ dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports_switch
@@ -18029,8 +18031,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_draw.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports_switch
@@ -19415,8 +19419,10 @@ dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports_switch
@@ -20801,8 +20807,10 @@ dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports_switch
@@ -22187,8 +22195,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_good_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports_switch
@@ -23573,8 +23583,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports_switch
@@ -24959,8 +24971,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports_switch
index c80a8b0..b5e8340 100644 (file)
@@ -153519,8 +153519,10 @@ dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports_switch
@@ -154905,8 +154907,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_draw.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports_switch
@@ -156291,8 +156295,10 @@ dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports_switch
@@ -157677,8 +157683,10 @@ dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports_switch
@@ -159063,8 +159071,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_good_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports_switch
@@ -160449,8 +160459,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports_switch
@@ -161835,8 +161847,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports_switch
index a8b2327..04d6b35 100644 (file)
@@ -736,6 +736,58 @@ const VertexGenerator* chooseVertexGenerator (const VertexGenerator* staticGen,
        return getVertexWithPaddingGenerator();
 }
 
+enum class TopologyClass
+{
+       POINT,
+       LINE,
+       TRIANGLE,
+       PATCH,
+       INVALID,
+};
+
+std::string topologyClassName (TopologyClass tclass)
+{
+       switch (tclass)
+       {
+       case TopologyClass::POINT:              return "point";
+       case TopologyClass::LINE:               return "line";
+       case TopologyClass::TRIANGLE:   return "triangle";
+       case TopologyClass::PATCH:              return "patch";
+       default:
+               break;
+       }
+
+       DE_ASSERT(false);
+       return "";
+}
+
+TopologyClass getTopologyClass (vk::VkPrimitiveTopology topology)
+{
+       switch (topology)
+       {
+       case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+               return TopologyClass::POINT;
+       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+               return TopologyClass::LINE;
+       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+               return TopologyClass::TRIANGLE;
+       case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+               return TopologyClass::PATCH;
+       default:
+               break;
+       }
+
+       DE_ASSERT(false);
+       return TopologyClass::INVALID;
+}
+
 struct TestConfig
 {
        // Main sequence ordering.
@@ -821,7 +873,7 @@ struct TestConfig
                , rastDiscardEnableConfig               (false)
                , primRestartEnableConfig               (false)
                , logicOpConfig                                 (vk::VK_LOGIC_OP_CLEAR)
-               , patchControlPointsConfig              (1)
+               , patchControlPointsConfig              (1u)
                , m_swappedValues                               (false)
        {
        }
@@ -844,6 +896,12 @@ struct TestConfig
                return ((vertexGenerator.dynamicValue && m_swappedValues) ? vertexGenerator.dynamicValue.get() : vertexGenerator.staticValue);
        }
 
+       // Get the active number of patch control points according to the test config.
+       deUint32 getActivePatchControlPoints () const
+       {
+               return ((patchControlPointsConfig.dynamicValue && !m_swappedValues) ? patchControlPointsConfig.dynamicValue.get() : patchControlPointsConfig.staticValue);
+       }
+
        // Returns true if there is more than one viewport.
        bool isMultiViewport () const
        {
@@ -922,10 +980,16 @@ struct TestConfig
                return static_cast<bool>(patchControlPointsConfig.dynamicValue);
        }
 
+       // Returns true if the topology class is patches for tessellation.
+       bool patchesTopology () const
+       {
+               return (getTopologyClass(topologyConfig.staticValue) == TopologyClass::PATCH);
+       }
+
        // Returns true if the test needs tessellation shaders.
        bool needsTessellation () const
        {
-               return testPatchControlPoints();
+               return (testPatchControlPoints() || patchesTopology());
        }
 
        // Returns true if the test needs an index buffer.
@@ -1037,58 +1101,6 @@ void copy(vk::VkStencilOpState& dst, const StencilOpParams& src)
        dst.compareOp   = src.compareOp;
 }
 
-enum class TopologyClass
-{
-       POINT,
-       LINE,
-       TRIANGLE,
-       PATCH,
-       INVALID,
-};
-
-std::string topologyClassName (TopologyClass tclass)
-{
-       switch (tclass)
-       {
-       case TopologyClass::POINT:              return "point";
-       case TopologyClass::LINE:               return "line";
-       case TopologyClass::TRIANGLE:   return "triangle";
-       case TopologyClass::PATCH:              return "patch";
-       default:
-               break;
-       }
-
-       DE_ASSERT(false);
-       return "";
-}
-
-TopologyClass getTopologyClass (vk::VkPrimitiveTopology topology)
-{
-       switch (topology)
-       {
-       case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
-               return TopologyClass::POINT;
-       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
-       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
-       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
-       case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
-               return TopologyClass::LINE;
-       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
-       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
-       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
-       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
-       case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
-               return TopologyClass::TRIANGLE;
-       case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
-               return TopologyClass::PATCH;
-       default:
-               break;
-       }
-
-       DE_ASSERT(false);
-       return TopologyClass::INVALID;
-}
-
 class ExtendedDynamicStateTest : public vkt::TestCase
 {
 public:
@@ -1129,6 +1141,10 @@ ExtendedDynamicStateTest::ExtendedDynamicStateTest (tcu::TestContext& testCtx, c
        // Supported topology classes for these tests.
        DE_ASSERT(staticTopologyClass == TopologyClass::LINE || staticTopologyClass == TopologyClass::TRIANGLE
                || staticTopologyClass == TopologyClass::PATCH);
+
+       // Make sure these are consistent.
+       DE_ASSERT(!(m_testConfig.testPatchControlPoints() && !m_testConfig.patchesTopology()));
+       DE_ASSERT(!(m_testConfig.patchesTopology() && m_testConfig.getActivePatchControlPoints() <= 1u));
 }
 
 void ExtendedDynamicStateTest::checkSupport (Context& context) const
@@ -1333,7 +1349,11 @@ void ExtendedDynamicStateTest::initPrograms (vk::SourceCollections& programColle
                        << "in gl_PerVertex\n"
                        << "{\n"
                        << "    vec4 gl_Position;\n"
-                       << "} gl_in[];\n"
+                       << "} gl_in[gl_MaxPatchVertices];\n"
+                       << "out gl_PerVertex\n"
+                       << "{\n"
+                       << "  vec4 gl_Position;\n"
+                       << "} gl_out[];\n"
                        << "void main() {\n"
                        << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
                        << "  gl_TessLevelOuter[0] = 3.0;\n"
@@ -1346,6 +1366,14 @@ void ExtendedDynamicStateTest::initPrograms (vk::SourceCollections& programColle
                        << "#version 450\n"
                        << "#extension GL_EXT_tessellation_shader : require\n"
                        << "layout(triangles) in;\n"
+                       << "in gl_PerVertex\n"
+                       << "{\n"
+                       << "  vec4 gl_Position;\n"
+                       << "} gl_in[gl_MaxPatchVertices];\n"
+                       << "out gl_PerVertex\n"
+                       << "{\n"
+                       << "  vec4 gl_Position;\n"
+                       << "};\n"
                        << "void main() {\n"
                        << "  gl_Position = (gl_in[0].gl_Position * gl_TessCoord.x + \n"
                        << "                 gl_in[1].gl_Position * gl_TessCoord.y + \n"
@@ -1716,6 +1744,8 @@ tcu::TestStatus ExtendedDynamicStateInstance::iterate (void)
        }
        else if (topologyClass == TopologyClass::PATCH)
        {
+               DE_ASSERT(m_testConfig.getActivePatchControlPoints() > 1u);
+
                // 2 triangles making a quad
                vertices.reserve(6u);
                vertices.push_back(tcu::Vec2(-1.0f,  1.0f));
@@ -2577,7 +2607,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                        TestConfig config(kOrdering);
                        config.rastDiscardEnableConfig.staticValue = true;
                        config.rastDiscardEnableConfig.dynamicValue = tcu::just(false);
-                       config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
                        orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "enable_raster", "Dynamically enable rasterizer", config));
                }
 
@@ -2598,7 +2627,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                        TestConfig config(kOrdering);
                        config.primRestartEnableConfig.staticValue = false;
                        config.primRestartEnableConfig.dynamicValue = tcu::just(true);
-                       config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
                        orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "prim_restart_enable", "Dynamically enable primitiveRestart", config));
                }
 
@@ -2608,7 +2636,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                        config.topologyConfig.staticValue = vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
                        config.patchControlPointsConfig.staticValue = 1;
                        config.patchControlPointsConfig.dynamicValue = 3;
-                       config.referenceColor = SingleColorGenerator(kDefaultTriangleColor);
                        orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "patch_control_points", "Dynamically change patch control points", config));
                }
 
@@ -2628,14 +2655,16 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                                {
                                        { vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,      vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN  },
                                        { vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST,          vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP    },
+                                       { vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,         vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST    },
                                };
 
                                for (const auto& kTopologyCase : kTopologyCases)
                                {
                                        TestConfig config(baseConfig);
-                                       config.forceGeometryShader                      = forceGeometryShader;
-                                       config.topologyConfig.staticValue       = kTopologyCase.staticVal;
-                                       config.topologyConfig.dynamicValue      = tcu::just<vk::VkPrimitiveTopology>(kTopologyCase.dynamicVal);
+                                       config.forceGeometryShader                                      = forceGeometryShader;
+                                       config.topologyConfig.staticValue                       = kTopologyCase.staticVal;
+                                       config.topologyConfig.dynamicValue                      = tcu::just<vk::VkPrimitiveTopology>(kTopologyCase.dynamicVal);
+                                       config.patchControlPointsConfig.staticValue     = (config.needsTessellation() ? 3u : 1u);
 
                                        const std::string       className       = topologyClassName(getTopologyClass(config.topologyConfig.staticValue));
                                        const std::string       name            = "topology_" + className + (forceGeometryShader ? "_geom" : "");
@@ -2813,7 +2842,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                        TestConfig config(kOrdering);
                        config.depthTestEnableConfig.staticValue        = true;
                        config.depthTestEnableConfig.dynamicValue       = tcu::just(false);
-                       config.referenceColor                                           = SingleColorGenerator(kDefaultTriangleColor);
                        orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "depth_test_disable", "Dynamically disable depth test", config));
                }
 
@@ -3035,7 +3063,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                                TestConfig config = baseConfig;
                                config.depthBoundsTestEnableConfig.staticValue  = true;
                                config.depthBoundsTestEnableConfig.dynamicValue = tcu::just(false);
-                               config.referenceColor                                                   = SingleColorGenerator(kDefaultTriangleColor);
                                orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "depth_bounds_test_disable", "Dynamically disable the depth bounds test", config));
                        }
                }
@@ -3054,7 +3081,6 @@ tcu::TestCaseGroup* createExtendedDynamicStateTests (tcu::TestContext& testCtx)
                        config.stencilTestEnableConfig.staticValue                              = true;
                        config.stencilTestEnableConfig.dynamicValue                             = tcu::just(false);
                        config.stencilOpConfig.staticValue.front().compareOp    = vk::VK_COMPARE_OP_NEVER;
-                       config.referenceColor                                                                   = SingleColorGenerator(kDefaultTriangleColor);
                        orderingGroup->addChild(new ExtendedDynamicStateTest(testCtx, "stencil_test_disable", "Dynamically disable the stencil test", config));
                }
 
index f783986..9b8cff0 100644 (file)
@@ -153530,8 +153530,10 @@ dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.2_viewports_switch
@@ -154916,8 +154918,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_draw.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_draw.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_draw.2_viewports_switch
@@ -156302,8 +156306,10 @@ dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.2_viewports_switch
@@ -157688,8 +157694,10 @@ dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.2_viewports_switch
@@ -159074,8 +159082,10 @@ dEQP-VK.pipeline.extended_dynamic_state.before_good_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.before_good_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.before_good_static.2_viewports_switch
@@ -160460,8 +160470,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.2_viewports_switch
@@ -161846,8 +161858,10 @@ dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.prim_restart_enable
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.patch_control_points
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_triangle_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_line_geom
+dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.topology_patch_geom
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.1_full_viewport
 dEQP-VK.pipeline.extended_dynamic_state.two_draws_static.2_viewports_switch