Fix tessellation tests do not test undefined tessLevel inputs
authorS&#322;awomir Cygan <slawomir.cygan@intel.com>
Tue, 18 Jul 2017 09:31:30 +0000 (05:31 -0400)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Mon, 7 Aug 2017 12:14:38 +0000 (08:14 -0400)
The spec says g gl_TessLevelOuter[2], gl_TessLevelOuter[3], and
both values in gl_TessLevelInner inputs  are undefined in tessellation
 evaluation shader, if isolines are tessellated.

To avoid testing undefined tessellation level inputs, change
the tessellated primitive type to QUADS

Affects:
KHR-GL45.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_tessLevel

Components: OpenGL

VK-GL-CTS issue: 488

This reverts commit 3c148ca8bc02a29c52d615a7b966671b54fcb356.

Change-Id: I9dde6ee281a3502a9205758ac9d06673ced528c5

external/openglcts/modules/glesext/tessellation_shader/esextcTessellationShaderTCTE.cpp

index 53d62aa..bb6bfb0 100644 (file)
@@ -3368,13 +3368,15 @@ void TessellationShaderTCTEgl_TessLevel::initTestDescriptor(_tessellation_test_t
                                                  "\n"
                                                  "void main()\n"
                                                  "{\n"
-                                                 "    gl_out           [gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
-                                                 "    gl_TessLevelInner[0]                           = inner_tess_levels[0];\n"
-                                                 "    gl_TessLevelInner[1]                           = inner_tess_levels[1];\n"
-                                                 "    gl_TessLevelOuter[0]                           = outer_tess_levels[0];\n"
-                                                 "    gl_TessLevelOuter[1]                           = outer_tess_levels[1];\n"
-                                                 "    gl_TessLevelOuter[2]                           = outer_tess_levels[2];\n"
-                                                 "    gl_TessLevelOuter[3]                           = outer_tess_levels[3];\n"
+                                                 "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+                                                 "    if (gl_InvocationID == 0) {\n"
+                                                 "        gl_TessLevelInner[0]                           = inner_tess_levels[0];\n"
+                                                 "        gl_TessLevelInner[1]                           = inner_tess_levels[1];\n"
+                                                 "        gl_TessLevelOuter[0]                           = outer_tess_levels[0];\n"
+                                                 "        gl_TessLevelOuter[1]                           = outer_tess_levels[1];\n"
+                                                 "        gl_TessLevelOuter[2]                           = outer_tess_levels[2];\n"
+                                                 "        gl_TessLevelOuter[3]                           = outer_tess_levels[3];\n"
+                                                 "   }\n"
                                                  "}\n";
 
        if (test_type == TESSELLATION_TEST_TYPE_TCS_TES)
@@ -3388,14 +3390,16 @@ void TessellationShaderTCTEgl_TessLevel::initTestDescriptor(_tessellation_test_t
                                                  "\n"
                                                  "${TESSELLATION_SHADER_REQUIRE}\n"
                                                  "\n"
-                                                 "layout (isolines, point_mode, VERTEX_SPACING_MODE) in;\n"
+                                                 "layout (quads, point_mode, VERTEX_SPACING_MODE) in;\n"
                                                  "\n"
                                                  "out vec2 result_tess_level_inner;\n"
                                                  "out vec4 result_tess_level_outer;\n"
                                                  "\n"
                                                  "void main()\n"
                                                  "{\n"
-                                                 "    gl_Position = gl_in[0].gl_Position;\n"
+                                                 "    vec4 p1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+                                                 "    vec4 p2 = mix(gl_in[2].gl_Position,gl_in[3].gl_Position,gl_TessCoord.x);\n"
+                                                 "    gl_Position = mix(p1, p2, gl_TessCoord.y);\n"
                                                  "\n"
                                                  "    result_tess_level_inner = vec2(gl_TessLevelInner[0],\n"
                                                  "                                   gl_TessLevelInner[1]);\n"
@@ -3535,8 +3539,8 @@ tcu::TestNode::IterateResult TessellationShaderTCTEgl_TessLevel::iterate(void)
        /* Initialize ES test objects */
        initTest();
 
-       /* Our program object takes a single vertex per patch */
-       gl.patchParameteri(m_glExtTokens.PATCH_VERTICES, 1);
+       /* Our program object takes a single quad per patch */
+       gl.patchParameteri(m_glExtTokens.PATCH_VERTICES, 4);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameteriEXT() call failed");
 
        /* Prepare for rendering */
@@ -3566,6 +3570,11 @@ tcu::TestNode::IterateResult TessellationShaderTCTEgl_TessLevel::iterate(void)
                                                                                                tessellation_level_combinations[n_combination * 6 + 4],
                                                                                                tessellation_level_combinations[n_combination * 6 + 5] };
 
+                       TessellationShaderUtils tessUtils(gl, this);
+                       const unsigned int              n_rendered_vertices = tessUtils.getAmountOfVerticesGeneratedByTessellator(
+                               TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS, inner_tess_level, outer_tess_level,
+                               test_iterator->vertex_spacing, true); /* is_point_mode_enabled */
+
                        /* Test type determines how the tessellation levels should be set. */
                        gl.useProgram(test_iterator->po_id);
                        GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() call failed");
@@ -3609,31 +3618,10 @@ tcu::TestNode::IterateResult TessellationShaderTCTEgl_TessLevel::iterate(void)
                        } /* switch (test_iterator->type) */
 
                        /* Set up storage properties for the buffer object, to which XFBed data will be
-                        * written:
-                        *
-                        * op(Outer[0])   tells how many times amount of points should be multiplied.
-                        * op(Outer[1])+1 tells how many points we will receive.
-                        *
-                        * where op() defines an operator, behavior of which is determined by the vertex
-                        * ordering mode specified in tessellation evaluation shader.
-                        *
-                        * Hence, we should be expecting Outer[0] * (Outer[1] + 1) points.
-                        **/
-                       float outer_level0_clamped = 0.0f;
-                       float outer_level1_clamped = 0.0f;
-
-                       TessellationShaderUtils::getTessellationLevelAfterVertexSpacing(
-                               TESSELLATION_SHADER_VERTEX_SPACING_EQUAL, outer_tess_level[0], m_gl_max_tess_gen_level_value,
-                               DE_NULL, /* out_clamped */
-                               &outer_level0_clamped);
-                       TessellationShaderUtils::getTessellationLevelAfterVertexSpacing(
-                               test_iterator->vertex_spacing, outer_tess_level[1], m_gl_max_tess_gen_level_value,
-                               DE_NULL, /* out_clamped */
-                               &outer_level1_clamped);
-
-                       const unsigned int n_bytes_needed = static_cast<unsigned int>(
-                               (unsigned int)(outer_level0_clamped) * (unsigned int)(outer_level1_clamped + 1) *
-                               (2 /* vec2 */ + 4 /* vec4 */) * sizeof(float));
+                        * written.
+                        */
+                       const unsigned int n_bytes_needed =
+                               static_cast<unsigned int>(n_rendered_vertices * (2 /* vec2 */ + 4 /* vec4 */) * sizeof(float));
 
                        gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, n_bytes_needed, NULL /* data */, GL_STATIC_DRAW);
                        GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() call failed");
@@ -3643,7 +3631,7 @@ tcu::TestNode::IterateResult TessellationShaderTCTEgl_TessLevel::iterate(void)
                        GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginTransformFeedback() call failed");
                        {
                                /* A single vertex will do, since we configured GL_PATCH_VERTICES_EXT to be 1 */
-                               gl.drawArrays(GL_PATCHES_EXT, 0 /* first */, 1 /* count */);
+                               gl.drawArrays(GL_PATCHES_EXT, 0 /* first */, 4 /* count */);
 
                                GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() call failed");
                        }