// // Copyright 2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // CollectVariables_test.cpp: // Some tests for shader inspection // #include <memory> #include "GLSLANG/ShaderLang.h" #include "angle_gl.h" #include "compiler/translator/glsl/TranslatorGLSL.h" #include "gtest/gtest.h" usingnamespacesh; #define EXPECT_GLENUM_EQ(expected, actual) … namespace { std::string DecorateName(const char *name) { … } } // anonymous namespace class CollectVariablesTest : public testing::Test { … }; class CollectVertexVariablesTest : public CollectVariablesTest { … }; class CollectFragmentVariablesTest : public CollectVariablesTest { … }; class CollectVariablesTestES31 : public CollectVariablesTest { … }; class CollectVariablesEXTGeometryShaderTest : public CollectVariablesTestES31 { … }; class CollectGeometryVariablesTest : public CollectVariablesEXTGeometryShaderTest { … }; class CollectFragmentVariablesEXTGeometryShaderTest : public CollectVariablesEXTGeometryShaderTest { … }; class CollectVertexVariablesES31Test : public CollectVariablesTestES31 { … }; class CollectFragmentVariablesES31Test : public CollectVariablesTestES31 { … }; TEST_F(CollectFragmentVariablesTest, SimpleOutputVar) { … } TEST_F(CollectFragmentVariablesTest, LocationOutputVar) { … } TEST_F(CollectVertexVariablesTest, LocationAttribute) { … } TEST_F(CollectVertexVariablesTest, SimpleInterfaceBlock) { … } TEST_F(CollectVertexVariablesTest, SimpleInstancedInterfaceBlock) { … } TEST_F(CollectVertexVariablesTest, StructInterfaceBlock) { … } TEST_F(CollectVertexVariablesTest, StructInstancedInterfaceBlock) { … } TEST_F(CollectVertexVariablesTest, NestedStructRowMajorInterfaceBlock) { … } TEST_F(CollectVertexVariablesTest, VaryingInterpolation) { … } // Test for builtin uniform "gl_DepthRange" (Vertex shader) TEST_F(CollectVertexVariablesTest, DepthRange) { … } // Test for builtin uniform "gl_DepthRange" (Fragment shader) TEST_F(CollectFragmentVariablesTest, DepthRange) { … } // Test that gl_FragColor built-in usage in ESSL1 fragment shader is reflected in the output // variables list. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragColor) { … } // Test that gl_FragData built-in usage in ESSL1 fragment shader is reflected in the output // variables list. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragData) { … } // Test that gl_FragData built-in usage in ESSL1 fragment shader is reflected in the output // variables list, even if the EXT_draw_buffers extension isn't exposed. This covers the // usage in the dEQP test dEQP-GLES3.functional.shaders.fragdata.draw_buffers. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragDataUniform) { … } // Test that gl_FragDataEXT built-in usage in ESSL1 fragment shader is reflected in the output // variables list. Also test that the precision is mediump. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragDepthMediump) { … } // Test that gl_FragDataEXT built-in usage in ESSL1 fragment shader is reflected in the output // variables list. Also test that the precision is highp if user requests it. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1FragDepthHighp) { … } // Test that gl_FragData built-in usage in ESSL3 fragment shader is reflected in the output // variables list. Also test that the precision is highp. TEST_F(CollectFragmentVariablesTest, OutputVarESSL3FragDepthHighp) { … } // Test that gl_SecondaryFragColorEXT built-in usage in ESSL1 fragment shader is reflected in the // output variables list. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1EXTBlendFuncExtendedSecondaryFragColor) { … } // Test that gl_SecondaryFragDataEXT built-in usage in ESSL1 fragment shader is reflected in the // output variables list. TEST_F(CollectFragmentVariablesTest, OutputVarESSL1EXTBlendFuncExtendedSecondaryFragData) { … } static khronos_uint64_t SimpleTestHash(const char *str, size_t len) { … } class CollectHashedVertexVariablesTest : public CollectVertexVariablesTest { … }; TEST_F(CollectHashedVertexVariablesTest, InstancedInterfaceBlock) { … } // Test a struct uniform where the struct does have a name. TEST_F(CollectHashedVertexVariablesTest, StructUniform) { … } // Test a struct uniform where the struct doesn't have a name. TEST_F(CollectHashedVertexVariablesTest, NamelessStructUniform) { … } // Test a uniform declaration with multiple declarators. TEST_F(CollectFragmentVariablesTest, MultiDeclaration) { … } // Test a uniform declaration starting with an empty declarator. TEST_F(CollectFragmentVariablesTest, EmptyDeclarator) { … } // Test collecting variables from an instanced multiview shader that has an internal ViewID_OVR // varying. TEST_F(CollectVertexVariablesTest, ViewID_OVR) { … } // Test all the fields of gl_in can be collected correctly in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectGLInFields) { … } // Test the collected array size of gl_in matches the input primitive declaration. TEST_F(CollectGeometryVariablesTest, GLInArraySize) { … } // Test collecting gl_PrimitiveIDIn in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectPrimitiveIDIn) { … } // Test collecting gl_InvocationID in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectInvocationID) { … } // Test collecting gl_in in a geometry shader when gl_in is indexed by an expression. TEST_F(CollectGeometryVariablesTest, CollectGLInIndexedByExpression) { … } // Test collecting gl_Position in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectPosition) { … } // Test collecting gl_PrimitiveID in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectPrimitiveID) { … } // Test collecting gl_Layer in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectLayer) { … } // Test collecting gl_PrimitiveID in a fragment shader. TEST_F(CollectFragmentVariablesEXTGeometryShaderTest, CollectPrimitiveID) { … } // Test collecting gl_Layer in a fragment shader. TEST_F(CollectFragmentVariablesEXTGeometryShaderTest, CollectLayer) { … } // Test collecting the location of vertex shader outputs. TEST_F(CollectVertexVariablesES31Test, CollectOutputWithLocation) { … } // Test collecting the location of fragment shader inputs. TEST_F(CollectFragmentVariablesES31Test, CollectInputWithLocation) { … } // Test collecting the inputs of a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectInputs) { … } // Test that the unsized input of a geometry shader can be correctly collected. TEST_F(CollectGeometryVariablesTest, CollectInputArraySizeForUnsizedInput) { … } // Test collecting inputs using interpolation qualifiers in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectInputsWithInterpolationQualifiers) { … } // Test collecting outputs using interpolation qualifiers in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectOutputsWithInterpolationQualifiers) { … } // Test collecting outputs using 'invariant' qualifier in a geometry shader. TEST_F(CollectGeometryVariablesTest, CollectOutputsWithInvariant) { … } // Test collecting a varying variable that is used inside a folded ternary operator. The result of // the folded ternary operator has a different qualifier from the original variable, which makes // this case tricky. TEST_F(CollectFragmentVariablesTest, VaryingUsedInsideFoldedTernary) { … } // Test a variable that is statically used but not active. The variable is used in a branch of a // ternary op that is not evaluated. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveInTernaryOp) { … } // Test a variable that is statically used but not active. The variable is a return value in an // unused function. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsReturnValue) { … } // Test a variable that is statically used but not active. The variable is an if statement condition // inside a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsIfCondition) { … } // Test a variable that is statically used but not active. The variable is a constructor argument in // a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsConstructorArgument) { … } // Test a variable that is statically used but not active. The variable is a binary operator operand // in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsBinaryOpOperand) { … } // Test a variable that is statically used but not active. The variable is a comparison operator // operand in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsComparisonOpOperand) { … } // Test a variable that is statically used but not active. The variable is an unary operator operand // in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsUnaryOpOperand) { … } // Test a variable that is statically used but not active. The variable is an rvalue in an assigment // in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsAssignmentRValue) { … } // Test a variable that is statically used but not active. The variable is a comma operator operand // in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsCommaOperand) { … } // Test a variable that is statically used but not active. The variable is a switch init statement // in a block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsSwitchInitStatement) { … } // Test a variable that is statically used but not active. The variable is a loop condition in a // block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsLoopCondition) { … } // Test a variable that is statically used but not active. The variable is a loop expression in a // block that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsLoopExpression) { … } // Test a variable that is statically used but not active. The variable is a vector index in a block // that is not executed. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveAsVectorIndex) { … } // Test a variable that is statically used but not active. The variable is referenced in a block // that's not executed. This is a bit of a corner case with some room for interpretation, but we // treat the variable as statically used. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveJustAReference) { … } // Test a variable that is statically used but not active. The variable is referenced in a block // without braces that's not executed. This is a bit of a corner case with some room for // interpretation, but we treat the variable as statically used. TEST_F(CollectFragmentVariablesTest, StaticallyUsedButNotActiveJustAReferenceNoBracesIf) { … } // Test a variable that is referenced in a loop body without braces. TEST_F(CollectFragmentVariablesTest, JustAVariableReferenceInNoBracesLoop) { … } // Test an interface block member variable that is statically used but not active. TEST_F(CollectVertexVariablesTest, StaticallyUsedButNotActiveSimpleInterfaceBlock) { … } // Test an interface block instance variable that is statically used but not active. TEST_F(CollectVertexVariablesTest, StaticallyUsedButNotActiveInstancedInterfaceBlock) { … } // Test an interface block member variable that is statically used. The variable is used to call // array length method. TEST_F(CollectVertexVariablesTest, StaticallyUsedInArrayLengthOp) { … } // Test a varying that is declared invariant but not otherwise used. TEST_F(CollectVertexVariablesTest, VaryingOnlyDeclaredInvariant) { … } // Test an output variable that is declared with the index layout qualifier from // EXT_blend_func_extended. TEST_F(CollectFragmentVariablesTest, OutputVarESSL3EXTBlendFuncExtendedIndex) { … }