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 Shader Image Load Store Tests 22c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe *//*--------------------------------------------------------------------*/ 23c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 24c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "es31fNegativeShaderImageLoadStoreTests.hpp" 25c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 26c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "deUniquePtr.hpp" 27c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 28c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "glwEnums.hpp" 29c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 30c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "gluShaderProgram.hpp" 31c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 32c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "glsTextureTestUtil.hpp" 33c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 34c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "tcuStringTemplate.hpp" 35c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "tcuTexture.hpp" 36c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe#include "tcuTestLog.hpp" 37c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 38c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace deqp 39c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 40c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace gles31 41c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 42c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace Functional 43c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 44c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace NegativeTestShared 45c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 46c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppenamespace 47c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 48c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 49c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppeenum MemoryQualifier 50c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 51c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_NONE = 0, 52c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_READONLY, 53c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_WRITEONLY, 54c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_BOTH, 55c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 56c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_LAST 57c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 58c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 59c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppeenum ImageOperation 60c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 61c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_STORE = 0, 62c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_LOAD, 63c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_ADD, 64c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_MIN, 65c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_MAX, 66c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_AND, 67c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_OR, 68c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_XOR, 69c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_EXCHANGE, 70c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_COMP_SWAP, 71c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 72c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_LAST 73c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 74c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 75c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestatic const glu::ShaderType s_shaders[] = 76c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 77c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_VERTEX, 78c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_FRAGMENT, 79c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_GEOMETRY, 80c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_TESSELLATION_CONTROL, 81c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_TESSELLATION_EVALUATION, 82c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe glu::SHADERTYPE_COMPUTE 83c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 84c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 85c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestatic const gls::TextureTestUtil::TextureType s_imageTypes[] = 86c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 87c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_2D, 88c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_3D, 89c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_CUBE, 90c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_2D_ARRAY, 91c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_BUFFER, 92c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe gls::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY 93c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe}; 94c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 95c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getShaderImageLayoutQualifier (const tcu::TextureFormat& format) 96c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 97c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::ostringstream qualifier; 98c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 99c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (format.order) 100c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 101c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::RGBA: qualifier << "rgba"; break; 102c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::R: qualifier << "r"; break; 103c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 104c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 105c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 106c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 107c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 108c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (format.type) 109c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 110c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::FLOAT: qualifier << "32f"; break; 111c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::HALF_FLOAT: qualifier << "16f"; break; 112c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNORM_INT8: qualifier << "8"; break; 113c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SNORM_INT8: qualifier << "8_snorm"; break; 114c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT32: qualifier << "32i"; break; 115c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT16: qualifier << "16i"; break; 116c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT8: qualifier << "8i"; break; 117c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT32: qualifier << "32ui"; break; 118c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT16: qualifier << "16ui"; break; 119c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT8: qualifier << "8ui"; break; 120c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 121c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 122c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 123c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 124c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 125c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return qualifier.str(); 126c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 127c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 128c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getShaderImageTypeDeclaration (const tcu::TextureFormat& format, gls::TextureTestUtil::TextureType imageType) 129c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 130c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::ostringstream declaration; 131c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 132c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (format.type) 133c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 134c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::FLOAT: 135c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::HALF_FLOAT: 136c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNORM_INT8: 137c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SNORM_INT8: declaration << ""; break; 138c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 139c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT32: 140c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT16: 141c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT8: declaration << "i"; break; 142c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 143c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT32: 144c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT16: 145c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT8: declaration << "u"; break; 146c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 147c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 148c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 149c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 150c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 151c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 152c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe declaration << "image"; 153c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 154c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch(imageType) 155c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 156c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D: declaration << "2D"; break; 157c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_3D: declaration << "3D"; break; 158c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE: declaration << "Cube"; break; 159c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D_ARRAY: declaration << "2DArray"; break; 160c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_BUFFER: declaration << "Buffer"; break; 161c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY: declaration << "CubeArray"; break; 162c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 163c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 164c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 165c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 166c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 167c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return declaration.str(); 168c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 169c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 170c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getShaderImageTypeExtensionString (gls::TextureTestUtil::TextureType imageType) 171c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 172c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::string extension; 173c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 174c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch(imageType) 175c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 176c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D: 177c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_3D: 178c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE: 179c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D_ARRAY: 180c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe extension = ""; 181c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 182c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 183c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_BUFFER: 184c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe extension = "#extension GL_EXT_texture_buffer : enable"; 185c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 186c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 187c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY: 188c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe extension = "#extension GL_EXT_texture_cube_map_array : enable"; 189c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 190c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 191c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 192c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 193c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 194c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 195c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 196c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return extension; 197c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 198c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 199c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getShaderImageParamP (gls::TextureTestUtil::TextureType imageType) 200c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 201c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch(imageType) 202c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 203c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D: 204c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return "ivec2(1, 1)"; 205c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 206c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_3D: 207c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE: 208c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_2D_ARRAY: 209c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_CUBE_ARRAY: 210c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return "ivec3(1, 1, 1)"; 211c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 212c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case gls::TextureTestUtil::TEXTURETYPE_BUFFER: 213c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return "1"; 214c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 215c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 216c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 217c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 218c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 219c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 220c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 221c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getOtherFunctionArguments (const tcu::TextureFormat& format, ImageOperation function) 222c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 223c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::ostringstream data; 224c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe data << ", "; 225c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 226c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe bool isFloat = false; 227c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 228c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch(format.type) 229c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 230c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::FLOAT: 231c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::HALF_FLOAT: 232c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNORM_INT8: 233c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SNORM_INT8: 234c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe data << ""; 235c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe isFloat = true; 236c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 237c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 238c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT32: 239c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT16: 240c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::SIGNED_INT8: 241c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe data << "i"; 242c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 243c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 244c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT32: 245c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT16: 246c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case tcu::TextureFormat::UNSIGNED_INT8: 247c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe data << "u"; 248c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 249c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 250c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 251c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 252c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 253c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 254c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 255c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (function) 256c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 257c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_LOAD: 258c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return ""; 259c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 260c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_STORE: 261c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe data << "vec4(1, 1, 1, 1)"; 262c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe break; 263c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 264c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_ADD: 265c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MIN: 266c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MAX: 267c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_AND: 268c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_OR: 269c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_XOR: 270c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return ", 1"; 271c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 272c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_EXCHANGE: 273c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return isFloat ? ", 1.0" : ", 1"; 274c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 275c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_COMP_SWAP: 276c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return ", 1, 1"; 277c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 278c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 279c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(false); 280c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 281c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 282c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return data.str(); 283c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 284c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 285c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getMemoryQualifier (MemoryQualifier memory) 286c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 287c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (memory) 288c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 289c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case MEMORY_NONE: 290c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 291c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 292c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case MEMORY_WRITEONLY: 293c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string("writeonly"); 294c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 295c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case MEMORY_READONLY: 296c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string("readonly"); 297c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 298c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case MEMORY_BOTH: 299c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string("writeonly readonly"); 300c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 301c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 302c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(DE_FALSE); 303c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 304c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 305c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 306c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 307c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 308c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getShaderImageFunctionExtensionString (ImageOperation function) 309c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 310c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (function) 311c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 312c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_STORE: 313c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_LOAD: 314c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 315c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 316c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_ADD: 317c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MIN: 318c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MAX: 319c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_AND: 320c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_OR: 321c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_XOR: 322c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_EXCHANGE: 323c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_COMP_SWAP: 324c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string("#extension GL_OES_shader_image_atomic : enable"); 325c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 326c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 327c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(DE_FALSE); 328c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 329c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 330c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 331c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 332c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string getFunctionName (ImageOperation function) 333c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 334c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe switch (function) 335c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 336c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_STORE: return std::string("imageStore"); 337c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_LOAD: return std::string("imageLoad"); 338c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_ADD: return std::string("imageAtomicAdd"); 339c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MIN: return std::string("imageAtomicMin"); 340c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_MAX: return std::string("imageAtomicMax"); 341c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_AND: return std::string("imageAtomicAnd"); 342c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_OR: return std::string("imageAtomicOr"); 343c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_XOR: return std::string("imageAtomicXor"); 344c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_EXCHANGE: return std::string("imageAtomicExchange"); 345c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe case IMAGE_OPERATION_ATOMIC_COMP_SWAP: return std::string("imageAtomicCompSwap"); 346c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe default: 347c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe DE_ASSERT(DE_FALSE); 348c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 349c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::string(""); 350c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 351c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 352c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::string generateShaderSource (ImageOperation function, MemoryQualifier memory, gls::TextureTestUtil::TextureType imageType, const tcu::TextureFormat& format, glu::ShaderType shaderType) 353c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 354c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const char* shaderTemplate = "${GLSL_VERSION_DECL}\n" 355c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "${GLSL_TYPE_EXTENSION}\n" 356c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "${GLSL_FUNCTION_EXTENSION}\n" 357c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "${GEOMETRY_SHADER_LAYOUT}\n" 358c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "layout(${LAYOUT_FORMAT}, binding = 0) highp uniform ${MEMORY_QUALIFIER} ${IMAGE_TYPE} u_img0;\n" 359c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "void main(void)\n" 360c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "{\n" 361c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe " ${FUNCTION_NAME}(u_img0, ${IMAGE_PARAM_P}${FUNCTION_ARGUMENTS});\n" 362c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe "}\n"; 363c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 364c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::map<std::string, std::string> params; 365c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 366c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["GLSL_VERSION_DECL"] = getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES); 367c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["GLSL_TYPE_EXTENSION"] = getShaderImageTypeExtensionString(imageType); 368c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["GLSL_FUNCTION_EXTENSION"] = getShaderImageFunctionExtensionString(function); 369c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["GEOMETRY_SHADER_LAYOUT"] = getGLShaderType(shaderType) == GL_GEOMETRY_SHADER ? "layout(max_vertices = 3) out;" : ""; 370c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["LAYOUT_FORMAT"] = getShaderImageLayoutQualifier(format); 371c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["MEMORY_QUALIFIER"] = getMemoryQualifier(memory); 372c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["IMAGE_TYPE"] = getShaderImageTypeDeclaration(format, imageType); 373c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["FUNCTION_NAME"] = getFunctionName(function); 374c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["IMAGE_PARAM_P"] = getShaderImageParamP(imageType); 375c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe params["FUNCTION_ARGUMENTS"] = getOtherFunctionArguments(format, function); 376c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 377c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return tcu::StringTemplate(shaderTemplate).specialize(params); 378c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 379c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 380c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid testShader (NegativeTestContext& ctx, ImageOperation function, MemoryQualifier memory, gls::TextureTestUtil::TextureType imageType, const tcu::TextureFormat& format) 381c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 382c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TestLog& log = ctx.getLog(); 383c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection(getFunctionName(function) + " " + getMemoryQualifier(memory) + " " + getShaderImageLayoutQualifier(format)); 384c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_shaders); ndx++) 385c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 386c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe if (ctx.isShaderSupported(s_shaders[ndx])) 387c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 388c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection(std::string("Verify shader: ") + glu::getShaderTypeName(s_shaders[ndx])); 389c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe std::string shaderSource(generateShaderSource(function, memory, imageType, format, s_shaders[ndx])); 390c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const glu::ShaderProgram program(ctx.getRenderContext(), glu::ProgramSources() << glu::ShaderSource(s_shaders[ndx], shaderSource)); 391c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe if (program.getShaderInfo(s_shaders[ndx]).compileOk) 392c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 393c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe log << program; 394c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe log << tcu::TestLog::Message << "Expected program to fail, but compilation passed." << tcu::TestLog::EndMessage; 395c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.fail("Shader was not expected to compile."); 396c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 397c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 398c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 399c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 400c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 401c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 402c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 403c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid image_store (NegativeTestContext& ctx) 404c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 405c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const tcu::TextureFormat formats[] = 406c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 407c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT), 408c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT), 409c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT), 410c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 411c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8), 412c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 413c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32), 414c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16), 415c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), 416c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32), 417c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 418c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32), 419c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16), 420c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), 421c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32) 422c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 423c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 424c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const MemoryQualifier memoryOptions[] = 425c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 426c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_READONLY, 427c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_BOTH 428c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 429c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 430c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is an error to pass a readonly image to imageStore."); 431c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx) 432c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 433c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx) 434c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 435c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_imageTypes); ++typeNdx) 436c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 437c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe testShader(ctx, IMAGE_OPERATION_STORE, memoryOptions[memoryNdx], s_imageTypes[typeNdx], formats[fmtNdx]); 438c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 439c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 440c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 441c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 442c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 443c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 444c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid image_load (NegativeTestContext& ctx) 445c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 446c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const tcu::TextureFormat formats[] = 447c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 448c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT), 449c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT), 450c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT), 451c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 452c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8), 453c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 454c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32), 455c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16), 456c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), 457c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32), 458c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 459c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32), 460c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16), 461c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), 462c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32) 463c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 464c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 465c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const MemoryQualifier memoryOptions[] = 466c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 467c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_WRITEONLY, 468c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_BOTH 469c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 470c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 471c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is an error to pass a writeonly image to imageLoad."); 472c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx) 473c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 474c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx) 475c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 476c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_imageTypes); ++typeNdx) 477c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 478c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe testShader(ctx, IMAGE_OPERATION_LOAD, memoryOptions[memoryNdx], s_imageTypes[typeNdx], formats[fmtNdx]); 479c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 480c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 481c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 482c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 483c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 484c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 485c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid image_atomic (NegativeTestContext& ctx) 486c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 487c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const tcu::TextureFormat formats[] = 488c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 489c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32), 490c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16), 491c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), 492c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32), 493c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 494c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32), 495c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16), 496c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), 497c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32) 498c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 499c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 500c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const MemoryQualifier memoryOptions[] = 501c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 502c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_READONLY, 503c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_WRITEONLY, 504c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_BOTH 505c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 506c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 507c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const ImageOperation imageOperations[] = 508c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 509c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_ADD, 510c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_MIN, 511c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_MAX, 512c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_AND, 513c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_OR, 514c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_XOR, 515c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe IMAGE_OPERATION_ATOMIC_COMP_SWAP 516c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 517c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 518c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is an error to pass a writeonly and/or readonly image to imageAtomic*."); 519c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx) 520c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 521c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx) 522c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 523c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_imageTypes); ++typeNdx) 524c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 525c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int functionNdx = 0; functionNdx < DE_LENGTH_OF_ARRAY(imageOperations); ++functionNdx) 526c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 527c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe testShader(ctx, imageOperations[functionNdx], memoryOptions[memoryNdx], s_imageTypes[typeNdx], formats[fmtNdx]); 528c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 529c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 530c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 531c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 532c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 533c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 534c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 535c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppevoid image_atomic_exchange (NegativeTestContext& ctx) 536c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 537c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const tcu::TextureFormat formats[] = 538c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 539c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT), 540c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT), 541c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::FLOAT), 542c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 543c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SNORM_INT8), 544c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 545c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32), 546c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT16), 547c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), 548c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::SIGNED_INT32), 549c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 550c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32), 551c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT16), 552c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), 553c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe tcu::TextureFormat(tcu::TextureFormat::R, tcu::TextureFormat::UNSIGNED_INT32) 554c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 555c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 556c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const MemoryQualifier memoryOptions[] = 557c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 558c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_READONLY, 559c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_WRITEONLY, 560c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe MEMORY_BOTH 561c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 562c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 563c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.beginSection("It is an error to pass a writeonly and/or readonly image to imageAtomic*."); 564c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int memoryNdx = 0; memoryNdx < DE_LENGTH_OF_ARRAY(memoryOptions); ++memoryNdx) 565c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 566c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(formats); ++fmtNdx) 567c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 568c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe for (int typeNdx = 0; typeNdx < DE_LENGTH_OF_ARRAY(s_imageTypes); ++typeNdx) 569c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 570c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe testShader(ctx, IMAGE_OPERATION_ATOMIC_EXCHANGE, memoryOptions[memoryNdx], s_imageTypes[typeNdx], formats[fmtNdx]); 571c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 572c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 573c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe } 574c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe ctx.endSection(); 575c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 576c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 577c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // anonymous 578c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 579c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppestd::vector<FunctionContainer> getNegativeShaderImageLoadStoreTestFunctions (void) 580c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe{ 581c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe const FunctionContainer funcs[] = 582c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe { 583c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {image_store, "image_store", "Test incorrect usage of imageStore()" }, 584c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {image_load, "image_load", "Test incorrect usage of imageLoad()" }, 585c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {image_atomic, "image_atomic", "Test incorrect usage of imageAtomic*()" }, 586c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe {image_atomic_exchange, "image_atomic_exchange", "Test incorrect usage of imageAtomicExchange()" }, 587c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe }; 588c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 589c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs)); 590c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} 591c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe 592c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // NegativeTestShared 593c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // Functional 594c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // gles31 595c0ef0b01a0958cd309cf0c23268fdedbaa6e21ccDaniel Andrade Groppe} // deqp 596