/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2014-2016 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */ /*!
 * \file
 * \brief
 */ /*-------------------------------------------------------------------*/

#include "esextcTessellationShaderInvariance.hpp"
#include "gluContextInfo.hpp"
#include "gluDefs.hpp"
#include "glwEnums.hpp"
#include "glwFunctions.hpp"
#include "tcuTestLog.hpp"

namespace glcts
{

/* Defines a single vertex in tessellation space */
typedef struct _vertex
{
    float u;
    float v;
    float w;

    _vertex()
    {
        u = 0.0f;
        v = 0.0f;
        w = 0.0f;
    }
} _vertex;

/** Constructor
 *
 * @param context Test context
 **/
TessellationShaderInvarianceTests::TessellationShaderInvarianceTests(glcts::Context &context,
                                                                     const ExtParameters &extParams)
    : TestCaseGroupBase(context, extParams, "tessellation_invariance",
                        "Verifies the implementation conforms to invariance rules.")
{
    /* No implementation needed */
}

/**
 * Initializes test groups for geometry shader tests
 **/
void TessellationShaderInvarianceTests::init(void)
{
    addChild(new glcts::TessellationShaderInvarianceRule1Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule2Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule3Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule4Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule5Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule6Test(m_context, m_extParams));
    addChild(new glcts::TessellationShaderInvarianceRule7Test(m_context, m_extParams));
}

/** Constructor
 *
 * @param context     Test context
 * @param name        Test name
 * @param description Test description
 **/
TessellationShaderInvarianceBaseTest::TessellationShaderInvarianceBaseTest(Context &context,
                                                                           const ExtParameters &extParams,
                                                                           const char *name, const char *description)
    : TestCaseBase(context, extParams, name, description)
    , m_utils_ptr(DE_NULL)
    , m_bo_id(0)
    , m_qo_tfpw_id(0)
    , m_vao_id(0)
{
    /* Left blank on purpose */
}

/** Deinitializes ES objects created for the test. */
void TessellationShaderInvarianceBaseTest::deinit()
{
    /* Call base class' deinit() */
    TestCaseBase::deinit();

    if (!m_is_tessellation_shader_supported)
    {
        return;
    }

    const glw::Functions &gl = m_context.getRenderContext().getFunctions();

    /* Revert buffer object bindings */
    gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0 /* buffer */);
    gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0 /* index */, 0 /* buffer */);

    /* Disable GL_RASTERIZER_DISCARD mode */
    gl.disable(GL_RASTERIZER_DISCARD);

    /* Reset GL_PATCH_VERTICES_EXT to default value */
    gl.patchParameteri(m_glExtTokens.PATCH_VERTICES, 3);

    /* Unbind vertex array object */
    gl.bindVertexArray(0);

    /* Deinitialize all ES objects that were created for test purposes */
    if (m_bo_id != 0)
    {
        gl.deleteBuffers(1, &m_bo_id);

        m_bo_id = 0;
    }

    for (_programs_iterator it = m_programs.begin(); it != m_programs.end(); ++it)
    {
        _test_program &program = *it;

        if (program.po_id != 0)
        {
            gl.deleteProgram(program.po_id);
        }
    }
    m_programs.clear();

    if (m_qo_tfpw_id != 0)
    {
        gl.deleteQueries(1, &m_qo_tfpw_id);

        m_qo_tfpw_id = 0;
    }

    if (m_vao_id != 0)
    {
        gl.deleteVertexArrays(1, &m_vao_id);

        m_vao_id = 0;
    }

    /* Deinitialize TS utils instance */
    if (m_utils_ptr != NULL)
    {
        delete m_utils_ptr;

        m_utils_ptr = NULL;
    }
}

/** Executes a single-counted GL_PATCHES_EXT draw call.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param n_iteration Not used.
 *
 **/
void TessellationShaderInvarianceBaseTest::executeDrawCall(unsigned int n_iteration)
{
    const glw::Functions &gl = m_context.getRenderContext().getFunctions();

    DE_UNREF(n_iteration);

    gl.drawArrays(m_glExtTokens.PATCHES, 0 /* first */, getDrawCallCountArgument());
    GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawArrays() call failed");
}

/** Returns a value that should be used for the draw call's "count" argument.
 *
 *  @param Always 1
 **/
unsigned int TessellationShaderInvarianceBaseTest::getDrawCallCountArgument()
{
    return 1;
}

/** Returns source code for fragment shader stage which does
 *  not do anything.
 *
 *  @param n_iteration Not used.
 *
 *  @return Requested string.
 **/
std::string TessellationShaderInvarianceBaseTest::getFSCode(unsigned int n_iteration)
{
    DE_UNREF(n_iteration);

    std::string result = "${VERSION}\n"
                         "\n"
                         "void main()\n"
                         "{\n"
                         "}\n";

    return result;
}

/** Retrieves name of a vec2 uniform that stores inner tesselaton level information,
 *  later assigned to gl_TessLevelInner in tessellation evaluation shader.
 *
 *  @return Requested name.
 **/
const char *TessellationShaderInvarianceBaseTest::getInnerTessLevelUniformName()
{
    static const char *result = "inner_tess_level";

    return result;
}

/** Retrieves name of a vec4 uniform that stores outer tesselation level information,
 *  later assigned to gl_TessLevelOuter in tessellation evaluation shader.
 *
 *  @return Requested name.
 **/
const char *TessellationShaderInvarianceBaseTest::getOuterTessLevelUniformName()
{
    static const char *result = "outer_tess_level";

    return result;
}

/** Returns generic tessellation control shader code, which sends 4 output patch
 *  to tessellation evaluation shader stage and uses the very first input patch
 *  vertex only.
 *
 *  @return Tessellation control source code.
 */
std::string TessellationShaderInvarianceBaseTest::getTCCode(unsigned int n_iteration)
{
    DE_UNREF(n_iteration);

    /* In order to support all three primitive types, our generic tessellation
     * control shader will pass 4 vertices to TE stage */
    return TessellationShaderUtils::getGenericTCCode(4, /* n_patch_vertices */
                                                     false);
}

/** Retrieves XFB properties for the test pass.
 *
 *  @param n_iteration Not used.
 *  @param out_n_names Deref will be used to store amount of strings @param *out_n_names
 *                     offers.
 *  @param out_names   Deref will be used to store pointer to an array of strings holding
 *                     names of varyings that should be captured via transform feedback.
 *                     Must not be NULL.
 *
 **/
void TessellationShaderInvarianceBaseTest::getXFBProperties(unsigned int n_iteration, unsigned int *out_n_names,
                                                            const char ***out_names)
{
    static const char *names[] = {"result_uvw"};

    DE_UNREF(n_iteration);

    *out_n_names = 1;
    *out_names   = names;
}

/** Returns vertex shader source code. The shader sets gl_Position to
 *  vec4(1, 2, 3, 0).
 *
 *  @return Vertex shader source code.
 **/
std::string TessellationShaderInvarianceBaseTest::getVSCode(unsigned int n_iteration)
{
    DE_UNREF(n_iteration);

    std::string result = "${VERSION}\n"
                         "\n"
                         "void main()\n"
                         "{\n"
                         "    gl_Position = vec4(1.0, 2.0, 3.0, 0.0);\n"
                         "}\n";

    return result;
}

/** Initializes ES objects required to execute the test.
 *
 *  Throws TestError exception if an error occurs.
 *
 **/
