1c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe/*------------------------------------------------------------------------- 2c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * drawElements Quality Program OpenGL ES 3.1 Module 3c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * ------------------------------------------------- 4c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * 5c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Copyright 2015 The Android Open Source Project 6c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * 7c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Licensed under the Apache License, Version 2.0 (the "License"); 8c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * you may not use this file except in compliance with the License. 9c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * You may obtain a copy of the License at 10c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * 11c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * http://www.apache.org/licenses/LICENSE-2.0 12c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * 13c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * Unless required by applicable law or agreed to in writing, software 14c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * distributed under the License is distributed on an "AS IS" BASIS, 15c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * See the License for the specific language governing permissions and 17c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * limitations under the License. 18c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * 19c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *//*! 20c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * \file 21c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe * \brief Negative Atomic Counter Tests 22c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *//*--------------------------------------------------------------------*/ 23c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 24c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "es31fNegativeAtomicCounterTests.hpp" 25c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 26c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "deUniquePtr.hpp" 27c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 28c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "glwEnums.hpp" 29c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "gluShaderProgram.hpp" 30c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 31c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "tcuTestLog.hpp" 32c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 33c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace deqp 34c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 35c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace gles31 36c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 37c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace Functional 38c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 39c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace NegativeTestShared 40c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 41c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace 42c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 43c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 44c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppeenum TestCase 45c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 46c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAYOUT_LARGE_BINDING = 0, 47c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAYOUT_MEDIUMP_PRECISION, 48c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAYOUT_LOWP_PRECISION, 49c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP, 50c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAYOUT_BINDING_OMITTED, 51c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_STRUCT, 52c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_BODY_WRITE, 53c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_BODY_DECLARE, 54c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 55c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe TESTCASE_LAST 56c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 57c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 58c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestatic const glu::ShaderType s_shaders[] = 59c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 60c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_VERTEX, 61c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_FRAGMENT, 62c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_GEOMETRY, 63c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_TESSELLATION_CONTROL, 64c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_TESSELLATION_EVALUATION, 65c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_COMPUTE 66c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 67c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 68c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string genShaderSource (NegativeTestContext& ctx, TestCase test, glu::ShaderType type) 69c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 70c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(test < TESTCASE_LAST && type < glu::SHADERTYPE_LAST); 71c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 72c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glw::GLint maxBuffers = -1; 73c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::ostringstream shader; 74c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 75c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &maxBuffers); 76c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 77c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES) << "\n"; 78c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 79c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (type) 80c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 81c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case glu::SHADERTYPE_GEOMETRY: 82c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "#extension GL_EXT_geometry_shader : enable\n"; 83c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout(max_vertices = 3) out;\n"; 84c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 85c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 86c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case glu::SHADERTYPE_TESSELLATION_CONTROL: 87c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case glu::SHADERTYPE_TESSELLATION_EVALUATION: 88c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "#extension GL_EXT_tessellation_shader : enable\n"; 89c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 90c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 91c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 92c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 93c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 94c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 95c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (test) 96c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 97c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_LAYOUT_LARGE_BINDING: 98c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (binding = " << maxBuffers << ", offset = 0) uniform atomic_uint counter0;\n"; 99c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 100c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 101c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_LAYOUT_MEDIUMP_PRECISION: 102c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (binding = 1, offset = 0) " << glu::getPrecisionName(glu::PRECISION_MEDIUMP) << " uniform atomic_uint counter0;\n"; 103c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 104c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 105c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_LAYOUT_LOWP_PRECISION: 106c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (binding = 1, offset = 0) " << glu::getPrecisionName(glu::PRECISION_LOWP) << " uniform atomic_uint counter0;\n"; 107c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 108c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 109c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP: 110c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (binding = 1, offset = 0) uniform atomic_uint counter0;\n" 111c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << "layout (binding = 1, offset = 2) uniform atomic_uint counter1;\n"; 112c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 113c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 114c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_LAYOUT_BINDING_OMITTED: 115c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (offset = 0) uniform atomic_uint counter0;\n"; 116c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 117c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 118c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_STRUCT: 119c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "struct\n" 120c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << "{\n" 121c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << " int a;\n" 122c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << " atomic_uint counter;\n" 123c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << "} S;\n"; 124c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 125c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 126c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_BODY_WRITE: 127c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "layout (binding = 1) uniform atomic_uint counter;\n"; 128c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 129c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 130c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 131c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 132c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 133c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 134c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "void main (void)\n" 135c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe << "{\n"; 136c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 137c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (test) 138c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 139c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_BODY_WRITE: 140c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "counter = 1;\n"; 141c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 142c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 143c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case TESTCASE_BODY_DECLARE: 144c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "atomic_uint counter;\n"; 145c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 146c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 147c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 148c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 149c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 150c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 151c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe shader << "}\n"; 152c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 153c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return shader.str(); 154c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 155c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 156c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid iterateShaders (NegativeTestContext& ctx, TestCase testCase) 157c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 158c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TestLog& log = ctx.getLog(); 159c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaders); ndx++) 160c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 161c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe if (ctx.isShaderSupported(s_shaders[ndx])) 162c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 163c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection(std::string("Verify shader: ") + glu::getShaderTypeName(s_shaders[ndx])); 164c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << glu::ShaderSource(s_shaders[ndx], genShaderSource(ctx, testCase, s_shaders[ndx]))); 165c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe if (program.getShaderInfo(s_shaders[ndx]).compileOk) 166c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 167c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe log << program; 168c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe log << tcu::TestLog::Message << "Expected program to fail, but compilation passed." << tcu::TestLog::EndMessage; 169c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.fail("Shader was not expected to compile."); 170c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 171c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 172c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 173c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 174c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 175c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 176c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_max_counter_bindings (NegativeTestContext& ctx) 177c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 178c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is a compile-time error to bind an atomic counter with a binding value greater than or equal to gl_MaxAtomicCounterBindings."); 179c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_LAYOUT_LARGE_BINDING); 180c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 181c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 182c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 183c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_precision (NegativeTestContext& ctx) 184c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 185c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is an error to declare an atomic type with a lowp or mediump precision."); 186c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_LAYOUT_MEDIUMP_PRECISION); 187c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_LAYOUT_LOWP_PRECISION); 188c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 189c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 190c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 191c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_binding_offset_overlap (NegativeTestContext& ctx) 192c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 193c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("Atomic counters may not have overlapping offsets in the same binding."); 194c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_LAYOUT_BINDING_OFFSET_OVERLAP); 195c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 196c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 197c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 198c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_binding_omitted (NegativeTestContext& ctx) 199c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 200c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("Atomic counters must specify a binding point"); 201c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_LAYOUT_BINDING_OMITTED); 202c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 203c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 204c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 205c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_struct (NegativeTestContext& ctx) 206c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 207c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("Structures may not have an atomic_uint variable."); 208c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_STRUCT); 209c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 210c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 211c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 212c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_body_write (NegativeTestContext& ctx) 213c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 214c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("An atomic_uint variable cannot be directly written to."); 215c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_BODY_WRITE); 216c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 217c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 218c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 219c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid atomic_body_declare (NegativeTestContext& ctx) 220c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 221c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("An atomic_uint variable cannot be declared in local scope"); 222c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe iterateShaders(ctx, TESTCASE_BODY_DECLARE); 223c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 224c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 225c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 226c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // anonymous 227c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 228c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::vector<FunctionContainer> getNegativeAtomicCounterTestFunctions () 229c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 230c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const FunctionContainer funcs[] = 231c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 232c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_max_counter_bindings, "atomic_max_counter_bindings", "Invalid atomic counter buffer binding." }, 233c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_precision, "atomic_precision", "Invalid precision qualifier." }, 234c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_binding_offset_overlap, "atomic_binding_offset_overlap", "Invalid offset." }, 235c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_binding_omitted, "atomic_binding_omitted", "Binding not specified." }, 236c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_struct, "atomic_struct", "Invalid atomic_uint usage in struct." }, 237c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_body_write, "atomic_body_write", "Invalid write access to atomic_uint." }, 238c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {atomic_body_declare, "atomic_body_declare", "Invalid precision qualifier." }, 239c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 240c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 241c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs)); 242c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 243c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 244c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // NegativeTestShared 245c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // Functional 246c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // gles31 247c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // deqp 248