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