void TessellationShaderInvarianceBaseTest::initTest()
{
    const glw::Functions &gl = m_context.getRenderContext().getFunctions();
    glw::GLuint shared_fs_id = 0;
    glw::GLuint shared_tc_id = 0;
    glw::GLuint shared_te_id = 0;
    glw::GLuint shared_vs_id = 0;

    gl.genVertexArrays(1, &m_vao_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "Could not generate vertex array object");

    gl.bindVertexArray(m_vao_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "Error binding vertex array object!");

    /* Initialize GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN query object */
    gl.genQueries(1, &m_qo_tfpw_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGenQueries() call failed");

    /* Initialize tessellation shader utils */
    m_utils_ptr = new TessellationShaderUtils(gl, this);

    /* Initialize a buffer object we will use to store XFB data.
     * Note: we intentionally skip a glBufferData() call here,
     *       the actual buffer storage size is iteration-specific.
     **/
    gl.genBuffers(1, &m_bo_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGenBuffers() call failed");

    gl.bindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, m_bo_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer() call failed");

    gl.bindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, /* index */
                      m_bo_id);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBufferBase() call failed");

    /* Iterate through all iterations */
    const unsigned int n_iterations = getAmountOfIterations();
    m_programs.reserve(n_iterations);

    const glw::GLenum SHADER_TYPE_FRAGMENT                = GL_FRAGMENT_SHADER;
    const glw::GLenum SHADER_TYPE_TESSELLATION_CONTROL    = m_glExtTokens.TESS_CONTROL_SHADER;
    const glw::GLenum SHADER_TYPE_TESSELLATION_EVALUATION = m_glExtTokens.TESS_EVALUATION_SHADER;
    const glw::GLenum SHADER_TYPE_VERTEX                  = GL_VERTEX_SHADER;

    for (unsigned int n_iteration = 0; n_iteration < n_iterations; ++n_iteration)
    {
        _test_program program;

        /* Create an iteration-specific program object */
        program.po_id = gl.createProgram();

        GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram() call failed.");

        /* Query the implementation on which shader types should be compiled on
         * a per-iteration basis, and which can be initialized only once */
        static const glw::GLenum shader_types[]  = {SHADER_TYPE_FRAGMENT, SHADER_TYPE_TESSELLATION_CONTROL,
                                                    SHADER_TYPE_TESSELLATION_EVALUATION, SHADER_TYPE_VERTEX};
        static const unsigned int n_shader_types = sizeof(shader_types) / sizeof(shader_types[0]);

        for (unsigned int n_shader_type = 0; n_shader_type < n_shader_types; ++n_shader_type)
        {
            std::string shader_body;
            const char *shader_body_ptr = DE_NULL;
            glw::GLuint shader_id       = 0;
            glw::GLenum shader_type     = shader_types[n_shader_type];
            glw::GLenum shader_type_es  = (glw::GLenum)shader_type;

            // Check whether the test should use a separate program objects for each iteration.
            bool is_shader_iteration_specific = false;
            if (shader_type == SHADER_TYPE_TESSELLATION_EVALUATION)
            {
                is_shader_iteration_specific = true;
            }
            else if ((shader_type != SHADER_TYPE_FRAGMENT) && (shader_type != SHADER_TYPE_TESSELLATION_CONTROL) &&
                     (shader_type != SHADER_TYPE_VERTEX))
            {
                TCU_FAIL("Unrecognized shader type");
            }

            /* We need to initialize the shader object if:
             *
             * - its body differs between iterations;
             * - its body is shared by all iterations AND this is the first iteration
             */
            bool has_shader_been_generated = false;

            if ((!is_shader_iteration_specific && n_iteration == 0) || is_shader_iteration_specific)
            {
                /* Create the shader object */
                has_shader_been_generated = true;
                shader_id                 = gl.createShader(shader_type_es);
                GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader() call failed");

                /* Assign shader body to the object */
                if (shader_type == SHADER_TYPE_FRAGMENT)
                {
                    shader_body = getFSCode(n_iteration);
                }
                else if (shader_type == SHADER_TYPE_TESSELLATION_CONTROL)
                {
                    shader_body = getTCCode(n_iteration);
                }
                else if (shader_type == SHADER_TYPE_TESSELLATION_EVALUATION)
                {
                    shader_body = getTECode(n_iteration);
                }
                else if (shader_type == SHADER_TYPE_VERTEX)
                {
                    shader_body = getVSCode(n_iteration);
                }
                else
                {
                    TCU_FAIL("Unrecognized shader type");
                }

                shader_body_ptr = shader_body.c_str();

                shaderSourceSpecialized(shader_id, 1, &shader_body_ptr);
                GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() call failed");

                /* Compile the shader object */
                m_utils_ptr->compileShaders(1,                 /* n_shaders */
                                            &shader_id, true); /* should_succeed */

                /* If this is a shader object that will be shared by all iterations, cache it
                 * in a dedicated variable */
                if (!is_shader_iteration_specific)
                {
                    if (shader_type == SHADER_TYPE_FRAGMENT)
                    {
                        shared_fs_id = shader_id;
                    }
                    else if (shader_type == SHADER_TYPE_TESSELLATION_CONTROL)
                    {
                        shared_tc_id = shader_id;
                    }
                    else if (shader_type == SHADER_TYPE_TESSELLATION_EVALUATION)
                    {
                        shared_te_id = shader_id;
                    }
                    else if (shader_type == SHADER_TYPE_VERTEX)
                    {
                        shared_vs_id = shader_id;
                    }
                    else
                    {
                        TCU_FAIL("Unrecognized shader type");
                    }
                } /* if (!is_shader_iteration_specific) */
            }     /* if (shader object needs to be initialized) */
            else
            {
                shader_id = (shader_type == SHADER_TYPE_FRAGMENT)                ? shared_fs_id :
                            (shader_type == SHADER_TYPE_TESSELLATION_CONTROL)    ? shared_tc_id :
                            (shader_type == SHADER_TYPE_TESSELLATION_EVALUATION) ? shared_te_id :
                                                                                   shared_vs_id;
            }

            /* Attach the shader object to iteration-specific program object */
            gl.attachShader(program.po_id, shader_id);

            GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() call failed.");

            /* Now that the object has been attached, we can flag it for deletion */
            if (has_shader_been_generated)
            {
                gl.deleteShader(shader_id);
                GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteShader() call failed");
            }
        } /* for (all shader types) */

        /* Set up transform feed-back */
        unsigned int n_xfb_names = 0;
        const char **xfb_names   = NULL;

        getXFBProperties(n_iteration, &n_xfb_names, &xfb_names);

        gl.transformFeedbackVaryings(program.po_id, n_xfb_names, xfb_names, GL_INTERLEAVED_ATTRIBS);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glTransformFeedbackVaryings() call failed.");

        /* Try to link the program object */
        glw::GLint link_status = GL_FALSE;

        gl.linkProgram(program.po_id);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() call failed");

        gl.getProgramiv(program.po_id, GL_LINK_STATUS, &link_status);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call failed");

        if (link_status != GL_TRUE)
        {
            TCU_FAIL("Program linking failed");
        }

        /* Retrieve inner/outer tess level uniform locations */
        program.inner_tess_level_uniform_location =
            gl.getUniformLocation(program.po_id, getInnerTessLevelUniformName());
        program.outer_tess_level_uniform_location =
            gl.getUniformLocation(program.po_id, getOuterTessLevelUniformName());

        GLU_EXPECT_NO_ERROR(gl.getError(), "glGetUniformLocation() call(s) failed");

        /* Store the program object */
        m_programs.push_back(program);
    } /* for (all iterations) */
}

/** Executes the test.
 *
 *  Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise.
 *
 *  Note the function throws exception should an error occur!
 *
 *  @return STOP if the test has finished, CONTINUE to indicate iterate() should be called once again.
 **/
tcu::TestNode::IterateResult TessellationShaderInvarianceBaseTest::iterate(void)
{
    /* Do not execute if required extensions are not supported. */
    if (!m_is_tessellation_shader_supported)
    {
        throw tcu::NotSupportedError(TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED);
    }

    /* Initialize all objects needed to run the test */
    initTest();

    /* Do a general set-up */
    const glw::Functions &gl = m_context.getRenderContext().getFunctions();

    gl.enable(GL_RASTERIZER_DISCARD);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable(GL_RASTERIZER_DISCARD) failed.");

    gl.patchParameteri(m_glExtTokens.PATCH_VERTICES, 1);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glPatchParameteriEXT() failed for GL_PATCH_VERTICES_EXT pname");

    /* There are two types of verification supported by this base test implementation:
     *
     * - iteration-specific (verifyResultDataForIteration() )
     * - global             (verifyResultData() )
     *
     * It is up to test implementation to decide which of the two (or perhaps both)
     * entry-points it should overload and use for validating the result data.
     */
    const unsigned int n_iterations = getAmountOfIterations();
    char **iteration_data           = new char *[n_iterations];

    /* Execute the test */
    for (unsigned int n_iteration = 0; n_iteration < n_iterations; ++n_iteration)
    {
        _test_program &program = m_programs[n_iteration];

        /* Retrieve iteration properties for current iteration */
        unsigned int bo_size                                 = 0;
        float inner_tess_levels[2]                           = {0};
        bool is_point_mode                                   = false;
        float outer_tess_levels[4]                           = {0};
        _tessellation_primitive_mode primitive_mode          = TESSELLATION_SHADER_PRIMITIVE_MODE_UNKNOWN;
        _tessellation_shader_vertex_ordering vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_UNKNOWN;

        getIterationProperties(n_iteration, inner_tess_levels, outer_tess_levels, &is_point_mode, &primitive_mode,
                               &vertex_ordering, &bo_size);

        DE_ASSERT(bo_size != 0);

        /* Activate iteration-specific program */
        gl.useProgram(program.po_id);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram() failed.");

        /* Set up buffer object storage */
        {
            char *zero_bo_data = new char[bo_size];

            memset(zero_bo_data, 0, bo_size);

            gl.bufferData(GL_TRANSFORM_FEEDBACK_BUFFER, bo_size, zero_bo_data, GL_STATIC_DRAW);
            GLU_EXPECT_NO_ERROR(gl.getError(), "glBufferData() failed");

            delete[] zero_bo_data;
            zero_bo_data = NULL;
        }

        /* Allocate space for iteration-specific data */
        iteration_data[n_iteration] = new char[bo_size];

        /* Configure inner/outer tessellation levels as requested for the iteration */
        gl.uniform2fv(program.inner_tess_level_uniform_location, 1, /* count */
                      inner_tess_levels);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform2fv() call failed");

        gl.uniform4fv(program.outer_tess_level_uniform_location, 1, /* count */
                      outer_tess_levels);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform4fv() call failed");

        /* Launch the TFPW query */
        gl.beginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, m_qo_tfpw_id);
        GLU_EXPECT_NO_ERROR(gl.getError(),
                            "glBeginQuery() for GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN target failed.");

        /* Prepare for TF */
        glw::GLenum tf_mode = TessellationShaderUtils::getTFModeForPrimitiveMode(primitive_mode, is_point_mode);

        gl.beginTransformFeedback(tf_mode);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glBeginTransformFeedback() call failed");
        {
            /* Execute the draw call */
            executeDrawCall(n_iteration);

            GLU_EXPECT_NO_ERROR(gl.getError(), "Draw call failed");
        }
        gl.endTransformFeedback();
        GLU_EXPECT_NO_ERROR(gl.getError(), "glEndTransformFeedback() call failed");

        gl.endQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN) call failed");

        /* Make sure that we had sufficient amount of space in a buffer object we used to
         * capture XFB data.
         **/
        glw::GLuint n_tf_primitives_written = 0;
        glw::GLuint used_tf_bo_size         = 0;

        gl.getQueryObjectuiv(m_qo_tfpw_id, GL_QUERY_RESULT, &n_tf_primitives_written);
        GLU_EXPECT_NO_ERROR(gl.getError(),
                            "Could not retrieve GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN query object result");

        if (is_point_mode)
        {
            used_tf_bo_size = static_cast<glw::GLuint>(n_tf_primitives_written * sizeof(float) * 3 /* components */);
        }
        else if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_ISOLINES)
        {
            used_tf_bo_size = static_cast<glw::GLuint>(n_tf_primitives_written * sizeof(float) * 2 /* vertices */ *
                                                       3 /* components */);
        }
        else
        {
            used_tf_bo_size = static_cast<glw::GLuint>(n_tf_primitives_written * sizeof(float) * 3 /* vertices */ *
                                                       3 /* components */);
        }

        if (used_tf_bo_size != bo_size)
        {
            m_testCtx.getLog() << tcu::TestLog::Message << "Expected " << bo_size
                               << " to be filled with tessellation data, "
                                  "only "
                               << used_tf_bo_size << "was used." << tcu::TestLog::EndMessage;

            TCU_FAIL("Amount of primitives generated during TF does not match amount of primitives that were expected"
                     " to be generated by the tessellator");
        }

        /* Map the buffer object we earlier bound to GL_TRANSFORM_FEEDBACK_BUFFER
         * target into process space. */
        const void *xfb_data = gl.mapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, /* offset */
                                                 bo_size, GL_MAP_READ_BIT);

        GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBufferRange() call failed");

        memcpy(iteration_data[n_iteration], xfb_data, bo_size);

        /* Unmap the buffer object */
        gl.unmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
        GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer() call failed");

        /* Ask the test implementation to verify the results */
        verifyResultDataForIteration(n_iteration, iteration_data[n_iteration]);
    } /* for (all iterations) */

    /* Now that we've executed all iterations, we can call a global verification
     * entry-point */
    verifyResultData((const void **)iteration_data);

    /* At this point we're safe to release space allocated for data coming from
     * all the iterations */
    for (unsigned int n_iteration = 0; n_iteration < n_iterations; ++n_iteration)
    {
        char *iter_data = (char *)iteration_data[n_iteration];
        delete[] iter_data;

        iteration_data[n_iteration] = DE_NULL;
    } /* for (all iterations) */

    delete[] iteration_data;
    iteration_data = DE_NULL;

    /* All done */
    m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
    return STOP;
}

/* Does nothing (stub implementation)
 *
 * @param n_iteration Not used.
 * @param data        Not used.
 *
 **/
void TessellationShaderInvarianceBaseTest::verifyResultDataForIteration(unsigned int n_iteration, const void *data)
{
    DE_UNREF(n_iteration && data);

    /* Do nothing - this is just a stub. */
}

/* Does nothing (stub implementation)
 *
 * @param all_iterations_data Not used.
 *
 **/
void TessellationShaderInvarianceBaseTest::verifyResultData(const void **all_iterations_data)
{
    DE_UNREF(all_iterations_data);

    /* Do nothing - this is just a stub. */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule1Test::TessellationShaderInvarianceRule1Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule1",
                                           "Verifies conformance with first invariance rule")
{
    /* Left blank intentionally */
}

/** Destructor. */
TessellationShaderInvarianceRule1Test::~TessellationShaderInvarianceRule1Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return Always 6.
 **/
unsigned int TessellationShaderInvarianceRule1Test::getAmountOfIterations()
{
    return 6;
}

/** Returns a value that should be used for the draw call's "count" argument.
 *
 *  @param Always 3
 **/
unsigned int TessellationShaderInvarianceRule1Test::getDrawCallCountArgument()
{
    return 3;
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex ordering.
 *                                Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Must not
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule1Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    *out_vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_CCW;

    switch (n_iteration)
    {
    case 0:
    case 5:
    {
        /* Triangles (point mode) */
        out_inner_tess_levels[0] = 1.0f;
        out_outer_tess_levels[0] = 1.0f;
        out_outer_tess_levels[1] = 1.0f;
        out_outer_tess_levels[2] = 1.0f;

        *out_point_mode     = true;
        *out_primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES;

        break;
    }

    case 1:
    case 3:
    {
        /* Lines */
        out_outer_tess_levels[0] = 1.0f;
        out_outer_tess_levels[1] = 1.0f;

        *out_point_mode     = false;
        *out_primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_ISOLINES;

        break;
    }

    case 2:
    case 4:
    {
        /* Triangles */
        out_inner_tess_levels[0] = 1.0f;
        out_outer_tess_levels[0] = 1.0f;
        out_outer_tess_levels[1] = 1.0f;
        out_outer_tess_levels[2] = 1.0f;

        *out_point_mode     = false;
        *out_primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES;

        break;
    }

    default:
    {
        TCU_FAIL("Unrecognzied iteration index");
    }
    }

    *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
        *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
        *out_point_mode);

    *out_result_buffer_size = static_cast<unsigned int>(*out_result_buffer_size * getDrawCallCountArgument() *
                                                        3 /* components */ * sizeof(float));

    DE_ASSERT(*out_result_buffer_size != 0);
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule1Test::getTECode(unsigned int n_iteration)
{
    unsigned int bo_size                                 = 0;
    float inner_tess_levels[2]                           = {0};
    float outer_tess_levels[4]                           = {0};
    bool point_mode                                      = false;
    _tessellation_primitive_mode primitive_mode          = TESSELLATION_SHADER_PRIMITIVE_MODE_UNKNOWN;
    _tessellation_shader_vertex_ordering vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_UNKNOWN;

    getIterationProperties(n_iteration, inner_tess_levels, outer_tess_levels, &point_mode, &primitive_mode,
                           &vertex_ordering, &bo_size);

    return TessellationShaderUtils::getGenericTECode(TESSELLATION_SHADER_VERTEX_SPACING_EQUAL, primitive_mode,
                                                     vertex_ordering, point_mode);
}

/** Verifies result data. Accesses data generated by all iterations.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param all_iterations_data An array of pointers to buffers, holding gl_TessCoord
 *                             data generated by subsequent iterations.
 **/
