/*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES 3.1 Module * ------------------------------------------------- * * Copyright 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief Negative Precise Tests *//*--------------------------------------------------------------------*/ #include "es31fNegativePreciseTests.hpp" #include "gluShaderProgram.hpp" #include "glwEnums.hpp" namespace deqp { namespace gles31 { namespace Functional { namespace NegativeTestShared { namespace { enum TestPrecise { TEST_PRECISE_AS_VARIABLE_NAME = 0, TEST_PRECISE_AS_FUNCTION_NAME, TEST_PRECISE_AS_ARGUMENT_NAME, TEST_PRECISE_AS_MACRO_NAME, TEST_PRECISE_MACRO_AND_VARIABLE, TEST_PRECISE_MACRO_AND_FUNCTION, TEST_PRECISE_MACRO_AND_ARGUMENT, TEST_PRECISE_LAST }; static const glu::ShaderType s_shaderTypes[] = { glu::SHADERTYPE_VERTEX, glu::SHADERTYPE_FRAGMENT, glu::SHADERTYPE_GEOMETRY, glu::SHADERTYPE_COMPUTE, glu::SHADERTYPE_TESSELLATION_CONTROL, glu::SHADERTYPE_TESSELLATION_EVALUATION }; std::string generateShaderSource (NegativeTestContext& ctx, glu::ShaderType shaderType, TestPrecise test) { const bool supportsES32 = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)); const glu::GLSLVersion version = supportsES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES; std::ostringstream source; source << glu::getGLSLVersionDeclaration(version) << "\n" << (supportsES32 ? "" : "#extension GL_EXT_gpu_shader5 : enable\n"); switch (test) { case TEST_PRECISE_AS_MACRO_NAME: source << "#define precise 0\n"; break; case TEST_PRECISE_MACRO_AND_VARIABLE: case TEST_PRECISE_MACRO_AND_FUNCTION: case TEST_PRECISE_MACRO_AND_ARGUMENT: source << "#define precise aName\n"; break; default: break; } switch (shaderType) { case glu::SHADERTYPE_GEOMETRY: source << (supportsES32 ? "" : "#extension GL_EXT_geometry_shader : enable\n") << "layout(max_vertices = 5) out;\n"; break; case glu::SHADERTYPE_TESSELLATION_CONTROL: source << (supportsES32 ? "" : "#extension GL_EXT_tessellation_shader : enable\n") << "layout(vertices = 3) out;\n"; break; case glu::SHADERTYPE_TESSELLATION_EVALUATION: source << (supportsES32 ? "" : "#extension GL_EXT_tessellation_shader : enable\n") << "layout(triangles, equal_spacing, cw) in;\n"; break; default: break; } switch (test) { case TEST_PRECISE_AS_FUNCTION_NAME: case TEST_PRECISE_MACRO_AND_FUNCTION: source << "\n" << "void precise()\n" << "{\n" << "}\n"; break; case TEST_PRECISE_AS_ARGUMENT_NAME: case TEST_PRECISE_MACRO_AND_ARGUMENT: source << "\n" << "void example(int precise)\n" << "{\n" << "}\n"; break; default: break; } source << "void main()\n" << "{\n"; switch (test) { case TEST_PRECISE_AS_VARIABLE_NAME: case TEST_PRECISE_MACRO_AND_VARIABLE: source << " int precise = 1;\n"; break; case TEST_PRECISE_AS_MACRO_NAME: source << " int number = precise;\n"; break; default: break; } source << "}\n"; return source.str(); } void generateAndVerifyShader (NegativeTestContext& ctx, glu::ShaderType shaderType, TestPrecise test) { glu::Shader shader (ctx.getRenderContext(), shaderType); std::string shaderSource = generateShaderSource(ctx, shaderType, test); const char* const source = shaderSource.c_str(); const int length = (int) shaderSource.size(); shader.setSources(1, &source, &length); shader.compile(); ctx.getLog() << shader; if (shader.getCompileStatus()) ctx.fail("Shader was not expected to compile."); } void precise_as_variable_name (NegativeTestContext& ctx) { TCU_CHECK_AND_THROW(NotSupportedError, ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher."); ctx.beginSection("Test that precise cannot be used as a variable name."); for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx) { if (ctx.isShaderSupported(s_shaderTypes[ndx])) generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_VARIABLE_NAME); } ctx.endSection(); } void precise_as_function_name (NegativeTestContext& ctx) { TCU_CHECK_AND_THROW(NotSupportedError, ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher."); ctx.beginSection("Test that precise cannot be used as a function name."); for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx) { if (ctx.isShaderSupported(s_shaderTypes[ndx])) generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_FUNCTION_NAME); } ctx.endSection(); } void precise_as_function_argument (NegativeTestContext& ctx) { TCU_CHECK_AND_THROW(NotSupportedError, ctx.isExtensionSupported("GL_EXT_gpu_shader5") || contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2)), "This test requires support for the extension GL_EXT_gpu_shader5 or context version 3.2 or higher."); ctx.beginSection("Test that precise cannot be used as a argument name."); for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaderTypes); ++ndx) { if (ctx.isShaderSupported(s_shaderTypes[ndx])) generateAndVerifyShader(ctx, s_shaderTypes[ndx], TEST_PRECISE_AS_ARGUMENT_NAME); } ctx.endSection(); } } // anonymous std::vector<FunctionContainer> getNegativePreciseTestFunctions (void) { const FunctionContainer funcs[] = { {precise_as_variable_name, "precise_as_variable_name", "Test precise keyword as variable name." }, {precise_as_function_name, "precise_as_function_name", "Test precise keyword as function name." }, {precise_as_function_argument, "precise_as_function_argument", "Test precise keyword as argument name." }, }; return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs)); } } // NegativeTestShared } // Functional } // gles31 } // deqp