148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "esextcTessellationShaderErrors.hpp"
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp"
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDefs.hpp"
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstdarg>
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstdio>
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstring>
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context       Test context
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name          Test case's name
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param description   Test case's description
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrors::TessellationShaderErrors(Context& context, const ExtParameters& extParams)
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroupBase(context, extParams, "compilation_and_linking_errors",
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						"Checks that the implementation correctly responds to"
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						"various errors in shaders which should result in compilation"
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos						"or linking errors")
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/* Instantiates all tests and adds them as children to the node */
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid TessellationShaderErrors::init(void)
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError1InputBlocks(m_context, m_extParams));
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError1InputVariables(m_context, m_extParams));
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError2OutputBlocks(m_context, m_extParams));
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError2OutputVariables(m_context, m_extParams));
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError3InputBlocks(m_context, m_extParams));
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError3InputVariables(m_context, m_extParams));
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError4InputBlocks(m_context, m_extParams));
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError4InputVariables(m_context, m_extParams));
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError5InputBlocks(m_context, m_extParams));
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError5InputVariables(m_context, m_extParams));
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError6(m_context, m_extParams));
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError7(m_context, m_extParams));
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError8(m_context, m_extParams));
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError9(m_context, m_extParams));
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError10(m_context, m_extParams));
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError11(m_context, m_extParams));
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError12(m_context, m_extParams));
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new glcts::TessellationShaderError13(m_context, m_extParams));
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context       Test context
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param name          Test case's name
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param description   Test case's description
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::TessellationShaderErrorsTestCaseBase(Context&				context,
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		   const ExtParameters& extParams,
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		   const char* name, const char* description)
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseBase(context, extParams, name, description)
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_fs_ids(DE_NULL)
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_n_program_objects(0)
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_po_ids(DE_NULL)
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_tc_ids(DE_NULL)
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_te_ids(DE_NULL)
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_vs_ids(DE_NULL)
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank intentionally */
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Deinitializes all ES objects that were created for the test */
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid TessellationShaderErrorsTestCaseBase::deinit()
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Call base class' deinit() */
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	TestCaseBase::deinit();
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!m_is_tessellation_shader_supported)
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return;
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release all shader objects created for the test */
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_program_object = 0; n_program_object < m_n_program_objects; ++n_program_object)
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_fs_ids != DE_NULL && m_fs_ids[n_program_object] != 0)
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteShader(m_fs_ids[n_program_object]);
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_fs_ids[n_program_object] = 0;
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_po_ids != DE_NULL && m_po_ids[n_program_object] != 0)
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteProgram(m_po_ids[n_program_object]);
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_po_ids[n_program_object] = 0;
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_tc_ids != DE_NULL && m_tc_ids[n_program_object] != 0)
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteShader(m_tc_ids[n_program_object]);
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_tc_ids[n_program_object] = 0;
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_te_ids != DE_NULL && m_te_ids[n_program_object] != 0)
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteShader(m_te_ids[n_program_object]);
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_te_ids[n_program_object] = 0;
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (m_vs_ids != DE_NULL && m_vs_ids[n_program_object] != 0)
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.deleteShader(m_vs_ids[n_program_object]);
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_vs_ids[n_program_object] = 0;
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} /* for (all shader objects) */
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Release buffers allocated for the test */
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_fs_ids != DE_NULL)
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_fs_ids;
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fs_ids = DE_NULL;
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_po_ids != DE_NULL)
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_po_ids;
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_ids = DE_NULL;
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_tc_ids != DE_NULL)
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_tc_ids;
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_tc_ids = DE_NULL;
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_te_ids != DE_NULL)
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_te_ids;
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_te_ids = DE_NULL;
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_vs_ids != DE_NULL)
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		delete[] m_vs_ids;
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vs_ids = DE_NULL;
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Executes the test.
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise.
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  Note the function throws exception should an error occur!
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return STOP if the test has finished, CONTINUE to indicate iterate() should be called once again.
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulostcu::TestNode::IterateResult TessellationShaderErrorsTestCaseBase::iterate()
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Do not execute if required extensions are not supported. */
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!m_is_tessellation_shader_supported)
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		throw tcu::NotSupportedError(TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED);
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Retrieve ES entry-points */
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Create as many program objects as will be needed */
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_n_program_objects = getAmountOfProgramObjects();
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_po_ids			= new glw::GLuint[m_n_program_objects];
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	memset(m_po_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_po = 0; n_po < m_n_program_objects; ++n_po)
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_po_ids[n_po] = gl.createProgram();
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram() failed");
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Allocate space for shader IDs */
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_fs_used = isPipelineStageUsed(PIPELINE_STAGE_FRAGMENT);
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_tc_used = isPipelineStageUsed(PIPELINE_STAGE_TESSELLATION_CONTROL);
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_te_used = isPipelineStageUsed(PIPELINE_STAGE_TESSELLATION_EVALUATION);
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool is_vs_used = isPipelineStageUsed(PIPELINE_STAGE_VERTEX);
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_fs_used)
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_fs_ids = new glw::GLuint[m_n_program_objects];
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(m_fs_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_tc_used)
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_tc_ids = new glw::GLuint[m_n_program_objects];
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(m_tc_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_te_used)
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_te_ids = new glw::GLuint[m_n_program_objects];
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(m_te_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (is_vs_used)
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_vs_ids = new glw::GLuint[m_n_program_objects];
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		memset(m_vs_ids, 0, sizeof(glw::GLuint) * m_n_program_objects);
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Iterate through all program objects the test wants to check */
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int n_po = 0; n_po < m_n_program_objects; ++n_po)
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		_linking_result expected_linking_result = getLinkingResult();
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		bool			should_try_to_link		= true;
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Iterate through all shader types */
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int stage = static_cast<int>(PIPELINE_STAGE_FIRST); stage < static_cast<int>(PIPELINE_STAGE_COUNT);
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 stage++)
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (!isPipelineStageUsed(static_cast<_pipeline_stage>(stage)))
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				continue;
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			_compilation_result expected_compilation_result = getCompilationResult(static_cast<_pipeline_stage>(stage));
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string			so_code;
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLuint*		so_id_ptr = DE_NULL;
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string			so_type;
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			switch (static_cast<_pipeline_stage>(stage))
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case PIPELINE_STAGE_FRAGMENT:
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_code   = getFragmentShaderCode(n_po);
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_id_ptr = m_fs_ids + n_po;
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_type   = "fragment";
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case PIPELINE_STAGE_TESSELLATION_CONTROL:
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_code   = getTessellationControlShaderCode(n_po);
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_id_ptr = m_tc_ids + n_po;
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_type   = "tessellation control";
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case PIPELINE_STAGE_TESSELLATION_EVALUATION:
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_code   = getTessellationEvaluationShaderCode(n_po);
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_id_ptr = m_te_ids + n_po;
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_type   = "tessellation evaluation";
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case PIPELINE_STAGE_VERTEX:
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_code   = getVertexShaderCode(n_po);
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_id_ptr = m_vs_ids + n_po;
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				so_type   = "vertex";
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			default:
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				TCU_FAIL("Unrecognized pipeline stage");
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			} /* switch (stage) */
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Generate the shader object */
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			*so_id_ptr = gl.createShader(getGLEnumForPipelineStage(static_cast<_pipeline_stage>(stage)));
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader() failed");
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Assign source code to the object */
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const char* so_unspecialized_code_ptr = so_code.c_str();
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			std::string so_specialized_code		  = specializeShader(1, &so_unspecialized_code_ptr);
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			const char* so_code_ptr				  = so_specialized_code.c_str();
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.shaderSource(*so_id_ptr, 1 /* count */, &so_code_ptr, NULL /* length */);
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() failed");
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Try to compile the shader object */
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLint compile_status = GL_FALSE;
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.compileShader(*so_id_ptr);
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() failed");
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Retrieve the compile status and make sure it matches the desired outcome */
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getShaderiv(*so_id_ptr, GL_COMPILE_STATUS, &compile_status);
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv() failed");
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3363890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski			m_context.getTestContext().getLog() << tcu::TestLog::Message << so_type << " shader source:\n"
3373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski												<< so_code_ptr << tcu::TestLog::EndMessage;
3383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLint length = 0;
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getShaderiv(*so_id_ptr, GL_INFO_LOG_LENGTH, &length);
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (length > 1)
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				std::vector<glw::GLchar> log(length);
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.getShaderInfoLog(*so_id_ptr, length, NULL, &log[0]);
3453890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog() << tcu::TestLog::Message << "shader info log\n"
3463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski													<< &log[0] << tcu::TestLog::EndMessage;
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			switch (expected_compilation_result)
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case COMPILATION_RESULT_CAN_FAIL:
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (compile_status == GL_FALSE)
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* OK, this is valid. However, it no longer makes sense to try to
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					 * link the program object at this point. */
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					should_try_to_link = false;
3583890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
3593890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Compilation failed as allowed." << tcu::TestLog::EndMessage;
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* That's fine. */
3643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
3653890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Compilation passed as allowed." << tcu::TestLog::EndMessage;
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case COMPILATION_RESULT_MUST_FAIL:
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (compile_status == GL_TRUE)
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Test has failed */
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					TCU_FAIL("A shader compiled successfully, even though it should have failed "
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 "to do so");
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* OK. Mark the program object as non-linkable */
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					should_try_to_link = false;
3833890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
3843890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Compilation failed as expected." << tcu::TestLog::EndMessage;
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case COMPILATION_RESULT_MUST_SUCCEED:
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (compile_status != GL_TRUE)
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* Test has failed */
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					TCU_FAIL("A shader failed to compile, even though it should have succeeded "
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							 "to do so");
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* That's fine. */
4013890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
4023890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Compilation successful as expected." << tcu::TestLog::EndMessage;
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			default:
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				TCU_FAIL("Unrecognized expected compilation result");
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			} /* switch (expected_compilation_result) */
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* If it still makes sense to do so, attach the shader object to
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 * the test program object */
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (should_try_to_link)
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.attachShader(m_po_ids[n_po], *so_id_ptr);
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader() failed");
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		} /* for (all pipeline stages) */
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* If it still makes sense, try to link the program object */
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (should_try_to_link)
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.linkProgram(m_po_ids[n_po]);
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() failed");
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			/* Retrieve the link status and compare it against the expected linking result */
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLint link_status = GL_FALSE;
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getProgramiv(m_po_ids[n_po], GL_LINK_STATUS, &link_status);
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() failed");
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glw::GLint length = 0;
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			gl.getProgramiv(m_po_ids[n_po], GL_INFO_LOG_LENGTH, &length);
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			if (length > 1)
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				std::vector<glw::GLchar> log(length);
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				gl.getProgramInfoLog(m_po_ids[n_po], length, NULL, &log[0]);
4413890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski				m_context.getTestContext().getLog() << tcu::TestLog::Message << "program info log\n"
4423890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski													<< &log[0] << tcu::TestLog::EndMessage;
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			switch (expected_linking_result)
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case LINKING_RESULT_MUST_FAIL:
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (link_status != GL_FALSE)
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					TCU_FAIL("Program object was expected not to link but linking operation succeeded.");
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* That's OK */
4563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
4573890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Linking failed as expected." << tcu::TestLog::EndMessage;
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			case LINKING_RESULT_MUST_SUCCEED:
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				if (link_status != GL_TRUE)
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					TCU_FAIL("Program object was expected to link successfully but linking operation failed.");
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				else
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				{
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos					/* That's OK */
4723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski					m_context.getTestContext().getLog()
4733890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski						<< tcu::TestLog::Message << "Linking succeeded as expected." << tcu::TestLog::EndMessage;
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				}
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				break;
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			default:
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			{
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				TCU_FAIL("Unrecognized expected linking result");
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			}
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			} /* switch (expected_linking_result) */
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}	 /* if (should_try_to_link) */
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}		  /* for (all program objects) */
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* If this point was reached, the test executed successfully */
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves amount of program objects the test that should be linked for
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  the prupose of the test.
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return As per description.
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosunsigned int TessellationShaderErrorsTestCaseBase::getAmountOfProgramObjects()
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return 1;
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of fragment shader that should be attached to the test
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Fragment shader source code to be used for user-specified program object.
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderErrorsTestCaseBase::getFragmentShaderCode(unsigned int n_program_object)
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves GLenum equivalent of a pipeline stage value.
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  Throws TestError exception if @param stage is invalid.
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param stage Pipeline stage to convert from
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return GL_*_SHADER equivalent of the user-provided value.
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosglw::GLenum TessellationShaderErrorsTestCaseBase::getGLEnumForPipelineStage(_pipeline_stage stage)
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::GLenum result = GL_NONE;
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (stage)
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_FRAGMENT:
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_FRAGMENT_SHADER;
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = m_glExtTokens.TESS_CONTROL_SHADER;
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = m_glExtTokens.TESS_EVALUATION_SHADER;
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_VERTEX:
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		result = GL_VERTEX_SHADER;
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		break;
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		TCU_FAIL("Unrecognized pipeline stage");
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result;
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of vertex shader that should be attached to the test
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Vertex shader source code to be used for user-specified program object.
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderErrorsTestCaseBase::getVertexShaderCode(unsigned int n_program_object)
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError1InputBlocks::TessellationShaderError1InputBlocks(Context&			  context,
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		 const ExtParameters& extParams)
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_input_blocks",
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex input blocks"
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation control shader")
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError1InputBlocks::getCompilationResult(
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully
60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *
60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * NOTE: Vertex shader compilation can fail if underlying implementation does not support
60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 *       GL_EXT_shader_io_blocks.
60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 **/
60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_VERTEX:
60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
62048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError1InputBlocks::getLinkingResult()
62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input block declaration */
64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in IN_TC\n"
64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 test_block_field;\n"
64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} test_block;\n"
64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = test_block.test_block_field;\n"
65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                = 1.0;\n"
65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                = 1.0;\n"
65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                = 1.0;\n"
65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                = 1.0;\n"
65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of vertex shader that should be attached to the test
68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Vertex shader source code to be used for user-specified program object.
69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputBlocks::getVertexShaderCode(unsigned int n_program_object)
69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${SHADER_IO_BLOCKS_REQUIRE}\n"
70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out IN_TC\n"
70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 test_block_field;\n"
70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} test_block;\n"
70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_block.test_block_field = vec4(1.0, 2.0, 3.0, gl_VertexID);\n"
70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError1InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
73348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError1InputVariables::TessellationShaderError1InputVariables(Context&				context,
73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																			   const ExtParameters& extParams)
73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_input_variables",
73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex input variables"
73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation control shader")
73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
74848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError1InputVariables::getCompilationResult(
74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
76648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError1InputVariables::getLinkingResult()
76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input declaration */
79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in vec4 test_field;\n"
79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = test_field;\n"
79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                = 1.0;\n"
79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                = 1.0;\n"
79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                = 1.0;\n"
80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                = 1.0;\n"
80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of vertex shader that should be attached to the test
82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Vertex shader source code to be used for user-specified program object.
83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError1InputVariables::getVertexShaderCode(unsigned int n_program_object)
83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec4 test_field;\n"
84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_field = vec4(1.0, 2.0, 3.0, gl_VertexID);\n"
84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError1InputVariables::isPipelineStageUsed(_pipeline_stage stage)
86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
87148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError2OutputBlocks::TessellationShaderError2OutputBlocks(Context&				context,
87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		   const ExtParameters& extParams)
87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_output_blocks",
87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex output blocks"
87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation control shader")
87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
88648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError2OutputBlocks::getCompilationResult(
88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
90448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError2OutputBlocks::getLinkingResult()
90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError2OutputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid output block declaration */
92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out OUT_TC\n"
92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 test_block_field;\n"
93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} test_block;\n"
93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = test_block.test_block_field;\n"
93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_block.test_block_field         = gl_in[gl_InvocationID].gl_Position;\n"
93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                = 1.0;\n"
94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                = 1.0;\n"
94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                = 1.0;\n"
94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                = 1.0;\n"
94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError2OutputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError2OutputBlocks::isPipelineStageUsed(_pipeline_stage stage)
98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
99148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError2OutputVariables::TessellationShaderError2OutputVariables(Context&			  context,
99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																				 const ExtParameters& extParams)
99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_arrayed_per_vertex_output_variabless",
99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex output variables"
99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation control shader")
99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
100648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError2OutputVariables::getCompilationResult(
100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
102448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError2OutputVariables::getLinkingResult()
102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError2OutputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid output declaration */
104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec4 test_field;\n"
104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = vec4(2.0);\n"
105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_field                          = vec4(3.0);\n"
105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                = 1.0;\n"
105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                = 1.0;\n"
105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                = 1.0;\n"
105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                = 1.0;\n"
106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError2OutputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError2OutputVariables::isPipelineStageUsed(_pipeline_stage stage)
109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
110848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError3InputBlocks::TessellationShaderError3InputBlocks(Context&			  context,
110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		 const ExtParameters& extParams)
111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_non_arrayed_per_vertex_input_blocks",
111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex input blocks"
111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation evaluation shader")
111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
112348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError3InputBlocks::getCompilationResult(
112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation evaluation shader is allowed to fail to compile,
112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
114148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError3InputBlocks::getLinkingResult()
114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError3InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out IN_TE\n"
116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 test_block_field;\n"
116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} test_block[];\n"
116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out           [gl_InvocationID].gl_Position      = gl_in[gl_InvocationID].gl_Position;\n"
117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_block       [gl_InvocationID].test_block_field = vec4(2.0);\n"
117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                                = 1.0;\n"
117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                                = 1.0;\n"
117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                                = 1.0;\n"
117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                                = 1.0;\n"
117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                                = 1.0;\n"
117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                                = 1.0;\n"
117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError3InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input block declaration */
120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in IN_TE\n"
120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 test_block_field;\n"
120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} test_block;\n"
120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position * test_block.test_block_field;\n"
120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError3InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
123348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError3InputVariables::TessellationShaderError3InputVariables(Context&				context,
123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																			   const ExtParameters& extParams)
123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_non_arrayed_per_vertex_input_variables",
123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use non-arrayed per-vertex input variables "
123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation evaluation shader")
123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
124848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError3InputVariables::getCompilationResult(
124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation evaluation shader is allowed to fail to compile,
125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
126648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError3InputVariables::getLinkingResult()
126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError3InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec4 test_field[];\n"
129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out           [gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test_field       [gl_InvocationID]             = vec4(4.0);\n"
129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                           = 1.0;\n"
129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                           = 1.0;\n"
129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[2]                           = 1.0;\n"
129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[3]                           = 1.0;\n"
129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                           = 1.0;\n"
130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[1]                           = 1.0;\n"
130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError3InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input declaration */
132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in vec4 test_field;\n"
132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position * test_field;\n"
132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError3InputVariables::isPipelineStageUsed(_pipeline_stage stage)
134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
135248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError4InputBlocks::TessellationShaderError4InputBlocks(Context&			  context,
135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		 const ExtParameters& extParams)
135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_array_size_used_for_input_blocks",
135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use invalid array size when defining input blocks "
135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "in a tessellation control shader")
135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
136748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError4InputBlocks::getCompilationResult(
136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
138548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError4InputBlocks::getLinkingResult()
138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError4InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input block size */
140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in IN_TC\n"
141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 input_block_input;\n"
141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} input_block[11];\n"
141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = input_block[gl_InvocationID].input_block_input;\n"
141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError4InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError4InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
146748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError4InputVariables::TessellationShaderError4InputVariables(Context&				context,
146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																			   const ExtParameters& extParams)
146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_array_size_used_for_input_variables",
147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use invalid array size when defining input variables"
147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   " in a tessellation control shader")
147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
148248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError4InputVariables::getCompilationResult(
148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile,
148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
150048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError4InputVariables::getLinkingResult()
150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError4InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid array size */
152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in vec4 test_input[11];\n"
152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = test_input[gl_InvocationID];\n"
152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError4InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError4InputVariables::isPipelineStageUsed(_pipeline_stage stage)
156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
157448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
157548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
157648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
157748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
157848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
157948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError5InputBlocks::TessellationShaderError5InputBlocks(Context&			  context,
158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		 const ExtParameters& extParams)
158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_array_size_used_for_input_blocks",
158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use invalid array size when defining input "
158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "blocks in a tessellation evaluation shader")
158448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
158548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
158648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
158748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
158848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
158948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
159448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError5InputBlocks::getCompilationResult(
159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation evaluation shader is allowed to fail to compile,
159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
161248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError5InputBlocks::getLinkingResult()
161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError5InputBlocks::getTessellationControlShaderCode(unsigned int n_program_object)
162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError5InputBlocks::getTessellationEvaluationShaderCode(unsigned int n_program_object)
165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid input block size */
166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in IN_TC\n"
166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    vec4 input_block_input;\n"
166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "} input_block[11];\n"
166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position * input_block[0].input_block_input;\n"
167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError5InputBlocks::isPipelineStageUsed(_pipeline_stage stage)
168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
169448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError5InputVariables::TessellationShaderError5InputVariables(Context&				context,
169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																			   const ExtParameters& extParams)
169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_array_size_used_for_input_variables",
169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use invalid array size when defining input "
169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "variables in a tessellation evaluation shader")
169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
170948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError5InputVariables::getCompilationResult(
171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation evaluation shader is allowed to fail to compile,
171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	 * shaders for all other stages should compile successfully */
171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_EVALUATION:
171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
172748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError5InputVariables::getLinkingResult()
172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError5InputVariables::getTessellationControlShaderCode(unsigned int n_program_object)
174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError5InputVariables::getTessellationEvaluationShaderCode(unsigned int n_program_object)
176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   /* Invalid array size */
177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "in vec4 test_input[11];\n"
177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position * test_input[0];\n"
178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError5InputVariables::isPipelineStageUsed(_pipeline_stage stage)
179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
180648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError6::TessellationShaderError6(Context& context, const ExtParameters& extParams)
180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_output_patch_vertex_count",
180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to use invalid output patch vertex count in"
180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   " a tessellation control shader")
181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves amount of program objects the test that should be linked for
181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  the prupose of the test.
181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return As per description.
181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosunsigned int TessellationShaderError6::getAmountOfProgramObjects()
182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return 2;
182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
183048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError6::getCompilationResult(
183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Tessellation control shader is allowed to fail to compile */
183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	switch (pipeline_stage)
183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	case PIPELINE_STAGE_TESSELLATION_CONTROL:
183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_CAN_FAIL;
183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	default:
183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return COMPILATION_RESULT_MUST_SUCCEED;
184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
184748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError6::getLinkingResult()
184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError6::getTessellationControlShaderCode(unsigned int n_program_object)
186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::stringstream	 result;
186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const char*			  tc_code_preamble = "${VERSION}\n"
186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   "\n"
186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   "${TESSELLATION_SHADER_REQUIRE}\n"
186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   "\n";
186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const char* tc_code_body_excl_layout_qualifiers = "\n"
186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "in vec4 test_input[];\n"
187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "\n"
187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "void main()\n"
187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "{\n"
187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    gl_out[gl_InvocationID].gl_Position = test_input[0];\n"
187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    gl_TessLevelOuter[0]                = 1.0;\n"
187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "    gl_TessLevelOuter[1]                = 1.0;\n"
187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos													  "}\n";
187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Prepare the line with layout qualifier */
187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::stringstream tc_code_layout_qualifier_sstream;
188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string		  tc_code_layout_qualifier_string;
188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (n_program_object == 0)
188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tc_code_layout_qualifier_string = "layout (vertices = 0) out;\n";
188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Retrieve GL_MAX_PATCH_VERTICES_EXT value first */
188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::GLint gl_max_patch_vertices_value = 0;
189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getIntegerv(m_glExtTokens.MAX_PATCH_VERTICES, &gl_max_patch_vertices_value);
189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv() failed for GL_MAX_PATCH_VERTICES_EXT pname");
189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		/* Construct the string */
189548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tc_code_layout_qualifier_sstream << "layout (vertices = " << (gl_max_patch_vertices_value + 1) << ") out;\n";
189648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
189748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tc_code_layout_qualifier_string = tc_code_layout_qualifier_sstream.str();
189848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
189948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	result << tc_code_preamble << tc_code_layout_qualifier_string << tc_code_body_excl_layout_qualifiers;
190148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return result.str();
190348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
190448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
190548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError6::getTessellationEvaluationShaderCode(unsigned int n_program_object)
191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
193048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
193148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
193248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
193848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError6::isPipelineStageUsed(_pipeline_stage stage)
193948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
194048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
194648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
194748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
194848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
195048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError7::TessellationShaderError7(Context& context, const ExtParameters& extParams)
195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams,
195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "tc_invalid_write_operation_at_non_gl_invocation_id_index",
195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to write to a per-vertex output variable at index"
195448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   " which is not equal to gl_InvocationID")
195548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
195648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
196248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
196348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
196448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
196548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError7::getCompilationResult(
196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* TC stage should _may_ fail to compile (but linking *must* fail) */
196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_CONTROL) ? COMPILATION_RESULT_CAN_FAIL :
197048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																	 COMPILATION_RESULT_MUST_SUCCEED;
197148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
197248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
197748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError7::getLinkingResult()
197848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
197948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
198048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
198748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
198848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
198948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError7::getTessellationControlShaderCode(unsigned int n_program_object)
199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
199548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
199648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
199748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec4 test[];\n"
200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
200348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
200448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[2].gl_Position = gl_in[0].gl_Position;\n"
200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test[2]               = gl_in[1].gl_Position;\n"
200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
201048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
201148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
201248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError7::getTessellationEvaluationShaderCode(unsigned int n_program_object)
201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (quads) in;\n"
202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
203748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
203848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError7::isPipelineStageUsed(_pipeline_stage stage)
204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
204548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
204648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages used */
204748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
205348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
205448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError8::TessellationShaderError8(Context& context, const ExtParameters& extParams)
205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_invalid_input_per_patch_attribute_definition",
205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to define input per-patch attributes in "
205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "a tessellation control shader")
205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
206048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
206148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
206848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError8::getCompilationResult(
206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* TC stage should never compile, all stages are out of scope */
207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_CONTROL) ? COMPILATION_RESULT_MUST_FAIL :
207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																	 COMPILATION_RESULT_UNKNOWN;
207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
208048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError8::getLinkingResult()
208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError8::getTessellationControlShaderCode(unsigned int n_program_object)
209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch in vec4 test;\n"
210448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
210548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = test;\n"
210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
211148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
211248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
211848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
211948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError8::getTessellationEvaluationShaderCode(unsigned int n_program_object)
212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* This function should never be called */
212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(false);
212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "";
212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
212848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
212948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError8::isPipelineStageUsed(_pipeline_stage stage)
213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Only TC stage is used */
214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (stage == PIPELINE_STAGE_TESSELLATION_CONTROL);
214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
214648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
214748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
214848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError9::TessellationShaderError9(Context& context, const ExtParameters& extParams)
214948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_invalid_output_per_patch_attribute_definition",
215048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to define output per-patch attributes in "
215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "a tessellation evaluation shader")
215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
216048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
216148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
216248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError9::getCompilationResult(
216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* TE stage should never compile, all stages are out of scope */
216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_MUST_FAIL :
216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		COMPILATION_RESULT_UNKNOWN;
216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
217448087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError9::getLinkingResult()
217548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
217648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
217748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError9::getTessellationControlShaderCode(unsigned int n_program_object)
218848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
218948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* This function should never be called */
219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(false);
219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "";
219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
220048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
220148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError9::getTessellationEvaluationShaderCode(unsigned int n_program_object)
220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
221048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
221148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
221248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (isolines) in;\n"
221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch out vec4 test;\n"
221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = vec4(1.0, 0.0, 0.0, 0.0);\n"
222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test        = vec4(0.0, 1.0, 0.0, 0.0);\n"
222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
222348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
222448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
222548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError9::isPipelineStageUsed(_pipeline_stage stage)
223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Only TE stage is used */
223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (stage == PIPELINE_STAGE_TESSELLATION_EVALUATION);
223748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
223848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
224348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError10::TessellationShaderError10(Context& context, const ExtParameters& extParams)
224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "tc_non_matching_variable_declarations",
224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to define variables of different types/qualifications"
224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   " in tessellation control and tessellation evaluation shaders")
224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
224948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
225048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
225148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
225748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError10::getCompilationResult(
225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(pipeline_stage);
226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages should compile */
226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return COMPILATION_RESULT_MUST_SUCCEED;
226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
226948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError10::getLinkingResult()
227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
227348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
227448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
227548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError10::getTessellationControlShaderCode(unsigned int n_program_object)
228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
228848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
228948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch out float test;\n"
229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch out vec4  test2;\n"
229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test                                = 1.0;\n"
230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test2                               = vec4(0.1, 0.2, 0.3, 0.4);\n"
230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError10::getTessellationEvaluationShaderCode(unsigned int n_program_object)
231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch in uint  test;\n"
232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "patch in float test2;\n"
232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position * float(int(test)) * vec4(test2);\n"
232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
233348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
233448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
233548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError10::isPipelineStageUsed(_pipeline_stage stage)
234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
234848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
234948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
235048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
235248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError11::TessellationShaderError11(Context& context, const ExtParameters& extParams)
235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_lacking_primitive_mode_declaration",
235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to link a tessellation evaluation shader"
235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   " without a primitive mode declaration")
235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
236648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError11::getCompilationResult(
236748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
236848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
236948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(pipeline_stage);
237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages should compile */
237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return COMPILATION_RESULT_MUST_SUCCEED;
237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
237948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError11::getLinkingResult()
238048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
238148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError11::getTessellationControlShaderCode(unsigned int n_program_object)
239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
239948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelInner[0]                = 1.0;\n"
240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError11::getTessellationEvaluationShaderCode(unsigned int n_program_object)
241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_Position = gl_in[0].gl_Position;\n"
242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
243748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError11::isPipelineStageUsed(_pipeline_stage stage)
244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
244948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
245248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError12::TessellationShaderError12(Context& context, const ExtParameters& extParams)
245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_accessing_glTessCoord_as_array",
245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to access gl_TessCoord as if it was an array")
245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
246548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError12::getCompilationResult(
246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* It is OK for TE stage to fail to compile. Other stages must compile successfully */
246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages should compile */
247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_CAN_FAIL :
247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		COMPILATION_RESULT_MUST_SUCCEED;
247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
247848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError12::getLinkingResult()
247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError12::getTessellationControlShaderCode(unsigned int n_program_object)
249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
250948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError12::getTessellationEvaluationShaderCode(unsigned int n_program_object)
251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec3 test;\n"
252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test = gl_TessCoord[0].xyz;\n"
253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError12::isPipelineStageUsed(_pipeline_stage stage)
254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Constructor
255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * @param context Test context
255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
255548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderError13::TessellationShaderError13(Context& context, const ExtParameters& extParams)
255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TessellationShaderErrorsTestCaseBase(context, extParams, "te_accessing_glTessCoord_as_gl_in_member",
255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										   "Tries to access gl_TessCoord as if it was a gl_in[] member")
255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* Left blank on purpose */
256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what compilation result is anticipated for each of the pipeline stages.
256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param pipeline_stage Pipeline stage to return compilation result for.
256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Requested compilation result.
256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
256848087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_compilation_result TessellationShaderError13::getCompilationResult(
256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	_pipeline_stage pipeline_stage)
257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* It is OK for TE stage to fail to compile. Other stages must compile successfully */
257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	/* All stages should compile */
257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (pipeline_stage == PIPELINE_STAGE_TESSELLATION_EVALUATION) ? COMPILATION_RESULT_CAN_FAIL :
257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos																		COMPILATION_RESULT_MUST_SUCCEED;
257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Determines what linking result is anticipated for all program objects created by the test.
257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Expected linking result.
258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
258148087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosTessellationShaderErrorsTestCaseBase::_linking_result TessellationShaderError13::getLinkingResult()
258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return LINKING_RESULT_MUST_FAIL;
258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation control shader that should be attached to the test
258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation control shader source code to be used for user-specified program object.
259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError13::getTessellationControlShaderCode(unsigned int n_program_object)
259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout (vertices=4) out;\n"
260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[0]                = 1.0;\n"
260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    gl_TessLevelOuter[1]                = 1.0;\n"
260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Retrieves source code of tessellation evaluation shader that should be attached to the test
261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  program object.
261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param n_program_object Index of the program object the source code should
261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *                          be returned for.
261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return Tessellation evaluation shader source code to be used for user-specified program object.
261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */
262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstd::string TessellationShaderError13::getTessellationEvaluationShaderCode(unsigned int n_program_object)
262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(n_program_object);
262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return "${VERSION}\n"
262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "${TESSELLATION_SHADER_REQUIRE}\n"
262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "layout(isolines) in;\n"
262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "out vec3 test;\n"
263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "\n"
263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "void main()\n"
263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "{\n"
263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "    test = gl_in[0].gl_TessCoord;\n"
263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		   "}\n";
263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/** Tells whether given pipeline stage should be used for the purpose of the test
263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  (for all program objects).
264048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @param Stage to query.
264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *  @return True if a shader object implementing the stage should be attached to
264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          test program object;
264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *          False otherwise.
264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos **/
264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosbool TessellationShaderError13::isPipelineStageUsed(_pipeline_stage stage)
264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_UNREF(stage);
265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return true;
265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} /* namespace glcts */
2655