void TessellationShaderInvarianceRule1Test::verifyResultData(const void **all_iterations_data)
{
    const float *lines_vertex_data_1 = (const float *)all_iterations_data[1];
    const float *lines_vertex_data_2 = (const float *)all_iterations_data[3];
    const float *point_vertex_data_1 = (const float *)all_iterations_data[0];
    const float *point_vertex_data_2 = (const float *)all_iterations_data[5];
    const float *tris_vertex_data_1  = (const float *)all_iterations_data[2];
    const float *tris_vertex_data_2  = (const float *)all_iterations_data[4];

    const unsigned int n_line_vertices  = 2 /* vertices per line segment */ * getDrawCallCountArgument(); /* lines */
    const unsigned int n_point_vertices = 1 /* vertices per point */ * getDrawCallCountArgument();        /* points */
    const unsigned int n_tri_vertices   = 3 /* vertices per triangle */ * getDrawCallCountArgument(); /* triangles */
    const unsigned int vertex_size      = sizeof(float) * 3;                                          /* components */

    /* Make sure the data sets match, given different draw call ordering */
    for (int n_type = 0; n_type < 3 /* lines, points, tris */; ++n_type)
    {
        const float *data1_ptr = DE_NULL;
        const float *data2_ptr = DE_NULL;
        std::string data_type_string;
        unsigned int n_vertices = 0;

        switch (n_type)
        {
        case 0:
        {
            data1_ptr        = lines_vertex_data_1;
            data2_ptr        = lines_vertex_data_2;
            data_type_string = "Line";
            n_vertices       = n_line_vertices;

            break;
        }

        case 1:
        {
            data1_ptr        = point_vertex_data_1;
            data2_ptr        = point_vertex_data_2;
            data_type_string = "Point";
            n_vertices       = n_point_vertices;

            break;
        }

        case 2:
        {
            data1_ptr        = tris_vertex_data_1;
            data2_ptr        = tris_vertex_data_2;
            data_type_string = "Triangle";
            n_vertices       = n_tri_vertices;

            break;
        }

        default:
        {
            TCU_FAIL("Internal error: type index was not recognized");
        }
        } /* switch (n_type) */

        /* Make sure the buffer storage in both cases has been modified */
        {
            unsigned int zero_bo_size = vertex_size * n_vertices;
            char *zero_bo_data        = new char[vertex_size * n_vertices];

            memset(zero_bo_data, 0, zero_bo_size);

            if (memcmp(data1_ptr, zero_bo_data, zero_bo_size) == 0 ||
                memcmp(data2_ptr, zero_bo_data, zero_bo_size) == 0)
            {
                TCU_FAIL("One of the draw calls has not outputted any data to XFB buffer object storage");
            }

            delete[] zero_bo_data;
            zero_bo_data = NULL;
        }

        /* Compare the data */
        if (memcmp(data1_ptr, data2_ptr, vertex_size * n_vertices) != 0)
        {
            std::stringstream logMessage;

            logMessage << data_type_string << " data rendered in pass 1: (";

            for (unsigned int n_vertex = 0; n_vertex < n_vertices; ++n_vertex)
            {
                logMessage << data1_ptr[n_vertex];

                if (n_vertex != (n_vertices - 1))
                {
                    logMessage << ", ";
                }
                else
                {
                    logMessage << ") ";
                }
            } /* for (all vertices) */

            logMessage << "and in pass 2: (";

            for (unsigned int n_vertex = 0; n_vertex < n_vertices; ++n_vertex)
            {
                logMessage << data2_ptr[n_vertex];

                if (n_vertex != (n_vertices - 1))
                {
                    logMessage << ", ";
                }
                else
                {
                    logMessage << ") ";
                }
            } /* for (all vertices) */

            logMessage << "do not match";

            m_testCtx.getLog() << tcu::TestLog::Message << logMessage.str().c_str() << tcu::TestLog::EndMessage;

            TCU_FAIL("Data mismatch");
        } /* if (data mismatch) */
    }     /* for (all primitive types) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule2Test::TessellationShaderInvarianceRule2Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule2",
                                           "Verifies conformance with second invariance rule")
{
    memset(m_n_tessellated_vertices, 0, sizeof(m_n_tessellated_vertices));
}

/** Destructor. */
TessellationShaderInvarianceRule2Test::~TessellationShaderInvarianceRule2Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return Always 4.
 **/
unsigned int TessellationShaderInvarianceRule2Test::getAmountOfIterations()
{
    return 4;
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule2Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    *out_vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_CCW;

    switch (n_iteration)
    {
    case 0:
    case 1:
    {
        /* Triangles */
        out_outer_tess_levels[0] = 2.0f;
        out_outer_tess_levels[1] = 3.0f;
        out_outer_tess_levels[2] = 4.0f;

        if (n_iteration == 0)
        {
            out_inner_tess_levels[0] = 4.0f;
            out_inner_tess_levels[1] = 5.0f;
        }
        else
        {
            out_inner_tess_levels[0] = 3.0f;
            out_inner_tess_levels[1] = 4.0f;
        }

        *out_point_mode     = false;
        *out_primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES;

        break;
    }

    case 2:
    case 3:
    {
        /* Quads */
        out_outer_tess_levels[0] = 2.0f;
        out_outer_tess_levels[1] = 3.0f;
        out_outer_tess_levels[2] = 4.0f;
        out_outer_tess_levels[3] = 5.0f;

        if (n_iteration == 2)
        {
            out_inner_tess_levels[0] = 2.0f;
            out_inner_tess_levels[1] = 3.0f;
        }
        else
        {
            out_inner_tess_levels[0] = 4.0f;
            out_inner_tess_levels[1] = 5.0f;
        }

        *out_point_mode     = false;
        *out_primitive_mode = TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS;

        break;
    }

    default:
    {
        TCU_FAIL("Unrecognized iteration index");
    }
    }

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
            *out_point_mode);

        m_n_tessellated_vertices[n_iteration] = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule2Test::getTECode(unsigned int n_iteration)
{
    unsigned int bo_size                                 = 0;
    float inner_tess_levels[2]                           = {0};
    float outer_tess_levels[4]                           = {0};
    bool point_mode                                      = false;
    _tessellation_primitive_mode primitive_mode          = TESSELLATION_SHADER_PRIMITIVE_MODE_UNKNOWN;
    _tessellation_shader_vertex_ordering vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_UNKNOWN;

    getIterationProperties(n_iteration, inner_tess_levels, outer_tess_levels, &point_mode, &primitive_mode,
                           &vertex_ordering, &bo_size);

    return TessellationShaderUtils::getGenericTECode(TESSELLATION_SHADER_VERTEX_SPACING_EQUAL, primitive_mode,
                                                     vertex_ordering, point_mode);
}

/** Verifies result data. Accesses data generated by all iterations.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param all_iterations_data An array of pointers to buffers, holding gl_TessCoord
 *                             data generated by subsequent iterations.
 **/
void TessellationShaderInvarianceRule2Test::verifyResultData(const void **all_iterations_data)
{
    /* Iterate through one tessellated set of vertices for a given primitive type
     * and identify outer vertices. Make sure exactly the same vertices can be
     * found in the other set of vertices, generated with different input tessellation
     * level.
     */
    for (int n_primitive_type = 0; n_primitive_type < 2; /* triangles / quads */
         ++n_primitive_type)
    {
        const float *data1_ptr                      = (const float *)all_iterations_data[n_primitive_type * 2 + 0];
        const float *data2_ptr                      = (const float *)all_iterations_data[n_primitive_type * 2 + 1];
        _tessellation_primitive_mode primitive_mode = (n_primitive_type == 0) ?
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES :
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS;
        std::vector<_vertex> outer_vertices;

        /* Iterate through all data1 vertices.. */
        for (unsigned int n_vertex = 0; n_vertex < m_n_tessellated_vertices[n_primitive_type * 2]; ++n_vertex)
        {
            /* Check if any of the components is equal to 0 or 1. If so, this could
             * be an edge vertex.
             */
            const float *vertex_ptr = data1_ptr + n_vertex * 3; /* components */

            if (TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, vertex_ptr))
            {
                /* Only add the vertex if it has not been added already to the vector */
                bool has_already_been_added = false;

                for (std::vector<_vertex>::const_iterator vertex_iterator = outer_vertices.begin();
                     vertex_iterator != outer_vertices.end(); vertex_iterator++)
                {
                    if (vertex_iterator->u == vertex_ptr[0] && vertex_iterator->v == vertex_ptr[1] &&
                        vertex_iterator->w == vertex_ptr[2])
                    {
                        has_already_been_added = true;

                        break;
                    }
                } /* for (all outer vertices stored so far) */

                if (!has_already_been_added)
                {
                    _vertex vertex;

                    vertex.u = vertex_ptr[0];
                    vertex.v = vertex_ptr[1];
                    vertex.w = vertex_ptr[2];

                    outer_vertices.push_back(vertex);
                }
            } /* if (input vertex is located on outer edge) */
        }     /* for (all input vertices) */

        DE_ASSERT(outer_vertices.size() != 0);

        /* Now that we know where outer vertices are, make sure they are present in the other data set */
        for (std::vector<_vertex>::const_iterator ref_vertex_iterator = outer_vertices.begin();
             ref_vertex_iterator != outer_vertices.end(); ref_vertex_iterator++)
        {
            bool has_been_found       = false;
            const _vertex &ref_vertex = *ref_vertex_iterator;

            for (unsigned int n_vertex = 0; n_vertex < m_n_tessellated_vertices[n_primitive_type * 2 + 1]; ++n_vertex)
            {
                const float *vertex_ptr = data2_ptr + n_vertex * 3; /* components */

                if (vertex_ptr[0] == ref_vertex.u && vertex_ptr[1] == ref_vertex.v && vertex_ptr[2] == ref_vertex.w)
                {
                    has_been_found = true;

                    break;
                }
            } /* for (all vertices in the other data set) */

            if (!has_been_found)
            {
                float cmp_inner_tess_levels[2];
                float cmp_outer_tess_levels[4];
                bool cmp_point_mode;
                _tessellation_primitive_mode cmp_primitive_mode;
                _tessellation_shader_vertex_ordering cmp_vertex_ordering;
                std::string primitive_type = (n_primitive_type == 0) ? "triangles" : "quads";
                float ref_inner_tess_levels[2];
                float ref_outer_tess_levels[4];
                bool ref_point_mode;
                _tessellation_primitive_mode ref_primitive_mode;
                _tessellation_shader_vertex_ordering ref_vertex_ordering;

                getIterationProperties(n_primitive_type * 2, ref_inner_tess_levels, ref_outer_tess_levels,
                                       &ref_point_mode, &ref_primitive_mode, &ref_vertex_ordering, NULL);
                getIterationProperties(n_primitive_type * 2 + 1, cmp_inner_tess_levels, cmp_outer_tess_levels,
                                       &cmp_point_mode, &cmp_primitive_mode, &cmp_vertex_ordering, NULL);

                m_testCtx.getLog() << tcu::TestLog::Message << "Outer vertex"
                                   << " (" << ref_vertex.u << ", " << ref_vertex.v << ", " << ref_vertex.w << ")"
                                   << " was not found in tessellated data coordinate set generated"
                                   << " for primitive type: " << primitive_type.c_str()
                                   << ". Reference inner tessellation level:"
                                   << " (" << ref_inner_tess_levels[0] << ", " << ref_inner_tess_levels[1]
                                   << "), reference outer tessellation level:"
                                   << " (" << ref_outer_tess_levels[0] << ", " << ref_outer_tess_levels[1] << ", "
                                   << ref_outer_tess_levels[2] << ", " << ref_outer_tess_levels[3]
                                   << "), test inner tessellation level:"
                                   << " (" << cmp_inner_tess_levels[0] << ", " << cmp_inner_tess_levels[1]
                                   << "), reference outer tessellation level:"
                                   << " (" << cmp_outer_tess_levels[0] << ", " << cmp_outer_tess_levels[1] << ", "
                                   << cmp_outer_tess_levels[2] << ", " << cmp_outer_tess_levels[3] << ")."
                                   << tcu::TestLog::EndMessage;

                TCU_FAIL("Outer edge vertex was not found in tessellated coordinate set generated for "
                         "the same outer tessellation levels and vertex spacing, but different inner "
                         "tessellation levels");
            } /* if (outer edge vertex was not found in the other set) */
        }     /* for (all outer edge vertices) */
    }         /* for (both primitive types) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule3Test::TessellationShaderInvarianceRule3Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule3",
                                           "Verifies conformance with third invariance rule")
{
}

/** Destructor. */
TessellationShaderInvarianceRule3Test::~TessellationShaderInvarianceRule3Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return A value that depends on initTestIterations() behavior.
 **/
unsigned int TessellationShaderInvarianceRule3Test::getAmountOfIterations()
{
    if (m_test_iterations.size() == 0)
    {
        initTestIterations();
    }

    return (unsigned int)m_test_iterations.size();
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule3Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    _test_iteration &test_iteration = m_test_iterations[n_iteration];

    memcpy(out_inner_tess_levels, test_iteration.inner_tess_levels, sizeof(test_iteration.inner_tess_levels));
    memcpy(out_outer_tess_levels, test_iteration.outer_tess_levels, sizeof(test_iteration.outer_tess_levels));

    *out_point_mode      = false;
    *out_primitive_mode  = test_iteration.primitive_mode;
    *out_vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_CCW;

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, test_iteration.vertex_spacing,
            *out_point_mode);
        test_iteration.n_vertices = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule3Test::getTECode(unsigned int n_iteration)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    const _test_iteration &test_iteration = m_test_iterations[n_iteration];

    return TessellationShaderUtils::getGenericTECode(test_iteration.vertex_spacing, test_iteration.primitive_mode,
                                                     TESSELLATION_SHADER_VERTEX_ORDERING_CCW, false); /* point mode */
}

/** Initializes test iterations for the test. The following modes and inner/outer tess level
 *  configurations are used to form the test set:
 *
 *  - Inner/outer tessellation level combinations as returned by
 *    TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode()
 *  - All primitive modes;
 *  - All vertex spacing modes;
 *
 *  All permutations are used to generate the test set.
 **/
