1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 2e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.1 Module 3e5c31af7Sopenharmony_ci * ------------------------------------------------- 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright 2016 The Android Open Source Project 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 10e5c31af7Sopenharmony_ci * 11e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 17e5c31af7Sopenharmony_ci * limitations under the License. 18e5c31af7Sopenharmony_ci * 19e5c31af7Sopenharmony_ci *//*! 20e5c31af7Sopenharmony_ci * \file 21e5c31af7Sopenharmony_ci * \brief Negative Shader Directive Tests 22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ci#include "es31fNegativeShaderDirectiveTests.hpp" 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "gluShaderProgram.hpp" 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_cinamespace deqp 29e5c31af7Sopenharmony_ci{ 30e5c31af7Sopenharmony_cinamespace gles31 31e5c31af7Sopenharmony_ci{ 32e5c31af7Sopenharmony_cinamespace Functional 33e5c31af7Sopenharmony_ci{ 34e5c31af7Sopenharmony_cinamespace NegativeTestShared 35e5c31af7Sopenharmony_ci{ 36e5c31af7Sopenharmony_cinamespace 37e5c31af7Sopenharmony_ci{ 38e5c31af7Sopenharmony_ci 39e5c31af7Sopenharmony_cienum ExpectResult 40e5c31af7Sopenharmony_ci{ 41e5c31af7Sopenharmony_ci EXPECT_RESULT_PASS = 0, 42e5c31af7Sopenharmony_ci EXPECT_RESULT_FAIL, 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ci EXPECT_RESULT_LAST 45e5c31af7Sopenharmony_ci}; 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_civoid verifyProgram(NegativeTestContext& ctx, glu::ProgramSources sources, ExpectResult expect) 48e5c31af7Sopenharmony_ci{ 49e5c31af7Sopenharmony_ci DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST); 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ci tcu::TestLog& log = ctx.getLog(); 52e5c31af7Sopenharmony_ci const glu::ShaderProgram program (ctx.getRenderContext(), sources); 53e5c31af7Sopenharmony_ci bool testFailed = false; 54e5c31af7Sopenharmony_ci std::string message; 55e5c31af7Sopenharmony_ci 56e5c31af7Sopenharmony_ci log << program; 57e5c31af7Sopenharmony_ci 58e5c31af7Sopenharmony_ci if (expect == EXPECT_RESULT_PASS) 59e5c31af7Sopenharmony_ci { 60e5c31af7Sopenharmony_ci testFailed = !program.getProgramInfo().linkOk; 61e5c31af7Sopenharmony_ci message = "Program did not link."; 62e5c31af7Sopenharmony_ci } 63e5c31af7Sopenharmony_ci else 64e5c31af7Sopenharmony_ci { 65e5c31af7Sopenharmony_ci testFailed = program.getProgramInfo().linkOk; 66e5c31af7Sopenharmony_ci message = "Program was not expected to link."; 67e5c31af7Sopenharmony_ci } 68e5c31af7Sopenharmony_ci 69e5c31af7Sopenharmony_ci if (testFailed) 70e5c31af7Sopenharmony_ci { 71e5c31af7Sopenharmony_ci log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage; 72e5c31af7Sopenharmony_ci ctx.fail(message); 73e5c31af7Sopenharmony_ci } 74e5c31af7Sopenharmony_ci} 75e5c31af7Sopenharmony_ci 76e5c31af7Sopenharmony_civoid verifyShader(NegativeTestContext& ctx, glu::ShaderType shaderType, std::string shaderSource, ExpectResult expect) 77e5c31af7Sopenharmony_ci{ 78e5c31af7Sopenharmony_ci DE_ASSERT(expect >= EXPECT_RESULT_PASS && expect < EXPECT_RESULT_LAST); 79e5c31af7Sopenharmony_ci 80e5c31af7Sopenharmony_ci tcu::TestLog& log = ctx.getLog(); 81e5c31af7Sopenharmony_ci bool testFailed = false; 82e5c31af7Sopenharmony_ci const char* const source = shaderSource.c_str(); 83e5c31af7Sopenharmony_ci const int length = (int) shaderSource.size(); 84e5c31af7Sopenharmony_ci glu::Shader shader (ctx.getRenderContext(), shaderType); 85e5c31af7Sopenharmony_ci std::string message; 86e5c31af7Sopenharmony_ci 87e5c31af7Sopenharmony_ci shader.setSources(1, &source, &length); 88e5c31af7Sopenharmony_ci shader.compile(); 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ci log << shader; 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_ci if (expect == EXPECT_RESULT_PASS) 93e5c31af7Sopenharmony_ci { 94e5c31af7Sopenharmony_ci testFailed = !shader.getCompileStatus(); 95e5c31af7Sopenharmony_ci message = "Shader did not compile."; 96e5c31af7Sopenharmony_ci } 97e5c31af7Sopenharmony_ci else 98e5c31af7Sopenharmony_ci { 99e5c31af7Sopenharmony_ci testFailed = shader.getCompileStatus(); 100e5c31af7Sopenharmony_ci message = "Shader was not expected to compile."; 101e5c31af7Sopenharmony_ci } 102e5c31af7Sopenharmony_ci 103e5c31af7Sopenharmony_ci if (testFailed) 104e5c31af7Sopenharmony_ci { 105e5c31af7Sopenharmony_ci log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage; 106e5c31af7Sopenharmony_ci ctx.fail(message); 107e5c31af7Sopenharmony_ci } 108e5c31af7Sopenharmony_ci} 109e5c31af7Sopenharmony_ci 110e5c31af7Sopenharmony_civoid primitive_bounding_box (NegativeTestContext& ctx) 111e5c31af7Sopenharmony_ci{ 112e5c31af7Sopenharmony_ci if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_CONTROL)) 113e5c31af7Sopenharmony_ci { 114e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_primitive_bounding_box features require enabling the extension in 310 es shaders."); 115e5c31af7Sopenharmony_ci std::ostringstream source; 116e5c31af7Sopenharmony_ci source << "#version 310 es\n" 117e5c31af7Sopenharmony_ci "void main()\n" 118e5c31af7Sopenharmony_ci "{\n" 119e5c31af7Sopenharmony_ci " gl_BoundingBoxEXT[0] = vec4(0.0, 0.0, 0.0, 0.0);\n" 120e5c31af7Sopenharmony_ci " gl_BoundingBoxEXT[1] = vec4(1.0, 1.0, 1.0, 1.0);\n" 121e5c31af7Sopenharmony_ci "}\n"; 122e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source.str(), EXPECT_RESULT_FAIL); 123e5c31af7Sopenharmony_ci ctx.endSection(); 124e5c31af7Sopenharmony_ci } 125e5c31af7Sopenharmony_ci 126e5c31af7Sopenharmony_ci if (contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2))) 127e5c31af7Sopenharmony_ci { 128e5c31af7Sopenharmony_ci ctx.beginSection("gl_BoundingBox does not require the OES/EXT suffix in a 320 es shader."); 129e5c31af7Sopenharmony_ci { 130e5c31af7Sopenharmony_ci const std::string source = "#version 320 es\n" 131e5c31af7Sopenharmony_ci "layout(vertices = 3) out;\n" 132e5c31af7Sopenharmony_ci "void main()\n" 133e5c31af7Sopenharmony_ci "{\n" 134e5c31af7Sopenharmony_ci " gl_BoundingBox[0] = vec4(0.0, 0.0, 0.0, 0.0);\n" 135e5c31af7Sopenharmony_ci " gl_BoundingBox[1] = vec4(0.0, 0.0, 0.0, 0.0);\n" 136e5c31af7Sopenharmony_ci "}\n"; 137e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_PASS); 138e5c31af7Sopenharmony_ci } 139e5c31af7Sopenharmony_ci ctx.endSection(); 140e5c31af7Sopenharmony_ci 141e5c31af7Sopenharmony_ci ctx.beginSection("Invalid index used when assigning to gl_BoundingBox in 320 es shader."); 142e5c31af7Sopenharmony_ci { 143e5c31af7Sopenharmony_ci const std::string source = "#version 320 es\n" 144e5c31af7Sopenharmony_ci "layout(vertices = 3) out;\n" 145e5c31af7Sopenharmony_ci "void main()\n" 146e5c31af7Sopenharmony_ci "{\n" 147e5c31af7Sopenharmony_ci " gl_BoundingBox[0] = vec4(0.0, 0.0, 0.0, 0.0);\n" 148e5c31af7Sopenharmony_ci " gl_BoundingBox[2] = vec4(0.0, 0.0, 0.0, 0.0);\n" 149e5c31af7Sopenharmony_ci "}\n"; 150e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_FAIL); 151e5c31af7Sopenharmony_ci } 152e5c31af7Sopenharmony_ci ctx.endSection(); 153e5c31af7Sopenharmony_ci 154e5c31af7Sopenharmony_ci ctx.beginSection("Invalid type assignment to per-patch output array in 320 es shader."); 155e5c31af7Sopenharmony_ci { 156e5c31af7Sopenharmony_ci const std::string source = "#version 320 es\n" 157e5c31af7Sopenharmony_ci "layout(vertices = 3) out;\n" 158e5c31af7Sopenharmony_ci "void main()\n" 159e5c31af7Sopenharmony_ci "{\n" 160e5c31af7Sopenharmony_ci " gl_BoundingBox[0] = ivec4(0, 0, 0, 0);\n" 161e5c31af7Sopenharmony_ci " gl_BoundingBox[1] = ivec4(0, 0, 0, 0);\n" 162e5c31af7Sopenharmony_ci "}\n"; 163e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_CONTROL, source, EXPECT_RESULT_FAIL); 164e5c31af7Sopenharmony_ci } 165e5c31af7Sopenharmony_ci ctx.endSection(); 166e5c31af7Sopenharmony_ci } 167e5c31af7Sopenharmony_ci} 168e5c31af7Sopenharmony_ci 169e5c31af7Sopenharmony_civoid blend_equation_advanced (NegativeTestContext& ctx) 170e5c31af7Sopenharmony_ci{ 171e5c31af7Sopenharmony_ci static const char* const s_qualifiers[] = 172e5c31af7Sopenharmony_ci { 173e5c31af7Sopenharmony_ci "blend_support_multiply", 174e5c31af7Sopenharmony_ci "blend_support_screen", 175e5c31af7Sopenharmony_ci "blend_support_overlay", 176e5c31af7Sopenharmony_ci "blend_support_darken", 177e5c31af7Sopenharmony_ci "blend_support_lighten", 178e5c31af7Sopenharmony_ci "blend_support_colordodge", 179e5c31af7Sopenharmony_ci "blend_support_colorburn", 180e5c31af7Sopenharmony_ci "blend_support_hardlight", 181e5c31af7Sopenharmony_ci "blend_support_softlight", 182e5c31af7Sopenharmony_ci "blend_support_difference", 183e5c31af7Sopenharmony_ci "blend_support_exclusion", 184e5c31af7Sopenharmony_ci "blend_support_hsl_hue", 185e5c31af7Sopenharmony_ci "blend_support_hsl_saturation", 186e5c31af7Sopenharmony_ci "blend_support_hsl_color", 187e5c31af7Sopenharmony_ci "blend_support_hsl_luminosity", 188e5c31af7Sopenharmony_ci }; 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci ctx.beginSection("GL_KHR_blend_equation_advanced features require enabling the extension in 310 es shaders."); 191e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_qualifiers); ++ndx) 192e5c31af7Sopenharmony_ci { 193e5c31af7Sopenharmony_ci std::ostringstream source; 194e5c31af7Sopenharmony_ci source << "#version 310 es\n" 195e5c31af7Sopenharmony_ci "layout(" << s_qualifiers[ndx] << ") out;\n" 196e5c31af7Sopenharmony_ci "void main()\n" 197e5c31af7Sopenharmony_ci "{\n" 198e5c31af7Sopenharmony_ci "}\n"; 199e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 200e5c31af7Sopenharmony_ci } 201e5c31af7Sopenharmony_ci ctx.endSection(); 202e5c31af7Sopenharmony_ci} 203e5c31af7Sopenharmony_ci 204e5c31af7Sopenharmony_civoid sample_variables (NegativeTestContext& ctx) 205e5c31af7Sopenharmony_ci{ 206e5c31af7Sopenharmony_ci TCU_CHECK_AND_THROW(NotSupportedError, 207e5c31af7Sopenharmony_ci contextSupports(ctx.getRenderContext().getType() , glu::ApiType::es(3, 2)) || contextSupports(ctx.getRenderContext().getType() , glu::ApiType::core(4, 5)), 208e5c31af7Sopenharmony_ci "Test requires a context version 3.2 or higher."); 209e5c31af7Sopenharmony_ci 210e5c31af7Sopenharmony_ci static const char* const s_tests[] = 211e5c31af7Sopenharmony_ci { 212e5c31af7Sopenharmony_ci "int sampleId = gl_SampleID;", 213e5c31af7Sopenharmony_ci "vec2 samplePos = gl_SamplePosition;", 214e5c31af7Sopenharmony_ci "int sampleMaskIn0 = gl_SampleMaskIn[0];", 215e5c31af7Sopenharmony_ci "int sampleMask0 = gl_SampleMask[0];", 216e5c31af7Sopenharmony_ci "int numSamples = gl_NumSamples;", 217e5c31af7Sopenharmony_ci }; 218e5c31af7Sopenharmony_ci 219e5c31af7Sopenharmony_ci ctx.beginSection("GL_OES_sample_variables features require enabling the extension in 310 es shaders."); 220e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx) 221e5c31af7Sopenharmony_ci { 222e5c31af7Sopenharmony_ci std::ostringstream source; 223e5c31af7Sopenharmony_ci source << "#version 310 es\n" 224e5c31af7Sopenharmony_ci "precision mediump float;\n" 225e5c31af7Sopenharmony_ci "void main()\n" 226e5c31af7Sopenharmony_ci "{\n" 227e5c31af7Sopenharmony_ci " " << s_tests[ndx] << "\n" 228e5c31af7Sopenharmony_ci "}\n"; 229e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 230e5c31af7Sopenharmony_ci } 231e5c31af7Sopenharmony_ci ctx.endSection(); 232e5c31af7Sopenharmony_ci} 233e5c31af7Sopenharmony_ci 234e5c31af7Sopenharmony_civoid shader_image_atomic (NegativeTestContext& ctx) 235e5c31af7Sopenharmony_ci{ 236e5c31af7Sopenharmony_ci static const char* const s_tests[] = 237e5c31af7Sopenharmony_ci { 238e5c31af7Sopenharmony_ci "imageAtomicAdd(u_image, ivec2(1, 1), 1u);", 239e5c31af7Sopenharmony_ci "imageAtomicMin(u_image, ivec2(1, 1), 1u);", 240e5c31af7Sopenharmony_ci "imageAtomicMax(u_image, ivec2(1, 1), 1u);", 241e5c31af7Sopenharmony_ci "imageAtomicAnd(u_image, ivec2(1, 1), 1u);", 242e5c31af7Sopenharmony_ci "imageAtomicOr(u_image, ivec2(1, 1), 1u);", 243e5c31af7Sopenharmony_ci "imageAtomicXor(u_image, ivec2(1, 1), 1u);", 244e5c31af7Sopenharmony_ci "imageAtomicExchange(u_image, ivec2(1, 1), 1u);", 245e5c31af7Sopenharmony_ci "imageAtomicCompSwap(u_image, ivec2(1, 1), 1u, 1u);", 246e5c31af7Sopenharmony_ci }; 247e5c31af7Sopenharmony_ci 248e5c31af7Sopenharmony_ci ctx.beginSection("GL_OES_shader_image_atomic features require enabling the extension in 310 es shaders."); 249e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_tests); ++ndx) 250e5c31af7Sopenharmony_ci { 251e5c31af7Sopenharmony_ci std::ostringstream source; 252e5c31af7Sopenharmony_ci source << "#version 310 es\n" 253e5c31af7Sopenharmony_ci "layout(binding=0, r32ui) coherent uniform highp uimage2D u_image;\n" 254e5c31af7Sopenharmony_ci "precision mediump float;\n" 255e5c31af7Sopenharmony_ci "void main()\n" 256e5c31af7Sopenharmony_ci "{\n" 257e5c31af7Sopenharmony_ci " " << s_tests[ndx] << "\n" 258e5c31af7Sopenharmony_ci "}\n"; 259e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 260e5c31af7Sopenharmony_ci } 261e5c31af7Sopenharmony_ci ctx.endSection(); 262e5c31af7Sopenharmony_ci} 263e5c31af7Sopenharmony_ci 264e5c31af7Sopenharmony_civoid shader_multisample_interpolation (NegativeTestContext& ctx) 265e5c31af7Sopenharmony_ci{ 266e5c31af7Sopenharmony_ci static const char* const s_sampleTests[] = 267e5c31af7Sopenharmony_ci { 268e5c31af7Sopenharmony_ci "sample in highp float v_var;", 269e5c31af7Sopenharmony_ci "sample out highp float v_var;" 270e5c31af7Sopenharmony_ci }; 271e5c31af7Sopenharmony_ci 272e5c31af7Sopenharmony_ci static const char* const s_interpolateAtTests[] = 273e5c31af7Sopenharmony_ci { 274e5c31af7Sopenharmony_ci "interpolateAtCentroid(interpolant);", 275e5c31af7Sopenharmony_ci "interpolateAtSample(interpolant, 1);", 276e5c31af7Sopenharmony_ci "interpolateAtOffset(interpolant, vec2(1.0, 0.0));" 277e5c31af7Sopenharmony_ci }; 278e5c31af7Sopenharmony_ci 279e5c31af7Sopenharmony_ci ctx.beginSection("GL_OES_shader_multisample_interpolation features require enabling the extension in 310 es shaders."); 280e5c31af7Sopenharmony_ci ctx.beginSection("Test sample in/out qualifiers."); 281e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx) 282e5c31af7Sopenharmony_ci { 283e5c31af7Sopenharmony_ci std::ostringstream source; 284e5c31af7Sopenharmony_ci source << "#version 310 es\n" 285e5c31af7Sopenharmony_ci " " << s_sampleTests[ndx] << "\n" 286e5c31af7Sopenharmony_ci "precision mediump float;\n" 287e5c31af7Sopenharmony_ci "void main()\n" 288e5c31af7Sopenharmony_ci "{\n" 289e5c31af7Sopenharmony_ci "}\n"; 290e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 291e5c31af7Sopenharmony_ci } 292e5c31af7Sopenharmony_ci ctx.endSection(); 293e5c31af7Sopenharmony_ci 294e5c31af7Sopenharmony_ci ctx.beginSection("Test interpolateAt* functions."); 295e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_sampleTests); ++ndx) 296e5c31af7Sopenharmony_ci { 297e5c31af7Sopenharmony_ci std::ostringstream source; 298e5c31af7Sopenharmony_ci source << "#version 310 es\n" 299e5c31af7Sopenharmony_ci "in mediump float interpolant;\n" 300e5c31af7Sopenharmony_ci "precision mediump float;\n" 301e5c31af7Sopenharmony_ci "void main()\n" 302e5c31af7Sopenharmony_ci "{\n" 303e5c31af7Sopenharmony_ci " " << s_interpolateAtTests[ndx] << "\n" 304e5c31af7Sopenharmony_ci "}\n"; 305e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 306e5c31af7Sopenharmony_ci } 307e5c31af7Sopenharmony_ci ctx.endSection(); 308e5c31af7Sopenharmony_ci ctx.endSection(); 309e5c31af7Sopenharmony_ci} 310e5c31af7Sopenharmony_ci 311e5c31af7Sopenharmony_civoid texture_storage_multisample_2d_array (NegativeTestContext& ctx) 312e5c31af7Sopenharmony_ci{ 313e5c31af7Sopenharmony_ci static const char* const s_samplerTypeTests[] = 314e5c31af7Sopenharmony_ci { 315e5c31af7Sopenharmony_ci "uniform mediump sampler2DMSArray u_sampler;", 316e5c31af7Sopenharmony_ci "uniform mediump isampler2DMSArray u_sampler;", 317e5c31af7Sopenharmony_ci "uniform mediump usampler2DMSArray u_sampler;", 318e5c31af7Sopenharmony_ci }; 319e5c31af7Sopenharmony_ci 320e5c31af7Sopenharmony_ci ctx.beginSection("GL_OES_texture_storage_multisample_2d_array features require enabling the extension in 310 es shaders."); 321e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerTypeTests); ++ndx) 322e5c31af7Sopenharmony_ci { 323e5c31af7Sopenharmony_ci std::ostringstream source; 324e5c31af7Sopenharmony_ci source << "#version 310 es\n" 325e5c31af7Sopenharmony_ci " " << s_samplerTypeTests[ndx] << "\n" 326e5c31af7Sopenharmony_ci "precision mediump float;\n" 327e5c31af7Sopenharmony_ci "void main()\n" 328e5c31af7Sopenharmony_ci "{\n" 329e5c31af7Sopenharmony_ci "}\n"; 330e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 331e5c31af7Sopenharmony_ci } 332e5c31af7Sopenharmony_ci ctx.endSection(); 333e5c31af7Sopenharmony_ci} 334e5c31af7Sopenharmony_ci 335e5c31af7Sopenharmony_civoid geometry_shader (NegativeTestContext& ctx) 336e5c31af7Sopenharmony_ci{ 337e5c31af7Sopenharmony_ci if (ctx.isShaderSupported(glu::SHADERTYPE_GEOMETRY)) 338e5c31af7Sopenharmony_ci { 339e5c31af7Sopenharmony_ci const std::string simpleVtxFrag = "#version 310 es\n" 340e5c31af7Sopenharmony_ci "void main()\n" 341e5c31af7Sopenharmony_ci "{\n" 342e5c31af7Sopenharmony_ci "}\n"; 343e5c31af7Sopenharmony_ci const std::string geometry = "#version 310 es\n" 344e5c31af7Sopenharmony_ci "layout(points, invocations = 1) in;\n" 345e5c31af7Sopenharmony_ci "layout(points, max_vertices = 3) out;\n" 346e5c31af7Sopenharmony_ci "precision mediump float;\n" 347e5c31af7Sopenharmony_ci "void main()\n" 348e5c31af7Sopenharmony_ci "{\n" 349e5c31af7Sopenharmony_ci " EmitVertex();\n" 350e5c31af7Sopenharmony_ci " EndPrimitive();\n" 351e5c31af7Sopenharmony_ci "}\n"; 352e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_geometry_shader features require enabling the extension in 310 es shaders."); 353e5c31af7Sopenharmony_ci verifyProgram(ctx, glu::ProgramSources() << glu::VertexSource(simpleVtxFrag) << glu::GeometrySource(geometry) << glu::FragmentSource(simpleVtxFrag), EXPECT_RESULT_FAIL); 354e5c31af7Sopenharmony_ci ctx.endSection(); 355e5c31af7Sopenharmony_ci } 356e5c31af7Sopenharmony_ci} 357e5c31af7Sopenharmony_ci 358e5c31af7Sopenharmony_civoid gpu_shader_5 (NegativeTestContext& ctx) 359e5c31af7Sopenharmony_ci{ 360e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_gpu_shader5 features require enabling the extension in 310 es shaders."); 361e5c31af7Sopenharmony_ci ctx.beginSection("Testing the precise qualifier."); 362e5c31af7Sopenharmony_ci { 363e5c31af7Sopenharmony_ci std::ostringstream source; 364e5c31af7Sopenharmony_ci source << "#version 310 es\n" 365e5c31af7Sopenharmony_ci "void main()\n" 366e5c31af7Sopenharmony_ci "{\n" 367e5c31af7Sopenharmony_ci " int low = 0;\n" 368e5c31af7Sopenharmony_ci " int high = 10;\n" 369e5c31af7Sopenharmony_ci " precise int middle = low + ((high - low) / 2);\n" 370e5c31af7Sopenharmony_ci "}\n"; 371e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 372e5c31af7Sopenharmony_ci } 373e5c31af7Sopenharmony_ci ctx.endSection(); 374e5c31af7Sopenharmony_ci 375e5c31af7Sopenharmony_ci ctx.beginSection("Testing fused multiply-add."); 376e5c31af7Sopenharmony_ci { 377e5c31af7Sopenharmony_ci std::ostringstream source; 378e5c31af7Sopenharmony_ci source << "#version 310 es\n" 379e5c31af7Sopenharmony_ci "in mediump float v_var;" 380e5c31af7Sopenharmony_ci "void main()\n" 381e5c31af7Sopenharmony_ci "{\n" 382e5c31af7Sopenharmony_ci " float fmaResult = fma(v_var, v_var, v_var);" 383e5c31af7Sopenharmony_ci "}\n"; 384e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 385e5c31af7Sopenharmony_ci } 386e5c31af7Sopenharmony_ci ctx.endSection(); 387e5c31af7Sopenharmony_ci 388e5c31af7Sopenharmony_ci ctx.beginSection("Testing textureGatherOffsets."); 389e5c31af7Sopenharmony_ci { 390e5c31af7Sopenharmony_ci std::ostringstream source; 391e5c31af7Sopenharmony_ci source << "#version 310 es\n" 392e5c31af7Sopenharmony_ci "uniform mediump sampler2D u_tex;\n" 393e5c31af7Sopenharmony_ci "void main()\n" 394e5c31af7Sopenharmony_ci "{\n" 395e5c31af7Sopenharmony_ci " highp vec2 coords = vec2(0.0, 1.0);\n" 396e5c31af7Sopenharmony_ci " const ivec2 offsets[4] = ivec2[](ivec2(0,0), ivec2(1, 0), ivec2(0, 1), ivec2(1, 1));\n" 397e5c31af7Sopenharmony_ci " textureGatherOffsets(u_tex, coords, offsets);\n" 398e5c31af7Sopenharmony_ci "}\n"; 399e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 400e5c31af7Sopenharmony_ci } 401e5c31af7Sopenharmony_ci ctx.endSection(); 402e5c31af7Sopenharmony_ci 403e5c31af7Sopenharmony_ci ctx.endSection(); 404e5c31af7Sopenharmony_ci} 405e5c31af7Sopenharmony_ci 406e5c31af7Sopenharmony_civoid shader_io_blocks (NegativeTestContext& ctx) 407e5c31af7Sopenharmony_ci{ 408e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_shader_io_blocks features require enabling the extension in 310 es shaders."); 409e5c31af7Sopenharmony_ci { 410e5c31af7Sopenharmony_ci std::ostringstream source; 411e5c31af7Sopenharmony_ci source << "#version 310 es\n" 412e5c31af7Sopenharmony_ci "in Data\n" 413e5c31af7Sopenharmony_ci "{\n" 414e5c31af7Sopenharmony_ci " mediump vec3 a;\n" 415e5c31af7Sopenharmony_ci "} data;\n" 416e5c31af7Sopenharmony_ci "void main()\n" 417e5c31af7Sopenharmony_ci "{\n" 418e5c31af7Sopenharmony_ci "}\n"; 419e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 420e5c31af7Sopenharmony_ci } 421e5c31af7Sopenharmony_ci ctx.endSection(); 422e5c31af7Sopenharmony_ci} 423e5c31af7Sopenharmony_ci 424e5c31af7Sopenharmony_civoid tessellation_shader (NegativeTestContext& ctx) 425e5c31af7Sopenharmony_ci{ 426e5c31af7Sopenharmony_ci if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_CONTROL)) 427e5c31af7Sopenharmony_ci { 428e5c31af7Sopenharmony_ci const std::string simpleVtxFrag = "#version 310 es\n" 429e5c31af7Sopenharmony_ci "void main()\n" 430e5c31af7Sopenharmony_ci "{\n" 431e5c31af7Sopenharmony_ci "}\n"; 432e5c31af7Sopenharmony_ci const std::string tessControl = "#version 310 es\n" 433e5c31af7Sopenharmony_ci "layout(vertices = 3) out;\n" 434e5c31af7Sopenharmony_ci "void main()\n" 435e5c31af7Sopenharmony_ci "{\n" 436e5c31af7Sopenharmony_ci "}\n"; 437e5c31af7Sopenharmony_ci const std::string tessEvaluation = "#version 310 es\n" 438e5c31af7Sopenharmony_ci "layout(triangles, equal_spacing, cw) in;\n" 439e5c31af7Sopenharmony_ci "void main()\n" 440e5c31af7Sopenharmony_ci "{\n" 441e5c31af7Sopenharmony_ci "}\n"; 442e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_tessellation_shader features require enabling the extension in 310 es shaders."); 443e5c31af7Sopenharmony_ci glu::ProgramSources sources; 444e5c31af7Sopenharmony_ci sources << glu::VertexSource(simpleVtxFrag) 445e5c31af7Sopenharmony_ci << glu::TessellationControlSource(tessControl) 446e5c31af7Sopenharmony_ci << glu::TessellationEvaluationSource(tessEvaluation) 447e5c31af7Sopenharmony_ci << glu::FragmentSource(simpleVtxFrag); 448e5c31af7Sopenharmony_ci verifyProgram(ctx, sources, EXPECT_RESULT_FAIL); 449e5c31af7Sopenharmony_ci ctx.endSection(); 450e5c31af7Sopenharmony_ci } 451e5c31af7Sopenharmony_ci} 452e5c31af7Sopenharmony_ci 453e5c31af7Sopenharmony_civoid texture_buffer (NegativeTestContext& ctx) 454e5c31af7Sopenharmony_ci{ 455e5c31af7Sopenharmony_ci static const char* const s_samplerBufferTypes[] = 456e5c31af7Sopenharmony_ci { 457e5c31af7Sopenharmony_ci "uniform mediump samplerBuffer", 458e5c31af7Sopenharmony_ci "uniform mediump isamplerBuffer", 459e5c31af7Sopenharmony_ci "uniform mediump usamplerBuffer", 460e5c31af7Sopenharmony_ci "layout(rgba32f) uniform mediump writeonly imageBuffer", 461e5c31af7Sopenharmony_ci "layout(rgba32i) uniform mediump writeonly iimageBuffer", 462e5c31af7Sopenharmony_ci "layout(rgba32ui) uniform mediump writeonly uimageBuffer" 463e5c31af7Sopenharmony_ci }; 464e5c31af7Sopenharmony_ci 465e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_texture_buffer features require enabling the extension in 310 es shaders."); 466e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerBufferTypes); ++ndx) 467e5c31af7Sopenharmony_ci { 468e5c31af7Sopenharmony_ci std::ostringstream source; 469e5c31af7Sopenharmony_ci source << "#version 310 es\n" 470e5c31af7Sopenharmony_ci "" << s_samplerBufferTypes[ndx] << " u_buffer;\n" 471e5c31af7Sopenharmony_ci "void main()\n" 472e5c31af7Sopenharmony_ci "{\n" 473e5c31af7Sopenharmony_ci "}\n"; 474e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 475e5c31af7Sopenharmony_ci } 476e5c31af7Sopenharmony_ci ctx.endSection(); 477e5c31af7Sopenharmony_ci} 478e5c31af7Sopenharmony_ci 479e5c31af7Sopenharmony_ci 480e5c31af7Sopenharmony_civoid texture_cube_map_array (NegativeTestContext& ctx) 481e5c31af7Sopenharmony_ci{ 482e5c31af7Sopenharmony_ci static const char* const s_samplerCubeArrayTypes[] = 483e5c31af7Sopenharmony_ci { 484e5c31af7Sopenharmony_ci "uniform mediump samplerCubeArray", 485e5c31af7Sopenharmony_ci "uniform mediump isamplerCubeArray", 486e5c31af7Sopenharmony_ci "uniform mediump usamplerCubeArray", 487e5c31af7Sopenharmony_ci "uniform mediump samplerCubeArrayShadow", 488e5c31af7Sopenharmony_ci "layout(rgba32f) uniform mediump writeonly imageCubeArray", 489e5c31af7Sopenharmony_ci "layout(rgba32i) uniform mediump writeonly iimageCubeArray", 490e5c31af7Sopenharmony_ci "layout(rgba32ui) uniform mediump writeonly uimageCubeArray" 491e5c31af7Sopenharmony_ci }; 492e5c31af7Sopenharmony_ci 493e5c31af7Sopenharmony_ci ctx.beginSection("GL_EXT_texture_cube_map_array features require enabling the extension in 310 es shaders."); 494e5c31af7Sopenharmony_ci for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_samplerCubeArrayTypes); ++ndx) 495e5c31af7Sopenharmony_ci { 496e5c31af7Sopenharmony_ci std::ostringstream source; 497e5c31af7Sopenharmony_ci source << "#version 310 es\n" 498e5c31af7Sopenharmony_ci "" << s_samplerCubeArrayTypes[ndx] << " u_cube;\n" 499e5c31af7Sopenharmony_ci "void main()\n" 500e5c31af7Sopenharmony_ci "{\n" 501e5c31af7Sopenharmony_ci "}\n"; 502e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, source.str(), EXPECT_RESULT_FAIL); 503e5c31af7Sopenharmony_ci } 504e5c31af7Sopenharmony_ci ctx.endSection(); 505e5c31af7Sopenharmony_ci} 506e5c31af7Sopenharmony_ci 507e5c31af7Sopenharmony_civoid executeAccessingBoundingBoxType (NegativeTestContext& ctx, const std::string builtInTypeName, glu::GLSLVersion glslVersion) 508e5c31af7Sopenharmony_ci{ 509e5c31af7Sopenharmony_ci std::ostringstream sourceStream; 510e5c31af7Sopenharmony_ci std::string version; 511e5c31af7Sopenharmony_ci std::string extensionPrim; 512e5c31af7Sopenharmony_ci std::string extensionTess; 513e5c31af7Sopenharmony_ci 514e5c31af7Sopenharmony_ci if (glslVersion == glu::GLSL_VERSION_310_ES) 515e5c31af7Sopenharmony_ci { 516e5c31af7Sopenharmony_ci version = "#version 310 es\n"; 517e5c31af7Sopenharmony_ci extensionPrim = "#extension GL_EXT_primitive_bounding_box : require\n"; 518e5c31af7Sopenharmony_ci extensionTess = "#extension GL_EXT_tessellation_shader : require\n"; 519e5c31af7Sopenharmony_ci } 520e5c31af7Sopenharmony_ci else if (glslVersion >= glu::GLSL_VERSION_320_ES) 521e5c31af7Sopenharmony_ci { 522e5c31af7Sopenharmony_ci version = "#version 320 es\n"; 523e5c31af7Sopenharmony_ci extensionPrim = ""; 524e5c31af7Sopenharmony_ci extensionTess = ""; 525e5c31af7Sopenharmony_ci } 526e5c31af7Sopenharmony_ci else 527e5c31af7Sopenharmony_ci { 528e5c31af7Sopenharmony_ci DE_FATAL("error: context below 3.1 and not supported"); 529e5c31af7Sopenharmony_ci } 530e5c31af7Sopenharmony_ci 531e5c31af7Sopenharmony_ci ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in vertex shader"); 532e5c31af7Sopenharmony_ci sourceStream << version 533e5c31af7Sopenharmony_ci << extensionPrim 534e5c31af7Sopenharmony_ci << "void main()\n" 535e5c31af7Sopenharmony_ci << "{\n" 536e5c31af7Sopenharmony_ci << " " + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n" 537e5c31af7Sopenharmony_ci << " gl_Position = " + builtInTypeName + "[0];\n" 538e5c31af7Sopenharmony_ci << "}\n"; 539e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_VERTEX, sourceStream.str(), EXPECT_RESULT_FAIL); 540e5c31af7Sopenharmony_ci ctx.endSection(); 541e5c31af7Sopenharmony_ci 542e5c31af7Sopenharmony_ci sourceStream.str(std::string()); 543e5c31af7Sopenharmony_ci 544e5c31af7Sopenharmony_ci if (ctx.isShaderSupported(glu::SHADERTYPE_TESSELLATION_EVALUATION)) 545e5c31af7Sopenharmony_ci { 546e5c31af7Sopenharmony_ci ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in tessellation evaluation shader"); 547e5c31af7Sopenharmony_ci sourceStream << version 548e5c31af7Sopenharmony_ci << extensionPrim 549e5c31af7Sopenharmony_ci << extensionTess 550e5c31af7Sopenharmony_ci << "layout (triangles, equal_spacing, ccw) in;\n" 551e5c31af7Sopenharmony_ci << "void main()\n" 552e5c31af7Sopenharmony_ci << "{\n" 553e5c31af7Sopenharmony_ci << " " + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n" 554e5c31af7Sopenharmony_ci << " gl_Position = ( gl_TessCoord.x * " + builtInTypeName + "[0] +\n" 555e5c31af7Sopenharmony_ci << " gl_TessCoord.y * " + builtInTypeName + "[0] +\n" 556e5c31af7Sopenharmony_ci << " gl_TessCoord.z * " + builtInTypeName + "[0]);\n" 557e5c31af7Sopenharmony_ci << "}\n"; 558e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_TESSELLATION_EVALUATION, sourceStream.str(), EXPECT_RESULT_FAIL); 559e5c31af7Sopenharmony_ci ctx.endSection(); 560e5c31af7Sopenharmony_ci 561e5c31af7Sopenharmony_ci sourceStream.str(std::string()); 562e5c31af7Sopenharmony_ci } 563e5c31af7Sopenharmony_ci 564e5c31af7Sopenharmony_ci if (ctx.isShaderSupported(glu::SHADERTYPE_GEOMETRY)) 565e5c31af7Sopenharmony_ci { 566e5c31af7Sopenharmony_ci ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in geometry shader"); 567e5c31af7Sopenharmony_ci sourceStream << version 568e5c31af7Sopenharmony_ci << extensionPrim 569e5c31af7Sopenharmony_ci << "layout (triangles) in;\n" 570e5c31af7Sopenharmony_ci << "layout (triangle_strip, max_vertices = 3) out;\n" 571e5c31af7Sopenharmony_ci << "void main()\n" 572e5c31af7Sopenharmony_ci << "{\n" 573e5c31af7Sopenharmony_ci << " " + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n" 574e5c31af7Sopenharmony_ci << " for (int idx = 0; idx < 3; idx++)\n" 575e5c31af7Sopenharmony_ci << " {\n" 576e5c31af7Sopenharmony_ci << " gl_Position = gl_in[idx].gl_Position * " + builtInTypeName + "[0];\n" 577e5c31af7Sopenharmony_ci << " EmitVertex();\n" 578e5c31af7Sopenharmony_ci << " }\n" 579e5c31af7Sopenharmony_ci << " EndPrimitive();\n" 580e5c31af7Sopenharmony_ci << "}\n"; 581e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_GEOMETRY, sourceStream.str(), EXPECT_RESULT_FAIL); 582e5c31af7Sopenharmony_ci ctx.endSection(); 583e5c31af7Sopenharmony_ci 584e5c31af7Sopenharmony_ci sourceStream.str(std::string()); 585e5c31af7Sopenharmony_ci } 586e5c31af7Sopenharmony_ci 587e5c31af7Sopenharmony_ci ctx.beginSection("cannot access built-in type " + builtInTypeName + "[]" + " in fragment shader"); 588e5c31af7Sopenharmony_ci sourceStream << version 589e5c31af7Sopenharmony_ci << extensionPrim 590e5c31af7Sopenharmony_ci << "layout (location = 0) out mediump vec4 fs_colour;\n" 591e5c31af7Sopenharmony_ci << "void main()\n" 592e5c31af7Sopenharmony_ci << "{\n" 593e5c31af7Sopenharmony_ci << " " + builtInTypeName + "[0] = vec4(1.0, 1.0, 1.0, 1.0);\n" 594e5c31af7Sopenharmony_ci << " fs_colour = " + builtInTypeName + "[0];\n" 595e5c31af7Sopenharmony_ci << "}\n"; 596e5c31af7Sopenharmony_ci verifyShader(ctx, glu::SHADERTYPE_FRAGMENT, sourceStream.str(), EXPECT_RESULT_FAIL); 597e5c31af7Sopenharmony_ci ctx.endSection(); 598e5c31af7Sopenharmony_ci} 599e5c31af7Sopenharmony_ci 600e5c31af7Sopenharmony_civoid accessing_bounding_box_type (NegativeTestContext& ctx) 601e5c31af7Sopenharmony_ci{ 602e5c31af7Sopenharmony_ci // Extension requirements and name differences depending on the context 603e5c31af7Sopenharmony_ci if ((ctx.getRenderContext().getType().getMajorVersion() == 3) && (ctx.getRenderContext().getType().getMinorVersion() == 1)) 604e5c31af7Sopenharmony_ci { 605e5c31af7Sopenharmony_ci executeAccessingBoundingBoxType(ctx, "gl_BoundingBoxEXT", glu::GLSL_VERSION_310_ES); 606e5c31af7Sopenharmony_ci } 607e5c31af7Sopenharmony_ci else 608e5c31af7Sopenharmony_ci { 609e5c31af7Sopenharmony_ci executeAccessingBoundingBoxType(ctx, "gl_BoundingBox", glu::GLSL_VERSION_320_ES); 610e5c31af7Sopenharmony_ci } 611e5c31af7Sopenharmony_ci 612e5c31af7Sopenharmony_ci} 613e5c31af7Sopenharmony_ci 614e5c31af7Sopenharmony_ci} // anonymous 615e5c31af7Sopenharmony_ci 616e5c31af7Sopenharmony_cistd::vector<FunctionContainer> getNegativeShaderDirectiveTestFunctions (void) 617e5c31af7Sopenharmony_ci{ 618e5c31af7Sopenharmony_ci const FunctionContainer funcs[] = 619e5c31af7Sopenharmony_ci { 620e5c31af7Sopenharmony_ci {primitive_bounding_box, "primitive_bounding_box", "GL_EXT_primitive_bounding_box required in 310 es shaders to use AEP features. Version 320 es shaders do not require suffixes." }, 621e5c31af7Sopenharmony_ci {blend_equation_advanced, "blend_equation_advanced", "GL_KHR_blend_equation_advanced is required in 310 es shaders to use AEP features" }, 622e5c31af7Sopenharmony_ci {sample_variables, "sample_variables", "GL_OES_sample_variables is required in 310 es shaders to use AEP features" }, 623e5c31af7Sopenharmony_ci {shader_image_atomic, "shader_image_atomic", "GL_OES_shader_image_atomic is required in 310 es shaders to use AEP features" }, 624e5c31af7Sopenharmony_ci {shader_multisample_interpolation, "shader_multisample_interpolation", "GL_OES_shader_multisample_interpolation is required in 310 es shaders to use AEP features" }, 625e5c31af7Sopenharmony_ci {texture_storage_multisample_2d_array, "texture_storage_multisample_2d_array", "GL_OES_texture_storage_multisample_2d_array is required in 310 es shaders to use AEP features" }, 626e5c31af7Sopenharmony_ci {geometry_shader, "geometry_shader", "GL_EXT_geometry_shader is required in 310 es shaders to use AEP features" }, 627e5c31af7Sopenharmony_ci {gpu_shader_5, "gpu_shader_5", "GL_EXT_gpu_shader5 is required in 310 es shaders to use AEP features" }, 628e5c31af7Sopenharmony_ci {shader_io_blocks, "shader_io_blocks", "GL_EXT_shader_io_blocks is required in 310 es shaders to use AEP features" }, 629e5c31af7Sopenharmony_ci {tessellation_shader, "tessellation_shader", "GL_EXT_tessellation_shader is required in 310 es shaders to use AEP features" }, 630e5c31af7Sopenharmony_ci {texture_buffer, "texture_buffer", "GL_EXT_texture_buffer is required in 310 es shaders to use AEP features" }, 631e5c31af7Sopenharmony_ci {texture_cube_map_array, "texture_cube_map_array", "GL_EXT_texture_cube_map_array is required in 310 es shaders to use AEP features" }, 632e5c31af7Sopenharmony_ci {accessing_bounding_box_type, "accessing_bounding_box_type", "Should not be able to access gl_BoundingBoxEXT[] and gl_BoundingBox[] in shaders other than tess control and evaluation" }, 633e5c31af7Sopenharmony_ci }; 634e5c31af7Sopenharmony_ci 635e5c31af7Sopenharmony_ci return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs)); 636e5c31af7Sopenharmony_ci} 637e5c31af7Sopenharmony_ci 638e5c31af7Sopenharmony_ci} // NegativeTestShared 639e5c31af7Sopenharmony_ci} // Functional 640e5c31af7Sopenharmony_ci} // gles31 641e5c31af7Sopenharmony_ci} // deqp 642