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