void TessellationShaderInvarianceRule3Test::initTestIterations()
{
    DE_ASSERT(m_test_iterations.size() == 0);

    /* Retrieve GL_MAX_TESS_GEN_LEVEL_EXT value */
    const glw::Functions &gl               = m_context.getRenderContext().getFunctions();
    glw::GLint gl_max_tess_gen_level_value = 0;

    gl.getIntegerv(m_glExtTokens.MAX_TESS_GEN_LEVEL, &gl_max_tess_gen_level_value);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_TESS_GEN_LEVEL_EXT pname");

    /* Iterate through all primitive and vertex spacing modes */
    _tessellation_primitive_mode primitive_modes[] = {TESSELLATION_SHADER_PRIMITIVE_MODE_ISOLINES,
                                                      TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS,
                                                      TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES};
    _tessellation_shader_vertex_spacing vs_modes[] = {TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
                                                      TESSELLATION_SHADER_VERTEX_SPACING_FRACTIONAL_EVEN,
                                                      TESSELLATION_SHADER_VERTEX_SPACING_FRACTIONAL_ODD};

    const unsigned int n_primitive_modes = sizeof(primitive_modes) / sizeof(primitive_modes[0]);
    const unsigned int n_vs_modes        = sizeof(vs_modes) / sizeof(vs_modes[0]);

    for (unsigned int n_primitive_mode = 0; n_primitive_mode < n_primitive_modes; ++n_primitive_mode)
    {
        _tessellation_primitive_mode primitive_mode = primitive_modes[n_primitive_mode];

        for (unsigned int n_vs_mode = 0; n_vs_mode < n_vs_modes; ++n_vs_mode)
        {
            _tessellation_shader_vertex_spacing vs_mode = vs_modes[n_vs_mode];

            /* Retrieve inner/outer tessellation level combinations we want the tests to be run for */
            _tessellation_levels_set levels_set;

            levels_set = TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode(
                primitive_mode, gl_max_tess_gen_level_value,
                TESSELLATION_LEVEL_SET_FILTER_ALL_LEVELS_USE_THE_SAME_VALUE);

            /* Iterate through all configurations */
            for (_tessellation_levels_set_const_iterator levels_iterator = levels_set.begin();
                 levels_iterator != levels_set.end(); levels_iterator++)
            {
                const _tessellation_levels &levels = *levels_iterator;

                /* Create a test descriptor for all the parameters we now have */
                _test_iteration test;

                memcpy(test.inner_tess_levels, levels.inner, sizeof(test.inner_tess_levels));
                memcpy(test.outer_tess_levels, levels.outer, sizeof(test.outer_tess_levels));

                test.primitive_mode = primitive_mode;
                test.vertex_spacing = vs_mode;

                m_test_iterations.push_back(test);
            } /* for (all inner/outer tessellation levels) */
        }     /* for (all vertex spacing modes) */
    }         /* for (all primitive modes) */
}

/** Verifies result data on per-iteration basis.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param n_iteration Index of iteration the check should be performed for.
 *  @param data        Points to array of vec3s storing the vertices as
 *                     generated by tessellation
 **/
void TessellationShaderInvarianceRule3Test::verifyResultDataForIteration(unsigned int n_iteration, const void *data)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    const glw::GLfloat *data_float        = (const glw::GLfloat *)data;
    const _test_iteration &test_iteration = m_test_iterations[n_iteration];

    /* Iterate through all generated vertices.. */
    for (unsigned int n_vertex = 0; n_vertex < test_iteration.n_vertices; ++n_vertex)
    {
        _vertex expected_vertex;
        const glw::GLfloat *vertex_data = data_float + 3 /* components */ * n_vertex;

        expected_vertex.u = -1.0f;
        expected_vertex.v = -1.0f;
        expected_vertex.w = -1.0f;

        /* Make sure that for each vertex, the following language from the extension
         * spec is followed:
         */
        switch (test_iteration.primitive_mode)
        {
        case TESSELLATION_SHADER_PRIMITIVE_MODE_ISOLINES:
        {
            /* For isoline tessellation, if it generates vertices at (0,x) and (1,x)
             * where <x> is not zero, it will also generate vertices at exactly (0,1-x)
             * and (1,1-x), respectively.
             */
            if (vertex_data[0] == 0.0f && vertex_data[1] != 0.0f)
            {
                expected_vertex.u = vertex_data[0];
                expected_vertex.v = 1.0f - vertex_data[1];
                expected_vertex.w = -1.0f;
            }
            else if (vertex_data[0] == 1.0f && vertex_data[1] != 0.0f)
            {
                expected_vertex.u = vertex_data[0];
                expected_vertex.v = 1.0f - vertex_data[1];
                expected_vertex.w = -1.0f;
            }

            break;
        } /* case TESSELLATION_SHADER_PRIMITIVE_MODE_ISOLINES: */

        case TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS:
        {
            /* For quad tessellation, if the subdivision generates a vertex with
             * coordinates of (x,0) or (0,x), it will also generate a vertex with
             * coordinates of exactly (1-x,0) or (0,1-x), respectively.
             */
            if (vertex_data[0] != 0.0f && vertex_data[1] == 0.0f)
            {
                expected_vertex.u = 1.0f - vertex_data[0];
                expected_vertex.v = vertex_data[1];
                expected_vertex.w = -1.0f;
            }
            else if (vertex_data[0] == 0.0f && vertex_data[1] != 0.0f)
            {
                expected_vertex.u = vertex_data[0];
                expected_vertex.v = 1.0f - vertex_data[1];
                expected_vertex.w = -1.0f;
            }

            break;
        } /* case TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS: */

        case TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES:
        {
            /* For triangle tessellation, if the subdivision generates a vertex with
             * tessellation coordinates of the form (0,x,1-x), (x,0,1-x), or (x,1-x,0),
             * it will also generate a vertex with coordinates of exactly (0,1-x,x),
             * (1-x,0,x), or (1-x,x,0), respectively.
             */
            if (vertex_data[0] == 0.0f && vertex_data[1] != 0.0f && vertex_data[2] == (1.0f - vertex_data[1]))
            {
                expected_vertex.u = vertex_data[0];
                expected_vertex.v = vertex_data[2];
                expected_vertex.w = vertex_data[1];
            }
            else if (vertex_data[0] != 0.0f && vertex_data[1] == 0.0f && vertex_data[2] == (1.0f - vertex_data[0]))
            {
                expected_vertex.u = vertex_data[2];
                expected_vertex.v = vertex_data[1];
                expected_vertex.w = vertex_data[0];
            }
            else if (vertex_data[0] != 0.0f && vertex_data[1] == (1.0f - vertex_data[0]) && vertex_data[2] == 0.0f)
            {
                expected_vertex.u = vertex_data[1];
                expected_vertex.v = vertex_data[0];
                expected_vertex.w = vertex_data[2];
            }

            break;
        } /* case TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES: */

        default:
        {
            TCU_FAIL("Primitive mode unrecognized");
        }
        } /* switch (test_iteration.primitive_mode) */

        /* If any of the "expected vertex"'s components is no longer negative,
         * make sure the vertex can be found in the result data */
        if (expected_vertex.u >= 0.0f || expected_vertex.v >= 0.0f || expected_vertex.w >= 0.0f)
        {
            bool has_been_found = false;

            for (unsigned int n_find_vertex = 0; n_find_vertex < test_iteration.n_vertices; ++n_find_vertex)
            {
                const glw::GLfloat *current_vertex_data = data_float + 3 /* components */ * n_find_vertex;

                const glw::GLfloat epsilon = 1e-4f;
                glw::GLfloat absDelta[3]   = {de::abs(current_vertex_data[0] - expected_vertex.u),
                                              de::abs(current_vertex_data[1] - expected_vertex.v),
                                              de::abs(current_vertex_data[2] - expected_vertex.w)};

                if (absDelta[0] < epsilon && absDelta[1] < epsilon &&
                    ((expected_vertex.w < 0.0f) || (expected_vertex.w >= 0.0f && absDelta[2] < epsilon)))
                {
                    has_been_found = true;

                    break;
                } /* if (the vertex data matches the expected vertex data) */
            }     /* for (all generated vertices)*/

            if (!has_been_found)
            {
                TCU_FAIL("Expected symmetrical vertex data was not generated by the tessellator.");
            }
        } /* if (any of the components of expected_vertex is no longer negative) */
    }     /* for (all generated vertices) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule4Test::TessellationShaderInvarianceRule4Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule4",
                                           "Verifies conformance with fourth invariance rule")
{
}

/** Destructor. */
TessellationShaderInvarianceRule4Test::~TessellationShaderInvarianceRule4Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return A value that depends on initTestIterations() behavior.
 **/
unsigned int TessellationShaderInvarianceRule4Test::getAmountOfIterations()
{
    if (m_test_iterations.size() == 0)
    {
        initTestIterations();
    }

    return (unsigned int)m_test_iterations.size();
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule4Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    _test_iteration &test_iteration = m_test_iterations[n_iteration];

    memcpy(out_inner_tess_levels, test_iteration.inner_tess_levels, sizeof(test_iteration.inner_tess_levels));
    memcpy(out_outer_tess_levels, test_iteration.outer_tess_levels, sizeof(test_iteration.outer_tess_levels));

    *out_point_mode      = false;
    *out_primitive_mode  = test_iteration.primitive_mode;
    *out_vertex_ordering = TESSELLATION_SHADER_VERTEX_ORDERING_CCW;

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, test_iteration.vertex_spacing,
            *out_point_mode);
        test_iteration.n_vertices = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule4Test::getTECode(unsigned int n_iteration)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    const _test_iteration &test_iteration = m_test_iterations[n_iteration];

    return TessellationShaderUtils::getGenericTECode(test_iteration.vertex_spacing, test_iteration.primitive_mode,
                                                     TESSELLATION_SHADER_VERTEX_ORDERING_CCW, false); /* point mode */
}

/** Initializes test iterations for the test. The following modes and inner/outer tess level
 *  configurations are used to form the test set:
 *
 *  - Inner/outer tessellation level combinations as returned by
 *    TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode()
 *  - 'Quads' and 'Triangles' primitive modes;
 *  - All vertex spacing modes;
 *
 *  All permutations are used to generate the test set.
 **/
void TessellationShaderInvarianceRule4Test::initTestIterations()
{
    DE_ASSERT(m_test_iterations.size() == 0);

    /* Retrieve GL_MAX_TESS_GEN_LEVEL_EXT value */
    const glw::Functions &gl               = m_context.getRenderContext().getFunctions();
    glw::GLint gl_max_tess_gen_level_value = 0;

    gl.getIntegerv(m_glExtTokens.MAX_TESS_GEN_LEVEL, &gl_max_tess_gen_level_value);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_TESS_GEN_LEVEL_EXT pname");

    /* Iterate through all primitive and vertex spacing modes relevant to the test */
    _tessellation_primitive_mode primitive_modes[] = {TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS,
                                                      TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES};
    _tessellation_shader_vertex_spacing vs_modes[] = {TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
                                                      TESSELLATION_SHADER_VERTEX_SPACING_FRACTIONAL_EVEN,
                                                      TESSELLATION_SHADER_VERTEX_SPACING_FRACTIONAL_ODD};

    const unsigned int n_primitive_modes = sizeof(primitive_modes) / sizeof(primitive_modes[0]);
    const unsigned int n_vs_modes        = sizeof(vs_modes) / sizeof(vs_modes[0]);

    for (unsigned int n_primitive_mode = 0; n_primitive_mode < n_primitive_modes; ++n_primitive_mode)
    {
        _tessellation_primitive_mode primitive_mode = primitive_modes[n_primitive_mode];

        for (unsigned int n_vs_mode = 0; n_vs_mode < n_vs_modes; ++n_vs_mode)
        {
            _tessellation_shader_vertex_spacing vs_mode = vs_modes[n_vs_mode];

            /* Retrieve inner/outer tessellation level combinations we want the tests to be run for */
            _tessellation_levels_set levels;

            levels = TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode(
                primitive_mode, gl_max_tess_gen_level_value,
                TESSELLATION_LEVEL_SET_FILTER_ALL_LEVELS_USE_THE_SAME_VALUE);

            /* Iterate through all configurations */
            for (_tessellation_levels_set_const_iterator levels_iterator = levels.begin();
                 levels_iterator != levels.end(); levels_iterator++)
            {
                const _tessellation_levels &current_levels = *levels_iterator;

                /* Create a test descriptor for all the parameters we now have.
                 *
                 * The set we're operating on uses different outer tessellation level values, so we
                 * need to make sure the levels are set to the same FP values in order for the test
                 * to succeed. */
                _test_iteration test;

                memcpy(test.inner_tess_levels, current_levels.inner, sizeof(test.inner_tess_levels));

                for (int n = 0; n < 4 /* outer tess levels */; ++n)
                {
                    test.outer_tess_levels[n] = current_levels.outer[0];
                }

                test.primitive_mode = primitive_mode;
                test.vertex_spacing = vs_mode;

                m_test_iterations.push_back(test);
            } /* for (all inner/outer tessellation levels) */
        }     /* for (all vertex spacing modes) */
    }         /* for (all primitive modes) */
}

/** Verifies user-provided vertex data can be found in the provided vertex data array.
 *
 *  @param vertex_data                     Vertex data array the requested vertex data are to be found in.
 *  @param n_vertices                      Amount of vertices declared in @param vertex_data;
 *  @param vertex_data_seeked              Vertex data to be found in @param vertex_data;
 *  @param n_vertex_data_seeked_components Amount of components to take into account.
 *
 *  @return true if the vertex data was found, false otherwise.
 **/
bool TessellationShaderInvarianceRule4Test::isVertexDefined(const float *vertex_data, unsigned int n_vertices,
                                                            const float *vertex_data_seeked,
                                                            unsigned int n_vertex_data_seeked_components)
{
    bool result = false;

    DE_ASSERT(n_vertex_data_seeked_components >= 2);

    for (unsigned int n_vertex = 0; n_vertex < n_vertices; ++n_vertex)
    {
        const float *current_vertex_data = vertex_data + 3 /* components */ * n_vertex;

        if ((vertex_data_seeked[0] == current_vertex_data[0]) && (vertex_data_seeked[1] == current_vertex_data[1]) &&
            ((n_vertex_data_seeked_components < 3) ||
             (n_vertex_data_seeked_components >= 3 && (vertex_data_seeked[2] == current_vertex_data[2]))))
        {
            result = true;

            break;
        } /* if (components match) */
    }     /* for (all vertices) */

    return result;
}

