1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES 3.1 Module
3 * -------------------------------------------------
5 * Copyright 2015 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief Negative Shader Image Load Store Tests
22 *//*--------------------------------------------------------------------*/
24 #include "es31fNegativeShaderImageLoadStoreTests.hpp"
26 #include "deUniquePtr.hpp"
28 #include "glwEnums.hpp"
30 #include "gluShaderProgram.hpp"
32 #include "glsTextureTestUtil.hpp"
34 #include "tcuStringTemplate.hpp"
35 #include "tcuTexture.hpp"
36 #include "tcuTestLog.hpp"
44 namespace NegativeTestShared
61 IMAGE_OPERATION_STORE = 0,
63 IMAGE_OPERATION_ATOMIC_ADD,
64 IMAGE_OPERATION_ATOMIC_MIN,
65 IMAGE_OPERATION_ATOMIC_MAX,
66 IMAGE_OPERATION_ATOMIC_AND,
67 IMAGE_OPERATION_ATOMIC_OR,
68 IMAGE_OPERATION_ATOMIC_XOR,
69 IMAGE_OPERATION_ATOMIC_EXCHANGE,
70 IMAGE_OPERATION_ATOMIC_COMP_SWAP,
75 static const glu::ShaderType s_shaders[] =
77 glu::SHADERTYPE_VERTEX,
78 glu::SHADERTYPE_FRAGMENT,
79 glu::SHADERTYPE_GEOMETRY,
80 glu::SHADERTYPE_TESSELLATION_CONTROL,
81 glu::SHADERTYPE_TESSELLATION_EVALUATION,
82 glu::SHADERTYPE_COMPUTE
85 std::string getShaderImageLayoutQualifier (const tcu::TextureFormat& format)
87 std::ostringstream qualifier;
91 case tcu::TextureFormat::RGBA: qualifier << "rgba"; break;
92 case tcu::TextureFormat::R: qualifier << "r"; break;
95 return std::string("");
100 case tcu::TextureFormat::FLOAT: qualifier << "32f"; break;
101 case tcu::TextureFormat::HALF_FLOAT: qualifier << "16f"; break;
102 case tcu::TextureFormat::UNORM_INT8: qualifier << "8"; break;
103 case tcu::TextureFormat::SNORM_INT8: qualifier << "8_snorm"; break;
104 case tcu::TextureFormat::SIGNED_INT32: qualifier << "32i"; break;
105 case tcu::TextureFormat::SIGNED_INT16: qualifier << "16i"; break;
106 case tcu::TextureFormat::SIGNED_INT8: qualifier << "8i"; break;
107 case tcu::TextureFormat::UNSIGNED_INT32: qualifier << "32ui"; break;
108 case tcu::TextureFormat::UNSIGNED_INT16: qualifier << "16ui"; break;
109 case tcu::TextureFormat::UNSIGNED_INT8: qualifier << "8ui"; break;
112 return std::string("");
115 return qualifier.str();
118 std::string getShaderImageTypeDeclaration (const tcu::TextureFormat& format, glu::TextureTestUtil::TextureType imageType)
120 std::ostringstream declaration;
124 case tcu::TextureFormat::FLOAT:
125 case tcu::TextureFormat::HALF_FLOAT:
126 case tcu::TextureFormat::UNORM_INT8:
127 case tcu::TextureFormat::SNORM_INT8: declaration << ""; break;
129 case tcu::TextureFormat::SIGNED_INT32:
130 case tcu::TextureFormat::SIGNED_INT16:
131 case tcu::TextureFormat::SIGNED_INT8: declaration << "i"; break;
133 case tcu::TextureFormat::UNSIGNED_INT32:
134 case tcu::TextureFormat::UNSIGNED_INT16:
135 case tcu::TextureFormat::UNSIGNED_INT8: declaration << "u"; break;
139 return std::string("");
142 declaration << "image";
146 case glu::TextureTestUtil::TEXTURETYPE_2D: declaration << "2D"; break;
147 case glu::TextureTestUtil::TEXTURETYPE_3D: declaration << "3D"; break;
148 case glu::TextureTestUtil::TEXTURETYPE_CUBE: declaration << "Cube"; break;
149 case glu::TextureTestUtil::TEXTURETYPE_2D_ARRAY: declaration << "2DArray"; break;
150 case glu::TextureTestUtil::TEXTURETYPE_BUFFER: declaration << "Buffer"; break;
151 case glu::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY: declaration << "CubeArray"; break;
154 return std::string("");
157 return declaration.str();
160 std::string getShaderImageTypeExtensionString (glu::TextureTestUtil::TextureType imageType)
162 std::string extension;
166 case glu::TextureTestUtil::TEXTURETYPE_2D:
167 case glu::TextureTestUtil::TEXTURETYPE_3D:
168 case glu::TextureTestUtil::TEXTURETYPE_CUBE:
169 case glu::TextureTestUtil::TEXTURETYPE_2D_ARRAY:
173 case glu::TextureTestUtil::TEXTURETYPE_BUFFER:
174 extension = "#extension GL_EXT_texture_buffer : enable";
177 case glu::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY:
178 extension = "#extension GL_EXT_texture_cube_map_array : enable";
183 return std::string("");
189 std::string getShaderImageParamP (glu::TextureTestUtil::TextureType imageType)
193 case glu::TextureTestUtil::TEXTURETYPE_2D:
194 return "ivec2(1, 1)";
196 case glu::TextureTestUtil::TEXTURETYPE_3D:
197 case glu::TextureTestUtil::TEXTURETYPE_CUBE:
198 case glu::TextureTestUtil::TEXTURETYPE_2D_ARRAY:
199 case glu::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY:
200 return "ivec3(1, 1, 1)";
202 case glu::TextureTestUtil::TEXTURETYPE_BUFFER:
207 return std::string("");
211 std::string getOtherFunctionArguments (const tcu::TextureFormat& format, ImageOperation function)
213 std::ostringstream data;
216 bool isFloat = false;
220 case tcu::TextureFormat::FLOAT:
221 case tcu::TextureFormat::HALF_FLOAT:
222 case tcu::TextureFormat::UNORM_INT8:
223 case tcu::TextureFormat::SNORM_INT8:
228 case tcu::TextureFormat::SIGNED_INT32:
229 case tcu::TextureFormat::SIGNED_INT16:
230 case tcu::TextureFormat::SIGNED_INT8:
234 case tcu::TextureFormat::UNSIGNED_INT32:
235 case tcu::TextureFormat::UNSIGNED_INT16:
236 case tcu::TextureFormat::UNSIGNED_INT8:
242 return std::string("");
247 case IMAGE_OPERATION_LOAD:
250 case IMAGE_OPERATION_STORE:
251 data << "vec4(1, 1, 1, 1)";
254 case IMAGE_OPERATION_ATOMIC_ADD:
255 case IMAGE_OPERATION_ATOMIC_MIN:
256 case IMAGE_OPERATION_ATOMIC_MAX:
257 case IMAGE_OPERATION_ATOMIC_AND:
258 case IMAGE_OPERATION_ATOMIC_OR:
259 case IMAGE_OPERATION_ATOMIC_XOR:
262 case IMAGE_OPERATION_ATOMIC_EXCHANGE:
263 return isFloat ? ", 1.0" : ", 1";
265 case IMAGE_OPERATION_ATOMIC_COMP_SWAP:
270 return std::string("");
275 std::string getMemoryQualifier (MemoryQualifier memory)
280 return std::string("");
282 case MEMORY_WRITEONLY:
283 return std::string("writeonly");
285 case MEMORY_READONLY:
286 return std::string("readonly");
289 return std::string("writeonly readonly");
295 return std::string("");
298 std::string getShaderImageFunctionExtensionString (ImageOperation function)
302 case IMAGE_OPERATION_STORE:
303 case IMAGE_OPERATION_LOAD:
304 return std::string("");
306 case IMAGE_OPERATION_ATOMIC_ADD:
307 case IMAGE_OPERATION_ATOMIC_MIN:
308 case IMAGE_OPERATION_ATOMIC_MAX:
309 case IMAGE_OPERATION_ATOMIC_AND:
310 case IMAGE_OPERATION_ATOMIC_OR:
311 case IMAGE_OPERATION_ATOMIC_XOR:
312 case IMAGE_OPERATION_ATOMIC_EXCHANGE:
313 case IMAGE_OPERATION_ATOMIC_COMP_SWAP:
314 return std::string("#extension GL_OES_shader_image_atomic : enable");
319 return std::string("");
322 std::string getFunctionName (ImageOperation function)
326 case IMAGE_OPERATION_STORE: return std::string("imageStore");
327 case IMAGE_OPERATION_LOAD: return std::string("imageLoad");
328 case IMAGE_OPERATION_ATOMIC_ADD: return std::string("imageAtomicAdd");
329 case IMAGE_OPERATION_ATOMIC_MIN: return std::string("imageAtomicMin");
330 case IMAGE_OPERATION_ATOMIC_MAX: return std::string("imageAtomicMax");
331 case IMAGE_OPERATION_ATOMIC_AND: return std::string("imageAtomicAnd");
332 case IMAGE_OPERATION_ATOMIC_OR: return std::string("imageAtomicOr");
333 case IMAGE_OPERATION_ATOMIC_XOR: return std::string("imageAtomicXor");
334 case IMAGE_OPERATION_ATOMIC_EXCHANGE: return std::string("imageAtomicExchange");
335 case IMAGE_OPERATION_ATOMIC_COMP_SWAP: return std::string("imageAtomicCompSwap");
339 return std::string("");
342 std::string generateShaderSource (ImageOperation function, MemoryQualifier memory, glu::TextureTestUtil::TextureType imageType, const tcu::TextureFormat& format, glu::ShaderType shaderType)
344 const char* shaderTemplate = "${GLSL_VERSION_DECL}\n"
345 "${GLSL_TYPE_EXTENSION}\n"
346 "${GLSL_FUNCTION_EXTENSION}\n"
347 "${GEOMETRY_SHADER_LAYOUT}\n"
348 "layout(${LAYOUT_FORMAT}, binding = 0) highp uniform ${MEMORY_QUALIFIER} ${IMAGE_TYPE} u_img0;\n"
351 " ${FUNCTION_NAME}(u_img0, ${IMAGE_PARAM_P}${FUNCTION_ARGUMENTS});\n"
354 std::map<std::string, std::string> params;
356 params["GLSL_VERSION_DECL"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
357 params["GLSL_TYPE_EXTENSION"] = getShaderImageTypeExtensionString(imageType);
358 params["GLSL_FUNCTION_EXTENSION"] = getShaderImageFunctionExtensionString(function);
359 params["GEOMETRY_SHADER_LAYOUT"] = getGLShaderType(shaderType) == GL_GEOMETRY_SHADER ? "layout(max_vertices = 3) out;" : "";
360 params["LAYOUT_FORMAT"] = getShaderImageLayoutQualifier(format);
361 params["MEMORY_QUALIFIER"] = getMemoryQualifier(memory);
362 params["IMAGE_TYPE"] = getShaderImageTypeDeclaration(format, imageType);
363 params["FUNCTION_NAME"] = getFunctionName(function);
364 params["IMAGE_PARAM_P"] = getShaderImageParamP(imageType);
365 params["FUNCTION_ARGUMENTS"] = getOtherFunctionArguments(format, function);
367 return tcu::StringTemplate(shaderTemplate).specialize(params);
370 void testShader (NegativeTestContext& ctx, ImageOperation function, MemoryQualifier memory, glu::TextureTestUtil::TextureType imageType, const tcu::TextureFormat& format)
372 tcu::TestLog& log = ctx.getLog();
373 ctx.beginSection(getFunctionName(function) + " " + getMemoryQualifier(memory) + " " + getShaderImageLayoutQualifier(format));
374 for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaders); ndx++)
376 if (ctx.isShaderSupported(s_shaders[ndx]))
378 ctx.beginSection(std::string("Verify shader: ") + glu::getShaderTypeName(s_shaders[ndx]));
379 std::string shaderSource(generateShaderSource(function, memory, imageType, format, s_shaders[ndx]));
380 const glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << glu::ShaderSource(s_shaders[ndx], shaderSource));
381 if (program.getShaderInfo(s_shaders[ndx]).compileOk)
384 log << tcu::TestLog::Message << "Expected program to fail, but compilation passed." << tcu::TestLog::EndMessage;
385 ctx.fail("Shader was not expected to compile.");
393 void image_store (NegativeTestContext& ctx, glu::TextureTestUtil::TextureType imageType)
395 const tcu::TextureFormat formats[] =
397 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT),
398 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT),
399 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT),
400 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
401 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8),
403 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32),
404 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16),
405 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8),
406 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
408 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32),
409 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16),
410 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8),
411 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32)
414 const MemoryQualifier memoryOptions[] =
420 ctx.beginSection("It is an error to pass a readonly image to imageStore.");
421 for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx)
423 for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx)
425 testShader(ctx, IMAGE_OPERATION_STORE, memoryOptions[memoryNdx], imageType, formats[fmtNdx]);
431 void image_load (NegativeTestContext& ctx, glu::TextureTestUtil::TextureType imageType)
433 const tcu::TextureFormat formats[] =
435 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT),
436 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT),
437 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT),
438 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
439 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8),
441 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32),
442 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16),
443 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8),
444 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
446 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32),
447 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16),
448 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8),
449 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32)
452 const MemoryQualifier memoryOptions[] =
458 ctx.beginSection("It is an error to pass a writeonly image to imageLoad.");
459 for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx)
461 for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx)
463 testShader(ctx, IMAGE_OPERATION_LOAD, memoryOptions[memoryNdx], imageType, formats[fmtNdx]);
469 void image_atomic (NegativeTestContext& ctx, glu::TextureTestUtil::TextureType imageType)
471 const tcu::TextureFormat formats[] =
473 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32),
474 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16),
475 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8),
476 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
478 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32),
479 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16),
480 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8),
481 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32)
484 const MemoryQualifier memoryOptions[] =
491 const ImageOperation imageOperations[] =
493 IMAGE_OPERATION_ATOMIC_ADD,
494 IMAGE_OPERATION_ATOMIC_MIN,
495 IMAGE_OPERATION_ATOMIC_MAX,
496 IMAGE_OPERATION_ATOMIC_AND,
497 IMAGE_OPERATION_ATOMIC_OR,
498 IMAGE_OPERATION_ATOMIC_XOR,
499 IMAGE_OPERATION_ATOMIC_COMP_SWAP
502 ctx.beginSection("It is an error to pass a writeonly and/or readonly image to imageAtomic*.");
503 for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx)
505 for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx)
507 for (int functionNdx = 0; functionNdx < DE_LENGTH_OF_ARRAY(imageOperations); ++functionNdx)
509 testShader(ctx, imageOperations[functionNdx], memoryOptions[memoryNdx], imageType, formats[fmtNdx]);
516 void image_atomic_exchange (NegativeTestContext& ctx, glu::TextureTestUtil::TextureType imageType)
518 const tcu::TextureFormat formats[] =
520 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT),
521 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT),
522 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT),
523 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8),
524 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8),
526 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32),
527 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16),
528 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8),
529 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32),
531 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32),
532 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16),
533 tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8),
534 tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32)
537 const MemoryQualifier memoryOptions[] =
544 ctx.beginSection("It is an error to pass a writeonly and/or readonly image to imageAtomic*.");
545 for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx)
547 for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx)
549 testShader(ctx, IMAGE_OPERATION_ATOMIC_EXCHANGE, memoryOptions[memoryNdx], imageType, formats[fmtNdx]);
555 // Re-routing function template for generating the standard negative
556 // test function signature with texture type added.
559 void loadFuncWrapper (NegativeTestContext& ctx)
561 image_load(ctx, (glu::TextureTestUtil::TextureType)Type);
565 void storeFuncWrapper (NegativeTestContext& ctx)
567 image_store(ctx, (glu::TextureTestUtil::TextureType)Type);
571 void atomicFuncWrapper (NegativeTestContext& ctx)
573 image_atomic(ctx, (glu::TextureTestUtil::TextureType)Type);
577 void atomicExchangeFuncWrapper (NegativeTestContext& ctx)
579 image_atomic_exchange(ctx, (glu::TextureTestUtil::TextureType)Type);
584 // Set of texture types to create tests for.
585 #define CREATE_TEST_FUNC_PER_TEXTURE_TYPE(NAME, FUNC) const FunctionContainer NAME[] = \
587 {FUNC<glu::TextureTestUtil::TEXTURETYPE_2D>, "texture_2d", "Texture2D negative tests."}, \
588 {FUNC<glu::TextureTestUtil::TEXTURETYPE_3D>, "texture_3d", "Texture3D negative tests."}, \
589 {FUNC<glu::TextureTestUtil::TEXTURETYPE_CUBE>, "cube", "Cube texture negative tests."}, \
590 {FUNC<glu::TextureTestUtil::TEXTURETYPE_2D_ARRAY>, "2d_array", "2D array texture negative tests."}, \
591 {FUNC<glu::TextureTestUtil::TEXTURETYPE_BUFFER>, "buffer", "Buffer negative tests."}, \
592 {FUNC<glu::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY>, "cube_array", "Cube array texture negative tests."} \
595 std::vector<FunctionContainer> getNegativeShaderImageLoadTestFunctions (void)
597 CREATE_TEST_FUNC_PER_TEXTURE_TYPE(funcs, loadFuncWrapper);
598 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
601 std::vector<FunctionContainer> getNegativeShaderImageStoreTestFunctions (void)
603 CREATE_TEST_FUNC_PER_TEXTURE_TYPE(funcs, storeFuncWrapper);
604 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
607 std::vector<FunctionContainer> getNegativeShaderImageAtomicTestFunctions (void)
609 CREATE_TEST_FUNC_PER_TEXTURE_TYPE(funcs, atomicFuncWrapper);
610 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
613 std::vector<FunctionContainer> getNegativeShaderImageAtomicExchangeTestFunctions (void)
615 CREATE_TEST_FUNC_PER_TEXTURE_TYPE(funcs, atomicExchangeFuncWrapper);
616 return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
619 } // NegativeTestShared