Path: blob/main_old/src/tests/compiler_tests/QualificationOrder_test.cpp
1693 views
//1// Copyright 2016 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// QualificationOrder_test.cpp:6// OpenGL ES 3.1 removes the strict order of qualifiers imposed by the grammar.7// This file contains tests for invalid order and usage of qualifiers.89#include "tests/test_utils/ShaderCompileTreeTest.h"1011using namespace sh;1213class QualificationOrderFragmentShaderTest : public ShaderCompileTreeTest14{15public:16QualificationOrderFragmentShaderTest() {}1718protected:19void initResources(ShBuiltInResources *resources) override20{21resources->MaxDrawBuffers = (getShaderSpec() == SH_GLES2_SPEC) ? 1 : 8;22}2324::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }2526ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }27};2829class QualificationOrderVertexShaderTest : public QualificationOrderFragmentShaderTest30{31public:32QualificationOrderVertexShaderTest() {}3334protected:35::GLenum getShaderType() const override { return GL_VERTEX_SHADER; }36};3738// Repeating centroid qualifier is invalid.39TEST_F(QualificationOrderFragmentShaderTest, RepeatingCentroid)40{41const std::string &shaderString =42"#version 300 es\n"43"precision mediump float;\n"44"flat centroid centroid in float myValue;\n"45"void main() {\n"46"}\n";4748if (compile(shaderString))49{50FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;51}52}5354// Repeating uniform storage qualifiers is invalid.55TEST_F(QualificationOrderFragmentShaderTest, RepeatingUniforms)56{57const std::string &shaderString =58"#version 300 es\n"59"precision mediump float;\n"60"uniform uniform float myValue;\n"61"void main() {\n"62"}\n";6364if (compile(shaderString))65{66FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;67}68}6970// Repeating varying storage qualifiers is invalid.71TEST_F(QualificationOrderFragmentShaderTest, RepeatingVaryings)72{73const std::string &shaderString =74"precision mediump float;\n"75"varying varying vec4 myColor;\n"76"void main() {\n"77"}\n";7879if (compile(shaderString))80{81FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;82}83}8485// Layout qualifier should be before the storage qualifiers.86TEST_F(QualificationOrderFragmentShaderTest, WrongOrderQualifiers)87{88const std::string &shaderString =89"#version 300 es\n"90"precision mediump float;\n"91"out layout(location=1) vec4 myColor;\n"92"void main() {\n"93"}\n";9495if (compile(shaderString))96{97FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;98}99}100101// Centroid out is the correct order. Out centroid is incorrect.102TEST_F(QualificationOrderVertexShaderTest, WrongOrderCentroidOut)103{104const std::string &shaderString =105"#version 300 es\n"106"precision mediump float;\n"107"in vec4 uv;\n"108"out centroid vec4 position;\n"109"void main() {\n"110"position = uv;\n"111"gl_Position = uv;\n"112"}\n";113114if (compile(shaderString))115{116FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;117}118}119120// Centroid in is the correct order. In centroid is incorrect.121TEST_F(QualificationOrderFragmentShaderTest, WrongOrderCentroidIn)122{123const std::string &shaderString =124"#version 300 es\n"125"precision mediump float;\n"126"in centroid vec4 colorIN;\n"127"out vec4 colorOUT;\n"128"void main() {\n"129"colorOUT = colorIN;\n"130"}\n";131132if (compile(shaderString))133{134FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;135}136}137138// Type cannot be before the storage qualifier.139TEST_F(QualificationOrderFragmentShaderTest, WrongOrderTypeStorage)140{141const std::string &shaderString =142"#version 300 es\n"143"precision mediump float;\n"144"centroid in vec4 colorIN;\n"145"vec4 out colorOUT;\n"146"void main() {\n"147"colorOUT = colorIN;\n"148"}\n";149150if (compile(shaderString))151{152FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;153}154}155156// A variable cannot have two conflicting storage qualifiers.157TEST_F(QualificationOrderFragmentShaderTest, RepeatingDifferentStorageQualifiers)158{159const std::string &shaderString =160"#version 300 es\n"161"precision mediump float;\n"162"centroid in vec4 colorIN;\n"163"uniform out vec4 colorOUT;\n"164"void main() {\n"165"colorOUT = colorIN;\n"166"}\n";167168if (compile(shaderString))169{170FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;171}172}173174// A variable cannot have two different layout qualifiers.175TEST_F(QualificationOrderFragmentShaderTest, RepeatingLayoutQualifiers)176{177const std::string &shaderString =178"#version 300 es\n"179"precision mediump float;\n"180"in vec4 colorIN;\n"181"layout(location=0) layout(location=0) out vec4 colorOUT;\n"182"void main() {\n"183"colorOUT = colorIN;\n"184"}\n";185186if (compile(shaderString))187{188FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;189}190}191192// A variable cannot have repeating invariant qualifiers.193TEST_F(QualificationOrderFragmentShaderTest, RepeatingInvariantQualifiers)194{195const std::string &shaderString =196"#version 300 es\n"197"precision mediump float;\n"198"in vec4 colorIN;\n"199"invariant invariant out vec4 colorOUT;\n"200"void main() {\n"201"colorOUT = colorIN;\n"202"}\n";203204if (compile(shaderString))205{206FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;207}208}209210// A variable cannot have repeating storage qualifiers.211TEST_F(QualificationOrderVertexShaderTest, RepeatingAttributes)212{213const std::string &shaderString =214"precision mediump float;\n"215"attribute attribute vec4 positionIN;\n"216"void main() {\n"217"gl_Position = positionIN;\n"218"}\n";219220if (compile(shaderString))221{222FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;223}224}225226// Wrong order for invariant varying. It should be 'invariant varying', not 'varying invariant'.227TEST_F(QualificationOrderVertexShaderTest, VaryingInvariantWrongOrder)228{229const std::string &shaderString =230"precision mediump float;\n"231"attribute vec4 positionIN;\n"232"varying invariant vec4 dataOUT;\n"233"void main() {\n"234"gl_Position = positionIN;\n"235"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"236"}\n";237238if (compile(shaderString))239{240FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;241}242}243244// A variable cannot have repeating storage qualifiers.245TEST_F(QualificationOrderVertexShaderTest, AttributeVaryingMix)246{247const std::string &shaderString =248"precision mediump float;\n"249"attribute varying vec4 positionIN;\n"250"void main() {\n"251"gl_Position = positionIN;\n"252"}\n";253254if (compile(shaderString))255{256FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;257}258}259260// A variable cannot have repeating storage qualifiers.261TEST_F(QualificationOrderVertexShaderTest, VaryingAttributeMix)262{263const std::string &shaderString =264"precision mediump float;\n"265"varying attribute vec4 positionIN;\n"266"void main() {\n"267"gl_Position = positionIN;\n"268"}\n";269if (compile(shaderString))270{271FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;272}273}274275// A variable cannot have repeating interpolation qualifiers.276TEST_F(QualificationOrderVertexShaderTest, RepeatingInterpolationQualifiers)277{278const std::string &shaderString =279"#version 300 es\n"280"precision mediump float;\n"281"in vec4 positionIN;\n"282"flat flat out vec4 dataOUT;\n"283"void main() {\n"284"gl_Position = positionIN;\n"285"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"286"}\n";287288if (compile(shaderString))289{290FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;291}292}293294// Wrong order for the interpolation and storage qualifier. The correct order is interpolation295// qualifier and then storage qualifier.296TEST_F(QualificationOrderVertexShaderTest, WrongOrderInterpolationStorageQualifiers)297{298const std::string &shaderString =299"#version 300 es\n"300"precision mediump float;\n"301"in vec4 positionIN;\n"302"out flat vec4 dataOUT;\n"303"void main() {\n"304"gl_Position = positionIN;\n"305"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"306"}\n";307308if (compile(shaderString))309{310FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;311}312}313314// The correct order is invariant, interpolation, storage.315TEST_F(QualificationOrderVertexShaderTest, WrongOrderInvariantInterpolationStorageQualifiers)316{317const std::string &shaderString =318"#version 300 es\n"319"precision mediump float;\n"320"in vec4 positionIN;\n"321"flat invariant out vec4 dataOUT;\n"322"void main() {\n"323"gl_Position = positionIN;\n"324"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"325"}\n";326327if (compile(shaderString))328{329FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;330}331}332333// The invariant qualifer has to be before the storage qualifiers.334TEST_F(QualificationOrderVertexShaderTest, WrongOrderInvariantNotFirst)335{336const std::string &shaderString =337"#version 300 es\n"338"precision mediump float;\n"339"in vec4 positionIN;\n"340"centroid out invariant vec4 dataOUT;\n"341"void main() {\n"342"gl_Position = positionIN;\n"343"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"344"}\n";345346if (compile(shaderString))347{348FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;349}350}351352// The precision qualifier is after the storage qualifiers.353TEST_F(QualificationOrderVertexShaderTest, WrongOrderPrecision)354{355const std::string &shaderString =356"#version 300 es\n"357"precision mediump float;\n"358"in vec4 positionIN;\n"359"highp centroid out vec4 dataOUT;\n"360"void main() {\n"361"gl_Position = positionIN;\n"362"dataOUT = 0.5 * dataOUT + vec4(0.5);\n"363"}\n";364365if (compile(shaderString))366{367FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;368}369}370371// A variable cannot have multiple declarations of the 'in' storage qualifier.372TEST_F(QualificationOrderVertexShaderTest, RepeatingInQualifier)373{374const std::string &shaderString =375"#version 300 es\n"376"precision mediump float;\n"377"in in vec4 positionIN;\n"378"void main() {\n"379"gl_Position = positionIN;\n"380"}\n";381382if (compile(shaderString))383{384FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;385}386}387388// A variable cannot have multiple declarations of the 'attribute' storage qualifier.389TEST_F(QualificationOrderVertexShaderTest, RepeatingAttributeQualifier)390{391const std::string &shaderString =392"precision mediump float;\n"393"attribute attribute vec4 positionIN;\n"394"void main() {\n"395"gl_Position = positionIN;\n"396"}\n";397398if (compile(shaderString))399{400FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;401}402}403404// Vertex input cannot be qualified with invariant.405TEST_F(QualificationOrderVertexShaderTest, InvariantVertexInput)406{407const std::string &shaderString =408"precision mediump float;\n"409"invariant attribute vec4 positionIN;\n"410"void main() {\n"411"gl_Position = positionIN;\n"412"}\n";413414if (compile(shaderString))415{416FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;417}418}419420// Cannot have a function parameter with the invariant qualifier.421TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersInvariant)422{423const std::string &shaderString =424"precision lowp float;\n"425"varying float value;\n"426"float foo0 (invariant in float x) {\n"427" return 2.0*x;\n"428"}\n"429"void main()\n"430"{\n"431" gl_FragColor = vec4(foo0(value));\n"432"}\n";433434if (compile(shaderString))435{436FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;437}438}439440// Cannot have a function parameter with the attribute qualifier.441TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersAttribute)442{443const std::string &shaderString =444"precision lowp float;\n"445"varying float value;\n"446"float foo0 (attribute float x) {\n"447" return 2.0*x;\n"448"}\n"449"void main()\n"450"{\n"451" gl_FragColor = vec4(foo0(value));\n"452"}\n";453454if (compile(shaderString))455{456FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;457}458}459460// Cannot have a function parameter with the varying qualifier.461TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersVarying)462{463const std::string &shaderString =464"precision lowp float;\n"465"varying float value;\n"466"float foo0 (varying float x) {\n"467" return 2.0*x;\n"468"}\n"469"void main()\n"470"{\n"471" gl_FragColor = vec4(foo0(value));\n"472"}\n";473474if (compile(shaderString))475{476FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;477}478}479480// Cannot have a function parameter with the layout qualifier481TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersLayout)482{483const std::string &shaderString =484"#version 300 es\n"485"precision lowp float;\n"486"in float value;\n"487"float foo0 (layout(location = 3) in float x) {\n"488" return 2.0*x;\n"489"}\n"490"out vec4 colorOUT;\n"491"void main()\n"492"{\n"493" colorOUT = vec4(foo0(value));\n"494"}\n";495496if (compile(shaderString))497{498FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;499}500}501502// Cannot have a function parameter with the centroid qualifier503TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersCentroidIn)504{505const std::string &shaderString =506"#version 300 es\n"507"precision lowp float;\n"508"in float value;\n"509"float foo0 (centroid in float x) {\n"510" return 2.0*x;\n"511"}\n"512"out vec4 colorOUT;\n"513"void main()\n"514"{\n"515" colorOUT = vec4(foo0(value));\n"516"}\n";517518if (compile(shaderString))519{520FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;521}522}523524// Cannot have a function parameter with the flat qualifier525TEST_F(QualificationOrderFragmentShaderTest, InvalidFunctionParametersFlatIn)526{527const std::string &shaderString =528"#version 300 es\n"529"precision lowp float;\n"530"in float value;\n"531"float foo0 (flat in float x) {\n"532" return 2.0*x;\n"533"}\n"534"out vec4 colorOUT;\n"535"void main()\n"536"{\n"537" colorOUT = vec4(foo0(value));\n"538"}\n";539540if (compile(shaderString))541{542FAIL() << "Shader compilation succeeded, expecting failure" << mInfoLog;543}544}545546// Output layout location qualifier can't appear more than once within a declaration.547// GLSL ES 3.00.6 section 4.3.8.2 Output Layout Qualifiers.548TEST_F(QualificationOrderFragmentShaderTest, TwoOutputLocations)549{550const std::string &shaderString =551"#version 300 es\n"552"precision mediump float;\n"553"layout(location=1, location=2) out vec4 myColor;\n"554"void main() {\n"555"}\n";556557if (compile(shaderString))558{559FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;560}561}562563564