/** Verifies result data on per-iteration basis.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param n_iteration Index of iteration the check should be performed for.
 *  @param data        Points to array of vec3s storing the vertices as
 *                     generated by tessellation
 **/
void TessellationShaderInvarianceRule4Test::verifyResultDataForIteration(unsigned int n_iteration, const void *data)
{
    DE_ASSERT(m_test_iterations.size() > n_iteration);

    const glw::GLfloat *data_float        = (const glw::GLfloat *)data;
    const _test_iteration &test_iteration = m_test_iterations[n_iteration];

    /* Iterate through all generated vertices.. */
    for (unsigned int n_vertex = 0; n_vertex < test_iteration.n_vertices; ++n_vertex)
    {
        std::vector<_vertex> expected_vertices;
        const glw::GLfloat *vertex_data = data_float + 3 /* components */ * n_vertex;

        /* Make sure that for each vertex, the following language from the extension
         * spec is followed:
         */
        switch (test_iteration.primitive_mode)
        {
        case TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS:
        {
            /* For quad tessellation, if vertices at (x,0) and (1-x,0) are generated
             * when subdividing the v==0 edge, vertices must be generated at (0,x) and
             * (0,1-x) when subdividing an otherwise identical u==0 edge.
             */
            if (vertex_data[0] != 0.0f && vertex_data[1] == 0.0f)
            {
                const float paired_vertex_data[] = {1.0f - vertex_data[0], vertex_data[1]};

                if (isVertexDefined(data_float, test_iteration.n_vertices, paired_vertex_data, 2)) /* components */
                {
                    _vertex expected_vertex;

                    /* First expected vertex */
                    expected_vertex.u = vertex_data[1];
                    expected_vertex.v = vertex_data[0];
                    expected_vertex.w = -1.0f;

                    expected_vertices.push_back(expected_vertex);

                    /* The other expected vertex */
                    expected_vertex.u = vertex_data[1];
                    expected_vertex.v = 1.0f - vertex_data[0];

                    expected_vertices.push_back(expected_vertex);
                } /* if (the other required vertex is defined) */
            }     /* if (the first required vertex is defined) */

            break;
        } /* case TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS: */

        case TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES:
        {
            /* For triangular tessellation, if vertices at (x,1-x,0) and (1-x,x,0) are
             * generated when subdividing the w==0 edge, vertices must be generated at
             * (x,0,1-x) and (1-x,0,x) when subdividing an otherwise identical v==0
             * edge.
             */
            if (vertex_data[0] != 0.0f && vertex_data[1] == (1.0f - vertex_data[0]) && vertex_data[2] == 0)
            {
                const float paired_vertex_data[] = {vertex_data[1], vertex_data[0], vertex_data[2]};

                if (isVertexDefined(data_float, test_iteration.n_vertices, paired_vertex_data, 3)) /* components */
                {
                    _vertex expected_vertex;

                    /* First expected vertex */
                    expected_vertex.u = vertex_data[0];
                    expected_vertex.v = vertex_data[2];
                    expected_vertex.w = vertex_data[1];

                    expected_vertices.push_back(expected_vertex);

                    /* The other expected vertex */
                    expected_vertex.u = vertex_data[1];
                    expected_vertex.v = vertex_data[2];
                    expected_vertex.w = vertex_data[0];

                    expected_vertices.push_back(expected_vertex);
                } /* if (the other required vertex is defined) */
            }     /* if (the firsst required vertex is defined) */

            break;
        } /* case TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES: */

        default:
        {
            TCU_FAIL("Primitive mode unrecognized");
        }
        } /* switch (test_iteration.primitive_mode) */

        /* Iterate through all expected vertices */
        for (std::vector<_vertex>::const_iterator expected_vertex_iterator = expected_vertices.begin();
             expected_vertex_iterator != expected_vertices.end(); expected_vertex_iterator++)
        {
            const _vertex &expected_vertex    = *expected_vertex_iterator;
            const float expected_vertex_raw[] = {expected_vertex.u, expected_vertex.v, expected_vertex.w};
            bool has_been_found               = false;

            has_been_found = isVertexDefined(data_float, test_iteration.n_vertices, expected_vertex_raw,
                                             (expected_vertex.w < 0) ? 2 : 3);

            if (!has_been_found)
            {
                std::stringstream expected_vertex_sstream;

                expected_vertex_sstream << expected_vertex.u << ", " << expected_vertex.v;

                if (expected_vertex.w >= 0.0f)
                {
                    expected_vertex_sstream << ", " << expected_vertex.w;
                }

                m_testCtx.getLog() << tcu::TestLog::Message << "For primitive mode:"
                                   << "["
                                   << TessellationShaderUtils::getESTokenForPrimitiveMode(test_iteration.primitive_mode)
                                   << "]"
                                   << "and vertex spacing mode:"
                                   << "["
                                   << TessellationShaderUtils::getESTokenForVertexSpacingMode(
                                          test_iteration.vertex_spacing)
                                   << "]"
                                   << " and inner tessellation levels:[" << test_iteration.inner_tess_levels[0] << ", "
                                   << test_iteration.inner_tess_levels[1] << ") "
                                   << " and outer tessellation levels:[" << test_iteration.outer_tess_levels[0] << ", "
                                   << test_iteration.outer_tess_levels[1] << ", " << test_iteration.outer_tess_levels[2]
                                   << ", " << test_iteration.outer_tess_levels[3] << ") "
                                   << " the following vertex was expected:[" << expected_vertex_sstream.str().c_str()
                                   << "] but was not found in the tessellated cooordinate data set"
                                   << tcu::TestLog::EndMessage;

                TCU_FAIL("Expected symmetrical vertex data was not generated by the tessellator.");
            } /* if (the expected vertex data was not found) */
        }     /* for (all expected vertices) */
    }         /* for (all generated vertices) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule5Test::TessellationShaderInvarianceRule5Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule5",
                                           "Verifies conformance with fifth invariance rule")
{
}

/** Destructor. */
TessellationShaderInvarianceRule5Test::~TessellationShaderInvarianceRule5Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return A value that depends on initTestIterations() behavior.
 **/
unsigned int TessellationShaderInvarianceRule5Test::getAmountOfIterations()
{
    if (m_test_quads_iterations.size() == 0 || m_test_triangles_iterations.size() == 0)
    {
        initTestIterations();
    }

    return (unsigned int)(m_test_quads_iterations.size() + m_test_triangles_iterations.size());
}

/** Retrieves _test_iteration instance specific for user-specified iteration index.
 *
 *  @param n_iteration Iteration index to retrieve _test_iteration instance for.
 *
 * @return Iteration-specific _test_iteration instance.
 *
 **/
TessellationShaderInvarianceRule5Test::_test_iteration &TessellationShaderInvarianceRule5Test::getTestForIteration(
    unsigned int n_iteration)
{
    unsigned int n_triangles_tests  = (unsigned int)m_test_triangles_iterations.size();
    _test_iteration &test_iteration = (n_iteration < n_triangles_tests) ?
                                          m_test_triangles_iterations[n_iteration] :
                                          m_test_quads_iterations[n_iteration - n_triangles_tests];

    return test_iteration;
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule5Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    _test_iteration &test_iteration = getTestForIteration(n_iteration);

    memcpy(out_inner_tess_levels, test_iteration.inner_tess_levels, sizeof(test_iteration.inner_tess_levels));
    memcpy(out_outer_tess_levels, test_iteration.outer_tess_levels, sizeof(test_iteration.outer_tess_levels));

    *out_point_mode      = false;
    *out_primitive_mode  = test_iteration.primitive_mode;
    *out_vertex_ordering = test_iteration.vertex_ordering;

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
            *out_point_mode);
        test_iteration.n_vertices = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule5Test::getTECode(unsigned int n_iteration)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    const _test_iteration &test_iteration = getTestForIteration(n_iteration);

    return TessellationShaderUtils::getGenericTECode(TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
                                                     test_iteration.primitive_mode, test_iteration.vertex_ordering,
                                                     false); /* point mode */
}

/** Initializes test iterations for the test. The following modes and inner/outer tess level
 *  configurations are used to form the test set:
 *
 *  - Last inner/outer tessellation level combination as returned by
 *    TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode()
 *  - All primitive modes;
 *  - All vertex spacing modes;
 *
 *  All permutations are used to generate the test set.
 **/
void TessellationShaderInvarianceRule5Test::initTestIterations()
{
    DE_ASSERT(m_test_quads_iterations.size() == 0 && m_test_triangles_iterations.size() == 0);

    /* Retrieve GL_MAX_TESS_GEN_LEVEL_EXT value */
    const glw::Functions &gl               = m_context.getRenderContext().getFunctions();
    glw::GLint gl_max_tess_gen_level_value = 0;

    gl.getIntegerv(m_glExtTokens.MAX_TESS_GEN_LEVEL, &gl_max_tess_gen_level_value);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_TESS_GEN_LEVEL_EXT pname");

    /* Iterate through all primitive and vertex spacing modes relevant to the test */
    _tessellation_primitive_mode primitive_modes[]  = {TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS,
                                                       TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES};
    _tessellation_shader_vertex_ordering vo_modes[] = {
        TESSELLATION_SHADER_VERTEX_ORDERING_CCW,
        TESSELLATION_SHADER_VERTEX_ORDERING_CW,
    };

    const unsigned int n_primitive_modes = sizeof(primitive_modes) / sizeof(primitive_modes[0]);
    const unsigned int n_vo_modes        = sizeof(vo_modes) / sizeof(vo_modes[0]);

    for (unsigned int n_primitive_mode = 0; n_primitive_mode < n_primitive_modes; ++n_primitive_mode)
    {
        _tessellation_primitive_mode primitive_mode = primitive_modes[n_primitive_mode];

        for (unsigned int n_vo_mode = 0; n_vo_mode < n_vo_modes; ++n_vo_mode)
        {
            _tessellation_shader_vertex_ordering vertex_ordering = vo_modes[n_vo_mode];

            /* Retrieve inner/outer tessellation level combinations we want the tests to be run for */
            _tessellation_levels_set levels_set;

            levels_set = TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode(
                primitive_mode, gl_max_tess_gen_level_value,
                TESSELLATION_LEVEL_SET_FILTER_ALL_LEVELS_USE_THE_SAME_VALUE);

            /* Only use the last inner/outer level configuration, as reported by the utils function. */
            const _tessellation_levels &levels = levels_set[levels_set.size() - 1];

            /* Create a test descriptor for all the parameters we now have */
            _test_iteration test;

            memcpy(test.inner_tess_levels, levels.inner, sizeof(test.inner_tess_levels));
            memcpy(test.outer_tess_levels, levels.outer, sizeof(test.outer_tess_levels));

            test.primitive_mode  = primitive_mode;
            test.vertex_ordering = vertex_ordering;

            if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES)
            {
                m_test_triangles_iterations.push_back(test);
            }
            else
            {
                m_test_quads_iterations.push_back(test);
            }
        } /* for (all vertex spacing modes) */
    }     /* for (all primitive modes) */
}

/** Verifies user-provided vertex data can be found in the provided vertex data array.
 *
 *  @param vertex_data                     Vertex data array the requested vertex data are to be found in.
 *  @param n_vertices                      Amount of vertices declared in @param vertex_data;
 *  @param vertex_data_seeked              Vertex data to be found in @param vertex_data;
 *  @param n_vertex_data_seeked_components Amount of components to take into account.
 *
 *  @return true if the vertex data was found, false otherwise.
 **/
bool TessellationShaderInvarianceRule5Test::isVertexDefined(const float *vertex_data, unsigned int n_vertices,
                                                            const float *vertex_data_seeked,
                                                            unsigned int n_vertex_data_seeked_components)
{
    const float epsilon = 1e-5f;
    bool result         = false;

    DE_ASSERT(n_vertex_data_seeked_components >= 2);

    for (unsigned int n_vertex = 0; n_vertex < n_vertices; ++n_vertex)
    {
        const float *current_vertex_data = vertex_data + 3 /* components */ * n_vertex;

        if (de::abs(vertex_data_seeked[0] - current_vertex_data[0]) < epsilon &&
            de::abs(vertex_data_seeked[1] - current_vertex_data[1]) < epsilon &&
            ((n_vertex_data_seeked_components < 3) ||
             (n_vertex_data_seeked_components >= 3 &&
              de::abs(vertex_data_seeked[2] - current_vertex_data[2]) < epsilon)))
        {
            result = true;

            break;
        } /* if (components match) */
    }     /* for (all vertices) */

    return result;
}

/** Verifies result data. Accesses data generated by all iterations.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param all_iterations_data An array of pointers to buffers, holding gl_TessCoord
 *                             data generated by subsequent iterations.
 **/
void TessellationShaderInvarianceRule5Test::verifyResultData(const void **all_iterations_data)
{
    /* Run two separate iterations:
     *
     * a) triangles
     * b) quads
     */
    for (unsigned int n_iteration = 0; n_iteration < 2 /* quads, triangles */; ++n_iteration)
    {
        const unsigned int n_base_iteration = (n_iteration == 0) ? 0 : (unsigned int)m_test_triangles_iterations.size();
        const unsigned int set_size         = (n_iteration == 0) ? (unsigned int)m_test_triangles_iterations.size() :
                                                                   (unsigned int)m_test_quads_iterations.size();
        const _test_iterations &test_iterations =
            (n_iteration == 0) ? m_test_triangles_iterations : m_test_quads_iterations;

        DE_ASSERT(test_iterations.size() != 0);

        /* For each iteration, verify that all vertices generated for all three vertex spacing modes.
         * are exactly the same (but in different order) */
        const float *base_vertex_data = (const float *)all_iterations_data[n_base_iteration + 0];

        for (unsigned int n_set = 1; n_set < set_size; ++n_set)
        {
            const float *set_vertex_data = (const float *)all_iterations_data[n_base_iteration + n_set];

            /* Amount of vertices should not differ between sets */
            DE_ASSERT(test_iterations[0].n_vertices == test_iterations[n_set].n_vertices);

            /* Run through all vertices in base set and make sure they can be found in currently
             * processed set */
            for (unsigned int n_base_vertex = 0; n_base_vertex < test_iterations[0].n_vertices; ++n_base_vertex)
            {
                const float *base_vertex = base_vertex_data + 3 /* components */ * n_base_vertex;

                if (!isVertexDefined(set_vertex_data, test_iterations[n_set].n_vertices, base_vertex,
                                     3)) /* components */
                {
                    const char *primitive_mode = (n_iteration == 0) ? "triangles" : "quads";

                    m_testCtx.getLog() << tcu::TestLog::Message << "For primitive mode [" << primitive_mode << "] "
                                       << "a vertex with tessellation coordinates:[" << base_vertex[0] << ", "
                                       << base_vertex[1] << ", " << base_vertex[2] << ") "
                                       << "could not have been found for both vertex orderings."
                                       << tcu::TestLog::EndMessage;

                    TCU_FAIL("Implementation does not follow Rule 5.");
                }
            } /* for (all base set's vertices) */
        }     /* for (all sets) */
    }         /* for (both primitive types) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule6Test::TessellationShaderInvarianceRule6Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule6",
                                           "Verifies conformance with sixth invariance rule")
{
}

/** Destructor. */
TessellationShaderInvarianceRule6Test::~TessellationShaderInvarianceRule6Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return A value that depends on initTestIterations() behavior.
 **/
unsigned int TessellationShaderInvarianceRule6Test::getAmountOfIterations()
{
    if (m_test_quads_iterations.size() == 0 || m_test_triangles_iterations.size() == 0)
    {
        initTestIterations();
    }

    return (unsigned int)(m_test_quads_iterations.size() + m_test_triangles_iterations.size());
}

/** Retrieves _test_iteration instance specific for user-specified iteration index.
 *
 *  @param n_iteration Iteration index to retrieve _test_iteration instance for.
 *
 * @return Iteration-specific _test_iteration instance.
 *
 **/
TessellationShaderInvarianceRule6Test::_test_iteration &TessellationShaderInvarianceRule6Test::getTestForIteration(
    unsigned int n_iteration)
{
    unsigned int n_triangles_tests  = (unsigned int)m_test_triangles_iterations.size();
    _test_iteration &test_iteration = (n_iteration < n_triangles_tests) ?
                                          m_test_triangles_iterations[n_iteration] :
                                          m_test_quads_iterations[n_iteration - n_triangles_tests];

    return test_iteration;
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule6Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    _test_iteration &test_iteration = getTestForIteration(n_iteration);

    memcpy(out_inner_tess_levels, test_iteration.inner_tess_levels, sizeof(test_iteration.inner_tess_levels));
    memcpy(out_outer_tess_levels, test_iteration.outer_tess_levels, sizeof(test_iteration.outer_tess_levels));

    *out_point_mode      = false;
    *out_primitive_mode  = test_iteration.primitive_mode;
    *out_vertex_ordering = test_iteration.vertex_ordering;

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
            *out_point_mode);
        test_iteration.n_vertices = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule6Test::getTECode(unsigned int n_iteration)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    const _test_iteration &test_iteration = getTestForIteration(n_iteration);

    return TessellationShaderUtils::getGenericTECode(TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
                                                     test_iteration.primitive_mode, test_iteration.vertex_ordering,
                                                     false); /* point mode */
}

/** Initializes test iterations for the test. The following modes and inner/outer tess level
 *  configurations are used to form the test set:
 *
 *  - Tessellation level combinations as returned by
 *    TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode() (however, the inner
 *    tessellation level values are all set to values corresponding to last item returned for
 *    the set)
 *  - All primitive modes;
 *  - All vertex ordering modes;
 *
 *  All permutations are used to generate the test set.
 **/
void TessellationShaderInvarianceRule6Test::initTestIterations()
{
    DE_ASSERT(m_test_quads_iterations.size() == 0 && m_test_triangles_iterations.size() == 0);

    /* Retrieve GL_MAX_TESS_GEN_LEVEL_EXT value */
    const glw::Functions &gl               = m_context.getRenderContext().getFunctions();
    glw::GLint gl_max_tess_gen_level_value = 0;

    gl.getIntegerv(m_glExtTokens.MAX_TESS_GEN_LEVEL, &gl_max_tess_gen_level_value);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_TESS_GEN_LEVEL_EXT pname");

    /* Iterate through all primitive and vertex spacing modes relevant to the test */
    _tessellation_primitive_mode primitive_modes[]               = {TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES,
                                                                    TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS};
    _tessellation_shader_vertex_ordering vertex_ordering_modes[] = {TESSELLATION_SHADER_VERTEX_ORDERING_CCW,
                                                                    TESSELLATION_SHADER_VERTEX_ORDERING_CW};

    const unsigned int n_primitive_modes = sizeof(primitive_modes) / sizeof(primitive_modes[0]);
    const unsigned int n_vo_modes        = sizeof(vertex_ordering_modes) / sizeof(vertex_ordering_modes[0]);

    for (unsigned int n_primitive_mode = 0; n_primitive_mode < n_primitive_modes; ++n_primitive_mode)
    {
        _tessellation_primitive_mode primitive_mode = primitive_modes[n_primitive_mode];

        for (unsigned int n_vo_mode = 0; n_vo_mode < n_vo_modes; ++n_vo_mode)
        {
            _tessellation_shader_vertex_ordering vertex_ordering = vertex_ordering_modes[n_vo_mode];

            /* Retrieve inner/outer tessellation level combinations we want the tests to be run for.
             * Since each level set we will be provided by getTessellationLevelSetForPrimitiveMode()
             * is unique and does not repeat, we'll just make sure the inner level values are set to
             * the same set of values, so that the conditions the test must meet are actually met.
             */
            float *inner_levels_to_use = DE_NULL;
            _tessellation_levels_set levels_set;
            unsigned int n_levels_sets = 0;

            levels_set = TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode(
                primitive_mode, gl_max_tess_gen_level_value,
                TESSELLATION_LEVEL_SET_FILTER_ALL_LEVELS_USE_THE_SAME_VALUE);

            n_levels_sets       = (unsigned int)levels_set.size();
            inner_levels_to_use = levels_set[n_levels_sets - 1].inner;

            for (unsigned int n_levels_set = 0; n_levels_set < n_levels_sets - 1; n_levels_set++)
            {
                /* Make sure the Utils function was not changed and that inner level values
                 * are actually unique across the whole set */
                DE_ASSERT(levels_set[n_levels_set].inner[0] != levels_set[n_levels_sets - 1].inner[0] &&
                          levels_set[n_levels_set].inner[1] != levels_set[n_levels_sets - 1].inner[1]);

                /* Force the last set's inner values to all level combinations we'll be using */
                memcpy(levels_set[n_levels_set].inner, inner_levels_to_use, sizeof(levels_set[n_levels_set].inner));
            } /* for (all sets retrieved from Utils function */

            for (_tessellation_levels_set_const_iterator set_iterator = levels_set.begin();
                 set_iterator != levels_set.end(); set_iterator++)
            {
                const _tessellation_levels &levels = *set_iterator;

                /* Create a test descriptor for all the parameters we now have */
                _test_iteration test;

                memcpy(test.inner_tess_levels, levels.inner, sizeof(test.inner_tess_levels));
                memcpy(test.outer_tess_levels, levels.outer, sizeof(test.outer_tess_levels));

                test.primitive_mode  = primitive_mode;
                test.vertex_ordering = vertex_ordering;

                if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES)
                {
                    m_test_triangles_iterations.push_back(test);
                }
                else
                {
                    m_test_quads_iterations.push_back(test);
                }
            } /* for (all level sets) */
        }     /* for (all vertex ordering modes) */
    }         /* for (all primitive modes) */
}

/** Verifies result data. Accesses data generated by all iterations.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param all_iterations_data An array of pointers to buffers, holding gl_TessCoord
 *                             data generated by subsequent iterations.
 **/
void TessellationShaderInvarianceRule6Test::verifyResultData(const void **all_iterations_data)
{
    /* Run two separate iterations:
     *
     * a) triangles
     * b) quads
     */

    for (unsigned int n_iteration = 0; n_iteration < 2 /* quads, triangles */; ++n_iteration)
    {
        const unsigned int n_base_iteration = (n_iteration == 0) ? 0 : (unsigned int)m_test_triangles_iterations.size();

        const unsigned int n_sets = (n_iteration == 0) ? (unsigned int)m_test_triangles_iterations.size() :
                                                         (unsigned int)m_test_quads_iterations.size();

        _tessellation_primitive_mode primitive_mode = (n_iteration == 0) ?
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES :
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS;

        const _test_iterations &test_iterations =
            (n_iteration == 0) ? m_test_triangles_iterations : m_test_quads_iterations;

        const unsigned int n_triangles_in_base_set = test_iterations[0].n_vertices / 3 /* vertices per triangle */;

        DE_ASSERT(test_iterations.size() != 0);

        /* For each iteration, verify that all vertices generated for all three vertex spacing modes.
         * are exactly the same (but in different order) */
        const _test_iteration &base_test = test_iterations[0];
        const float *base_vertex_data    = (const float *)all_iterations_data[n_base_iteration + 0];

        for (unsigned int n_set = 1; n_set < n_sets; ++n_set)
        {
            const _test_iteration &set_test = test_iterations[n_set];
            const float *set_vertex_data    = (const float *)all_iterations_data[n_base_iteration + n_set];

            /* We're operating on triangles so make sure the amount of vertices we're dealing with is
             * divisible by 3 */
            DE_ASSERT((test_iterations[n_set].n_vertices % 3) == 0);

            const unsigned int n_triangles_in_curr_set = test_iterations[n_set].n_vertices / 3;

            /* Take base triangles and make sure they can be found in iteration-specific set.
             * Now, thing to keep in mind here is that we must not assume any specific vertex
             * and triangle order which is why the slow search. */
            for (unsigned int n_base_triangle = 0; n_base_triangle < n_triangles_in_base_set; ++n_base_triangle)
            {
                /* Extract base triangle data first */
                const float *base_triangle_vertex1 = base_vertex_data + n_base_triangle *
                                                                            3 * /* vertices per triangle */
                                                                            3;  /* components */
                const float *base_triangle_vertex2 = base_triangle_vertex1 + 3; /* components */
                const float *base_triangle_vertex3 = base_triangle_vertex2 + 3; /* components */

                /* Only interior triangles should be left intact. Is this an interior triangle? */
                if (!TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex1) &&
                    !TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex2) &&
                    !TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex3))
                {
                    /* Iterate through all triangles in considered set */
                    bool has_base_set_triangle_been_found = false;

                    for (unsigned int n_curr_set_triangle = 0; n_curr_set_triangle < n_triangles_in_curr_set;
                         ++n_curr_set_triangle)
                    {
                        const float *curr_triangle = set_vertex_data + n_curr_set_triangle *
                                                                           3 * /* vertices per triangle */
                                                                           3;  /* components */

                        if (TessellationShaderUtils::isTriangleDefined(base_triangle_vertex1, curr_triangle))
                        {
                            has_base_set_triangle_been_found = true;

                            break;
                        }
                    } /* for (all triangles in currently processed set) */

                    if (!has_base_set_triangle_been_found)
                    {
                        std::string primitive_mode_str =
                            TessellationShaderUtils::getESTokenForPrimitiveMode(base_test.primitive_mode);

                        m_testCtx.getLog()
                            << tcu::TestLog::Message << "For primitive mode [" << primitive_mode_str << "]"
                            << ", base inner tessellation levels:"
                            << "[" << base_test.inner_tess_levels[0] << ", " << base_test.inner_tess_levels[1] << "]"
                            << ", base outer tessellation levels:"
                            << "[" << base_test.outer_tess_levels[0] << ", " << base_test.outer_tess_levels[1] << ", "
                            << base_test.outer_tess_levels[2] << ", " << base_test.outer_tess_levels[3] << "]"
                            << ", reference inner tessellation levels:"
                            << "[" << set_test.inner_tess_levels[0] << ", " << set_test.inner_tess_levels[1] << "]"
                            << ", reference outer tessellation levels:"
                            << "[" << set_test.outer_tess_levels[0] << ", " << set_test.outer_tess_levels[1] << ", "
                            << set_test.outer_tess_levels[2] << ", " << set_test.outer_tess_levels[3] << "]"
                            << ", the following triangle formed during base tessellation run was not found in "
                               "reference run:"
                            << "[" << base_triangle_vertex1[0] << ", " << base_triangle_vertex1[1] << ", "
                            << base_triangle_vertex1[2] << "]x"
                            << "[" << base_triangle_vertex2[0] << ", " << base_triangle_vertex2[1] << ", "
                            << base_triangle_vertex2[2] << "]x"
                            << "[" << base_triangle_vertex3[0] << ", " << base_triangle_vertex3[1] << ", "
                            << base_triangle_vertex3[2]

                            << tcu::TestLog::EndMessage;

                        TCU_FAIL("Implementation does not appear to be rule 6-conformant");
                    } /* if (triangle created during base run was not found in reference run) */
                }     /* if (base triangle is interior) */
            }         /* for (all base set's vertices) */
        }             /* for (all sets) */
    }                 /* for (both primitive types) */
}

/** Constructor.
 *
 *  @param context Rendering context.
 *
 **/
TessellationShaderInvarianceRule7Test::TessellationShaderInvarianceRule7Test(Context &context,
                                                                             const ExtParameters &extParams)
    : TessellationShaderInvarianceBaseTest(context, extParams, "invariance_rule7",
                                           "Verifies conformance with seventh invariance rule")
{
}

/** Destructor. */
TessellationShaderInvarianceRule7Test::~TessellationShaderInvarianceRule7Test()
{
    /* Left blank intentionally */
}

/** Retrieves amount of iterations the base test implementation should run before
 *  calling global verification routine.
 *
 *  @return A value that depends on initTestIterations() behavior.
 **/
unsigned int TessellationShaderInvarianceRule7Test::getAmountOfIterations()
{
    if (m_test_quads_iterations.size() == 0 || m_test_triangles_iterations.size() == 0)
    {
        initTestIterations();
    }

    return (unsigned int)(m_test_quads_iterations.size() + m_test_triangles_iterations.size());
}

/** Retrieves index of a test iteration that was initialized with user-provided
 *  properties.
 *
 *  @param is_triangles_iteration      true if the seeked test iteration should have
 *                                     been run for 'triangles' primitive mode', false
 *                                     if 'quads' primitive mode run is seeked.
 *  @param inner_tess_levels           Two FP values describing inner tessellation level
 *                                     values the seeked run should have used.
 *  @param outer_tess_levels           Four FP values describing outer tessellation level
 *                                     values the seeked run should have used.
 *  @param vertex_ordering             Vertex ordering mode the seeked run should have used.
 *  @param n_modified_outer_tess_level Tells which outer tessellation level should be
 *                                     excluded from checking.
 *
 *  @return 0xFFFFFFFF if no test iteration was run for user-provided properties,
 *          actual index otherwise.
 *
 **/
unsigned int TessellationShaderInvarianceRule7Test::getTestIterationIndex(
    bool is_triangles_iteration, const float *inner_tess_levels, const float *outer_tess_levels,
    _tessellation_shader_vertex_ordering vertex_ordering, unsigned int n_modified_outer_tess_level)
{
    const float epsilon = 1e-5f;
    unsigned int result = 0xFFFFFFFF;
    const _test_iterations &test_iterations =
        (is_triangles_iteration) ? m_test_triangles_iterations : m_test_quads_iterations;
    const unsigned int n_test_iterations = (unsigned int)test_iterations.size();

    for (unsigned int n_test_iteration = 0; n_test_iteration < n_test_iterations; ++n_test_iteration)
    {
        _test_iteration test_iteration = test_iterations[n_test_iteration];

        if (de::abs(test_iteration.inner_tess_levels[0] - inner_tess_levels[0]) < epsilon &&
            de::abs(test_iteration.inner_tess_levels[1] - inner_tess_levels[1]) < epsilon &&
            test_iteration.vertex_ordering == vertex_ordering &&
            test_iteration.n_modified_outer_tess_level == n_modified_outer_tess_level)
        {
            /* Only compare outer tessellation levels that have not been modified */
            if (((n_modified_outer_tess_level == 0) ||
                 (n_modified_outer_tess_level != 0 &&
                  de::abs(test_iteration.outer_tess_levels[0] - outer_tess_levels[0]) < epsilon)) &&
                ((n_modified_outer_tess_level == 1) ||
                 (n_modified_outer_tess_level != 1 &&
                  de::abs(test_iteration.outer_tess_levels[1] - outer_tess_levels[1]) < epsilon)) &&
                ((n_modified_outer_tess_level == 2) ||
                 (n_modified_outer_tess_level != 2 &&
                  de::abs(test_iteration.outer_tess_levels[2] - outer_tess_levels[2]) < epsilon)) &&
                ((n_modified_outer_tess_level == 3) ||
                 (n_modified_outer_tess_level != 3 &&
                  de::abs(test_iteration.outer_tess_levels[3] - outer_tess_levels[3]) < epsilon)))
            {
                result = n_test_iteration;

                break;
            }
        }
    } /* for (all test iterations) */

    return result;
}

/** Retrieves _test_iteration instance specific for user-specified iteration index.
 *
 *  @param n_iteration Iteration index to retrieve _test_iteration instance for.
 *
 * @return Iteration-specific _test_iteration instance.
 *
 **/
TessellationShaderInvarianceRule7Test::_test_iteration &TessellationShaderInvarianceRule7Test::getTestForIteration(
    unsigned int n_iteration)
{
    unsigned int n_triangles_tests  = (unsigned int)m_test_triangles_iterations.size();
    _test_iteration &test_iteration = (n_iteration < n_triangles_tests) ?
                                          m_test_triangles_iterations[n_iteration] :
                                          m_test_quads_iterations[n_iteration - n_triangles_tests];

    return test_iteration;
}

/** Retrieves iteration-specific tessellation properties.
 *
 *  @param n_iteration            Iteration index to retrieve the properties for.
 *  @param out_inner_tess_levels  Deref will be used to store iteration-specific inner
 *                                tessellation level values. Must not be NULL.
 *  @param out_outer_tess_levels  Deref will be used to store iteration-specific outer
 *                                tessellation level values. Must not be NULL.
 *  @param out_point_mode         Deref will be used to store iteration-specific flag
 *                                telling whether point mode should be enabled for given pass.
 *                                Must not be NULL.
 *  @param out_primitive_mode     Deref will be used to store iteration-specific primitive
 *                                mode. Must not be NULL.
 *  @param out_vertex_ordering    Deref will be used to store iteration-specific vertex
 *                                ordering. Must not be NULL.
 *  @param out_result_buffer_size Deref will be used to store amount of bytes XFB buffer object
 *                                storage should offer for the draw call to succeed. Can
 *                                be NULL.
 **/
void TessellationShaderInvarianceRule7Test::getIterationProperties(
    unsigned int n_iteration, float *out_inner_tess_levels, float *out_outer_tess_levels, bool *out_point_mode,
    _tessellation_primitive_mode *out_primitive_mode, _tessellation_shader_vertex_ordering *out_vertex_ordering,
    unsigned int *out_result_buffer_size)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    _test_iteration &test_iteration = getTestForIteration(n_iteration);

    memcpy(out_inner_tess_levels, test_iteration.inner_tess_levels, sizeof(test_iteration.inner_tess_levels));
    memcpy(out_outer_tess_levels, test_iteration.outer_tess_levels, sizeof(test_iteration.outer_tess_levels));

    *out_point_mode      = false;
    *out_primitive_mode  = test_iteration.primitive_mode;
    *out_vertex_ordering = test_iteration.vertex_ordering;

    if (out_result_buffer_size != DE_NULL)
    {
        *out_result_buffer_size = m_utils_ptr->getAmountOfVerticesGeneratedByTessellator(
            *out_primitive_mode, out_inner_tess_levels, out_outer_tess_levels, TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
            *out_point_mode);
        test_iteration.n_vertices = *out_result_buffer_size;
        *out_result_buffer_size =
            static_cast<unsigned int>(*out_result_buffer_size * 3 /* components */ * sizeof(float));

        DE_ASSERT(*out_result_buffer_size != 0);
    }
}

/** Retrieves iteration-specific tessellation evaluation shader code.
 *
 *  @param n_iteration Iteration index, for which the source code is being obtained.
 *
 *  @return Requested source code.
 **/
std::string TessellationShaderInvarianceRule7Test::getTECode(unsigned int n_iteration)
{
    DE_ASSERT(m_test_triangles_iterations.size() + m_test_quads_iterations.size() > n_iteration);

    const _test_iteration &test_iteration = getTestForIteration(n_iteration);

    return TessellationShaderUtils::getGenericTECode(TESSELLATION_SHADER_VERTEX_SPACING_EQUAL,
                                                     test_iteration.primitive_mode, test_iteration.vertex_ordering,
                                                     false); /* point mode */
}

/** Initializes test iterations for the test. The following modes and inner/outer tess level
 *  configurations are used to form the test set:
 *
 *  - All inner/outer tessellation level combinations as returned by
 *    TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode()
 *    times 3 (for triangles) or 4 (for quads). For each combination,
 *    the test will capture tessellation coordinates multiple times, each
 *    time changing a different outer tessellation level value and leaving
 *    the rest intact.
 *  - All primitive modes;
 *  - All vertex spacing modes;
 *
 *  All permutations are used to generate the test set.
 **/
void TessellationShaderInvarianceRule7Test::initTestIterations()
{
    DE_ASSERT(m_test_quads_iterations.size() == 0 && m_test_triangles_iterations.size() == 0);

    /* Retrieve GL_MAX_TESS_GEN_LEVEL_EXT value */
    const glw::Functions &gl               = m_context.getRenderContext().getFunctions();
    glw::GLint gl_max_tess_gen_level_value = 0;

    gl.getIntegerv(m_glExtTokens.MAX_TESS_GEN_LEVEL, &gl_max_tess_gen_level_value);
    GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_TESS_GEN_LEVEL_EXT pname");

    /* Iterate through all primitive and vertex spacing modes relevant to the test */
    _tessellation_primitive_mode primitive_modes[]  = {TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS,
                                                       TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES};
    _tessellation_shader_vertex_ordering vo_modes[] = {
        TESSELLATION_SHADER_VERTEX_ORDERING_CCW,
        TESSELLATION_SHADER_VERTEX_ORDERING_CW,
    };

    const unsigned int n_primitive_modes = sizeof(primitive_modes) / sizeof(primitive_modes[0]);
    const unsigned int n_vo_modes        = sizeof(vo_modes) / sizeof(vo_modes[0]);

    for (unsigned int n_primitive_mode = 0; n_primitive_mode < n_primitive_modes; ++n_primitive_mode)
    {
        _tessellation_primitive_mode primitive_mode = primitive_modes[n_primitive_mode];
        const unsigned int n_relevant_outer_tess_levels =
            (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS) ? 4 : 3;

        for (unsigned int n_vo_mode = 0; n_vo_mode < n_vo_modes; ++n_vo_mode)
        {
            _tessellation_shader_vertex_ordering vertex_ordering = vo_modes[n_vo_mode];

            /* Retrieve inner/outer tessellation level combinations we want the tests to be run for */
            _tessellation_levels_set levels_set;

            levels_set = TessellationShaderUtils::getTessellationLevelSetForPrimitiveMode(
                primitive_mode, gl_max_tess_gen_level_value,
                TESSELLATION_LEVEL_SET_FILTER_ALL_LEVELS_USE_THE_SAME_VALUE);

            /* Create test descriptor for all inner/outer level configurations we received from the utils function. */
            for (_tessellation_levels_set_const_iterator levels_set_iterator = levels_set.begin();
                 levels_set_iterator != levels_set.end(); levels_set_iterator++)
            {
                const _tessellation_levels &levels = *levels_set_iterator;

                for (unsigned int n_outer_level_to_change = 0;
                     n_outer_level_to_change < n_relevant_outer_tess_levels + 1 /* base iteration */;
                     ++n_outer_level_to_change)
                {
                    /* Create a test descriptor for all the parameters we now have */
                    _test_iteration test;

                    memcpy(test.inner_tess_levels, levels.inner, sizeof(test.inner_tess_levels));
                    memcpy(test.outer_tess_levels, levels.outer, sizeof(test.outer_tess_levels));

                    test.primitive_mode  = primitive_mode;
                    test.vertex_ordering = vertex_ordering;

                    /* Change iteration-specific outer tessellation level to a different value, but only
                     * if we're not preparing a base iteration*/
                    if (n_outer_level_to_change != n_relevant_outer_tess_levels)
                    {
                        test.n_modified_outer_tess_level                = n_outer_level_to_change;
                        test.outer_tess_levels[n_outer_level_to_change] = (float)(gl_max_tess_gen_level_value) / 3.0f;
                    }
                    else
                    {
                        test.is_base_iteration = true;
                    }

                    if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES)
                    {
                        m_test_triangles_iterations.push_back(test);
                    }
                    else
                    {
                        m_test_quads_iterations.push_back(test);
                    }
                }
            } /* for (all levels set entries) */
        }     /* for (all vertex spacing modes) */
    }         /* for (all primitive modes) */
}

/** Tells whether a triangle is included in user-provided set of triangles.
 *  The triangle is expected to use an undefined vertex ordering.
 *
 *  @param base_triangle_data     9 FP values defining 3 vertices of a triangle.
 *  @param vertex_data            Vertex stream. It is expected these vertices
 *                                form triangles. It is also assumed each vertex
 *                                is expressed with 3 components.
 *  @param vertex_data_n_vertices Amount of vertices that can be found in @param
 *                                vertex_data
 *
 *  @return true if the triangle was found in user-provided triangle set,
 *          false otherwise.
 *
 **/
bool TessellationShaderInvarianceRule7Test::isTriangleDefinedInVertexDataSet(const float *base_triangle_data,
                                                                             const float *vertex_data,
                                                                             unsigned int vertex_data_n_vertices)
{
    bool result = false;

    for (unsigned int n_triangle = 0; n_triangle < vertex_data_n_vertices / 3 /* vertices per triangle */; n_triangle++)
    {
        const float *current_triangle_data = vertex_data + n_triangle * 3 * /* vertices per triangle */
                                                               3;           /* components */

        if (TessellationShaderUtils::isTriangleDefined(current_triangle_data, base_triangle_data))
        {
            result = true;

            break;
        }
    } /* for (all vertices) */

    return result;
}

/** Verifies result data. Accesses data generated by all iterations.
 *
 *  Throws TestError exception if an error occurs.
 *
 *  @param all_iterations_data An array of pointers to buffers, holding gl_TessCoord
 *                             data generated by subsequent iterations.
 **/
void TessellationShaderInvarianceRule7Test::verifyResultData(const void **all_iterations_data)
{
    const float epsilon = 1e-5f;

    /* Run two separate iterations:
     *
     * a) triangles
     * b) quads
     */
    for (unsigned int n_iteration = 0; n_iteration < 2 /* triangles, quads */; ++n_iteration)
    {
        bool is_triangles_iteration         = (n_iteration == 0);
        const unsigned int n_base_iteration = (n_iteration == 0) ? 0 : (unsigned int)m_test_triangles_iterations.size();
        const unsigned int n_relevant_outer_tess_levels = (is_triangles_iteration) ? 3 : 4;

        _tessellation_primitive_mode primitive_mode = (n_iteration == 0) ?
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES :
                                                          TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS;

        const _test_iterations &test_iterations =
            (n_iteration == 0) ? m_test_triangles_iterations : m_test_quads_iterations;

        DE_ASSERT(test_iterations.size() != 0);

        /* Find a base iteration first */
        for (unsigned int n_base_test_iteration = 0; n_base_test_iteration < test_iterations.size();
             n_base_test_iteration++)
        {
            const _test_iteration &base_iteration = test_iterations[n_base_test_iteration];
            std::vector<int> ref_iteration_indices;

            if (!base_iteration.is_base_iteration)
            {
                continue;
            }

            /* Retrieve reference test iterations */
            for (unsigned int n_reference_iteration = 0; n_reference_iteration < n_relevant_outer_tess_levels;
                 ++n_reference_iteration)
            {
                const unsigned int n_modified_outer_tess_level =
                    (base_iteration.n_modified_outer_tess_level + n_reference_iteration + 1) %
                    n_relevant_outer_tess_levels;
                const unsigned int ref_iteration_index = getTestIterationIndex(
                    is_triangles_iteration, base_iteration.inner_tess_levels, base_iteration.outer_tess_levels,
                    base_iteration.vertex_ordering, n_modified_outer_tess_level);

                DE_ASSERT(ref_iteration_index != 0xFFFFFFFF);
                DE_ASSERT(ref_iteration_index != n_base_test_iteration);

                ref_iteration_indices.push_back(ref_iteration_index);
            }

            /* We can now start comparing base data with the information generated for
             * reference iterations. */
            for (std::vector<int>::const_iterator ref_iteration_iterator = ref_iteration_indices.begin();
                 ref_iteration_iterator != ref_iteration_indices.end(); ref_iteration_iterator++)
            {
                const int &n_ref_test_iteration      = *ref_iteration_iterator;
                const _test_iteration &ref_iteration = test_iterations[n_ref_test_iteration];

                /* Now move through all triangles generated for base test iteration. Focus on the ones
                 * that connect the outer edge with one of the inner ones */
                const float *base_iteration_vertex_data =
                    (const float *)all_iterations_data[n_base_iteration + n_base_test_iteration];
                const float *ref_iteration_vertex_data =
                    (const float *)all_iterations_data[n_base_iteration + n_ref_test_iteration];

                for (unsigned int n_base_triangle = 0;
                     n_base_triangle < base_iteration.n_vertices / 3; /* vertices per triangle */
                     ++n_base_triangle)
                {
                    const float *base_triangle_data =
                        base_iteration_vertex_data + n_base_triangle * 3 /* vertices */ * 3; /* components */

                    /* Is that the triangle type we're after? */
                    const float *base_triangle_vertex1 = base_triangle_data;
                    const float *base_triangle_vertex2 = base_triangle_vertex1 + 3; /* components */
                    const float *base_triangle_vertex3 = base_triangle_vertex2 + 3; /* components */
                    bool is_base_triangle_vertex1_outer =
                        TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex1);
                    bool is_base_triangle_vertex2_outer =
                        TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex2);
                    bool is_base_triangle_vertex3_outer =
                        TessellationShaderUtils::isOuterEdgeVertex(primitive_mode, base_triangle_vertex3);
                    unsigned int n_outer_edge_vertices_found = 0;

                    n_outer_edge_vertices_found += (is_base_triangle_vertex1_outer == true);
                    n_outer_edge_vertices_found += (is_base_triangle_vertex2_outer == true);
                    n_outer_edge_vertices_found += (is_base_triangle_vertex3_outer == true);

                    if (n_outer_edge_vertices_found == 0)
                    {
                        /* This is an inner triangle, not really of our interest */
                        continue;
                    }

                    /* Which outer tessellation level describes the base data edge? */
                    unsigned int n_base_tess_level = 0;

                    if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES)
                    {
                        if ((!is_base_triangle_vertex1_outer ||
                             (is_base_triangle_vertex1_outer && base_triangle_vertex1[0] == 0.0f)) &&
                            (!is_base_triangle_vertex2_outer ||
                             (is_base_triangle_vertex2_outer && base_triangle_vertex2[0] == 0.0f)) &&
                            (!is_base_triangle_vertex3_outer ||
                             (is_base_triangle_vertex3_outer && base_triangle_vertex3[0] == 0.0f)))
                        {
                            n_base_tess_level = 0;
                        }
                        else if ((!is_base_triangle_vertex1_outer ||
                                  (is_base_triangle_vertex1_outer && base_triangle_vertex1[1] == 0.0f)) &&
                                 (!is_base_triangle_vertex2_outer ||
                                  (is_base_triangle_vertex2_outer && base_triangle_vertex2[1] == 0.0f)) &&
                                 (!is_base_triangle_vertex3_outer ||
                                  (is_base_triangle_vertex3_outer && base_triangle_vertex3[1] == 0.0f)))
                        {
                            n_base_tess_level = 1;
                        }
                        else
                        {
                            DE_ASSERT((!is_base_triangle_vertex1_outer ||
                                       (is_base_triangle_vertex1_outer && base_triangle_vertex1[2] == 0.0f)) &&
                                      (!is_base_triangle_vertex2_outer ||
                                       (is_base_triangle_vertex2_outer && base_triangle_vertex2[2] == 0.0f)) &&
                                      (!is_base_triangle_vertex3_outer ||
                                       (is_base_triangle_vertex3_outer && base_triangle_vertex3[2] == 0.0f)));

                            n_base_tess_level = 2;
                        }
                    } /* if (primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_TRIANGLES) */
                    else
                    {
                        DE_ASSERT(primitive_mode == TESSELLATION_SHADER_PRIMITIVE_MODE_QUADS);

                        std::size_t n_outer_edge_vertices = 0;
                        std::vector<const float *> outer_edge_vertices;

                        if (is_base_triangle_vertex1_outer)
                        {
                            outer_edge_vertices.push_back(base_triangle_vertex1);
                        }

                        if (is_base_triangle_vertex2_outer)
                        {
                            outer_edge_vertices.push_back(base_triangle_vertex2);
                        }

                        if (is_base_triangle_vertex3_outer)
                        {
                            outer_edge_vertices.push_back(base_triangle_vertex3);
                        }

                        n_outer_edge_vertices = outer_edge_vertices.size();

                        DE_ASSERT(n_outer_edge_vertices >= 1 && n_outer_edge_vertices <= 2);

                        bool is_top_outer_edge    = true;
                        bool is_right_outer_edge  = true;
                        bool is_bottom_outer_edge = true;
                        bool is_left_outer_edge   = true;

                        /* Find which outer edges the vertices don't belong to. If one is in a corner,
                         * the other will clarify to which edge both vertices belong. */
                        for (unsigned int n_vertex = 0; n_vertex < n_outer_edge_vertices; ++n_vertex)
                        {
                            /* Y < 1, not top outer edge */
                            if (de::abs(outer_edge_vertices[n_vertex][1] - 1.0f) > epsilon)
                            {
                                is_top_outer_edge = false;
                            }

                            /* X < 1, not right outer edge */
                            if (de::abs(outer_edge_vertices[n_vertex][0] - 1.0f) > epsilon)
                            {
                                is_right_outer_edge = false;
                            }

                            /* Y > 0, not bottom outer edge */
                            if (de::abs(outer_edge_vertices[n_vertex][1]) > epsilon)
                            {
                                is_bottom_outer_edge = false;
                            }

                            /* X > 0, not left outer edge */
                            if (de::abs(outer_edge_vertices[n_vertex][0]) > epsilon)
                            {
                                is_left_outer_edge = false;
                            }
                        }

                        if (n_outer_edge_vertices == 1)
                        {
                            /* A single vertex with corner-coordinates belongs to two edges. Choose one */
                            bool x_is_0 = de::abs(outer_edge_vertices[0][0]) < epsilon;
                            bool x_is_1 = de::abs(outer_edge_vertices[0][0] - 1.0f) < epsilon;
                            bool y_is_0 = de::abs(outer_edge_vertices[0][1]) < epsilon;
                            bool y_is_1 = de::abs(outer_edge_vertices[0][1] - 1.0f) < epsilon;

                            if (x_is_0 && y_is_0)
                            {
                                /* bottom edge */
                                DE_ASSERT(is_left_outer_edge && is_bottom_outer_edge);
                                is_left_outer_edge = false;
                            }
                            else if (x_is_0 && y_is_1)
                            {
                                /* left edge */
                                DE_ASSERT(is_left_outer_edge && is_top_outer_edge);
                                is_top_outer_edge = false;
                            }
                            else if (x_is_1 && y_is_0)
                            {
                                /* right edge */
                                DE_ASSERT(is_right_outer_edge && is_bottom_outer_edge);
                                is_bottom_outer_edge = false;
                            }
                            else if (x_is_1 && y_is_1)
                            {
                                /* top edge */
                                DE_ASSERT(is_right_outer_edge && is_top_outer_edge);
                                is_right_outer_edge = false;
                            }
                            else
                            {
                                /* Not a corner vertex, only one of the edge-flags is set */
                            }
                        }

                        /* Sanity checks */
                        DE_UNREF(is_top_outer_edge);
                        DE_ASSERT((is_left_outer_edge && !is_top_outer_edge && !is_bottom_outer_edge &&
                                   !is_right_outer_edge) ||
                                  (!is_left_outer_edge && is_top_outer_edge && !is_bottom_outer_edge &&
                                   !is_right_outer_edge) ||
                                  (!is_left_outer_edge && !is_top_outer_edge && is_bottom_outer_edge &&
                                   !is_right_outer_edge) ||
                                  (!is_left_outer_edge && !is_top_outer_edge && !is_bottom_outer_edge &&
                                   is_right_outer_edge));

                        /* We have all the data needed to determine which tessellation level describes
                         * subdivision of the edge that the triangle touches */
                        if (is_left_outer_edge)
                        {
                            n_base_tess_level = 0;
                        }
                        else if (is_bottom_outer_edge)
                        {
                            n_base_tess_level = 1;
                        }
                        else if (is_right_outer_edge)
                        {
                            n_base_tess_level = 2;
                        }
                        else
                        {
                            n_base_tess_level = 3;
                        }
                    }

                    /* We shouldn't perform the check if the edge we're processing was described
                     * by a different outer tessellation level in the reference data set */
                    if (n_base_tess_level == ref_iteration.n_modified_outer_tess_level)
                    {
                        continue;
                    }

                    /* This triangle should be present in both vertex data sets */
                    if (!isTriangleDefinedInVertexDataSet(base_triangle_data, ref_iteration_vertex_data,
                                                          ref_iteration.n_vertices))
                    {
                        const char *primitive_mode_str = (is_triangles_iteration) ? "triangles" : "quads";

                        m_testCtx.getLog()
                            << tcu::TestLog::Message << "For primitive mode [" << primitive_mode_str << "] "
                            << ", inner tessellation levels:"
                            << "[" << base_iteration.inner_tess_levels[0] << ", " << base_iteration.inner_tess_levels[1]
                            << "], outer tessellation levels:"
                            << "[" << base_iteration.outer_tess_levels[0] << ", " << base_iteration.outer_tess_levels[1]
                            << ", " << base_iteration.outer_tess_levels[2] << ", "
                            << base_iteration.outer_tess_levels[3] << "], a triangle connecting inner & outer edges:"
                            << "[" << base_triangle_vertex1[0] << ", " << base_triangle_vertex1[1] << ", "
                            << base_triangle_vertex1[2] << "]x"
                            << "[" << base_triangle_vertex2[0] << ", " << base_triangle_vertex2[1] << ", "
                            << base_triangle_vertex2[2] << "]x"
                            << "[" << base_triangle_vertex3[0] << ", " << base_triangle_vertex3[1] << ", "
                            << base_triangle_vertex3[2]
                            << "] was not found for runs using CW and CCW vertex ordering, "
                               "which is against the extension specification's rule 7."
                            << tcu::TestLog::EndMessage;

                        TCU_FAIL("Implementation is not conformant with Tessellation Rule 7");
                    }
                } /* for (all triangles generated for base test iteration) */
            }     /* for (all reference iterations) */
        }         /* for (all base test iterations) */
    }             /* for (both primitive types) */
}

} /* namespace glcts */
