1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * OpenGL Conformance Test Suite
3*35238bceSAndroid Build Coastguard Worker * -----------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright (c) 2014-2016 The Khronos Group Inc.
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker */ /*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief
22*35238bceSAndroid Build Coastguard Worker */ /*-------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "gl4cTextureGatherTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glcTestSubcase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
35*35238bceSAndroid Build Coastguard Worker #include <cstdarg>
36*35238bceSAndroid Build Coastguard Worker #include <math.h>
37*35238bceSAndroid Build Coastguard Worker #include <string>
38*35238bceSAndroid Build Coastguard Worker #include <vector>
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker namespace gl4cts
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker using namespace glw;
44*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
45*35238bceSAndroid Build Coastguard Worker using tcu::UVec4;
46*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
47*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
48*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker namespace
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker class TGBase : public deqp::SubcaseBase
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker public:
~TGBase()56*35238bceSAndroid Build Coastguard Worker virtual ~TGBase()
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker }
59*35238bceSAndroid Build Coastguard Worker
TGBase()60*35238bceSAndroid Build Coastguard Worker TGBase() : renderTarget(m_context.getRenderContext().getRenderTarget()), pixelFormat(renderTarget.getPixelFormat())
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker g_color_eps = Vec4(
63*35238bceSAndroid Build Coastguard Worker 1.f / (float)(1 << deMin32(8, pixelFormat.redBits)), 1.f / (float)(1 << deMin32(8, pixelFormat.greenBits)),
64*35238bceSAndroid Build Coastguard Worker 1.f / (float)(1 << deMin32(8, pixelFormat.blueBits)), 1.f / (float)(1 << pixelFormat.alphaBits));
65*35238bceSAndroid Build Coastguard Worker }
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker const tcu::RenderTarget &renderTarget;
68*35238bceSAndroid Build Coastguard Worker const tcu::PixelFormat &pixelFormat;
69*35238bceSAndroid Build Coastguard Worker Vec4 g_color_eps;
70*35238bceSAndroid Build Coastguard Worker
GetWindowWidth()71*35238bceSAndroid Build Coastguard Worker int GetWindowWidth()
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker return renderTarget.getWidth();
74*35238bceSAndroid Build Coastguard Worker }
75*35238bceSAndroid Build Coastguard Worker
GetWindowHeight()76*35238bceSAndroid Build Coastguard Worker int GetWindowHeight()
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker return renderTarget.getHeight();
79*35238bceSAndroid Build Coastguard Worker }
80*35238bceSAndroid Build Coastguard Worker
Title()81*35238bceSAndroid Build Coastguard Worker virtual std::string Title()
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker return "";
84*35238bceSAndroid Build Coastguard Worker }
85*35238bceSAndroid Build Coastguard Worker
Purpose()86*35238bceSAndroid Build Coastguard Worker virtual std::string Purpose()
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker return "";
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker
Method()91*35238bceSAndroid Build Coastguard Worker virtual std::string Method()
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker return "";
94*35238bceSAndroid Build Coastguard Worker }
95*35238bceSAndroid Build Coastguard Worker
PassCriteria()96*35238bceSAndroid Build Coastguard Worker virtual std::string PassCriteria()
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker return "";
99*35238bceSAndroid Build Coastguard Worker }
100*35238bceSAndroid Build Coastguard Worker
CreateProgram(const char * src_vs,const char * src_tcs,const char * src_tes,const char * src_gs,const char * src_fs)101*35238bceSAndroid Build Coastguard Worker GLuint CreateProgram(const char *src_vs, const char *src_tcs, const char *src_tes, const char *src_gs,
102*35238bceSAndroid Build Coastguard Worker const char *src_fs)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker const GLuint p = glCreateProgram();
105*35238bceSAndroid Build Coastguard Worker
106*35238bceSAndroid Build Coastguard Worker if (src_vs)
107*35238bceSAndroid Build Coastguard Worker {
108*35238bceSAndroid Build Coastguard Worker GLuint sh = glCreateShader(GL_VERTEX_SHADER);
109*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
110*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
111*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, &src_vs, NULL);
112*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
113*35238bceSAndroid Build Coastguard Worker }
114*35238bceSAndroid Build Coastguard Worker if (src_tcs)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker GLuint sh = glCreateShader(GL_TESS_CONTROL_SHADER);
117*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
118*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
119*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, &src_tcs, NULL);
120*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker if (src_tes)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker GLuint sh = glCreateShader(GL_TESS_EVALUATION_SHADER);
125*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
126*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
127*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, &src_tes, NULL);
128*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
129*35238bceSAndroid Build Coastguard Worker }
130*35238bceSAndroid Build Coastguard Worker if (src_gs)
131*35238bceSAndroid Build Coastguard Worker {
132*35238bceSAndroid Build Coastguard Worker GLuint sh = glCreateShader(GL_GEOMETRY_SHADER);
133*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
134*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
135*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, &src_gs, NULL);
136*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
137*35238bceSAndroid Build Coastguard Worker }
138*35238bceSAndroid Build Coastguard Worker if (src_fs)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker GLuint sh = glCreateShader(GL_FRAGMENT_SHADER);
141*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
142*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
143*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, &src_fs, NULL);
144*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker return p;
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker
CreateComputeProgram(const std::string & cs)149*35238bceSAndroid Build Coastguard Worker GLuint CreateComputeProgram(const std::string &cs)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker const GLuint p = glCreateProgram();
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker if (!cs.empty())
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker const GLuint sh = glCreateShader(GL_COMPUTE_SHADER);
156*35238bceSAndroid Build Coastguard Worker glAttachShader(p, sh);
157*35238bceSAndroid Build Coastguard Worker glDeleteShader(sh);
158*35238bceSAndroid Build Coastguard Worker const char *const src[1] = {cs.c_str()};
159*35238bceSAndroid Build Coastguard Worker glShaderSource(sh, 1, src, NULL);
160*35238bceSAndroid Build Coastguard Worker glCompileShader(sh);
161*35238bceSAndroid Build Coastguard Worker }
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker return p;
164*35238bceSAndroid Build Coastguard Worker }
165*35238bceSAndroid Build Coastguard Worker
CheckProgram(GLuint program,bool * compile_error=NULL)166*35238bceSAndroid Build Coastguard Worker bool CheckProgram(GLuint program, bool *compile_error = NULL)
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker GLint compile_status = GL_TRUE;
169*35238bceSAndroid Build Coastguard Worker GLint status;
170*35238bceSAndroid Build Coastguard Worker glGetProgramiv(program, GL_LINK_STATUS, &status);
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker if (status == GL_FALSE)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker GLint attached_shaders;
175*35238bceSAndroid Build Coastguard Worker glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders);
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker if (attached_shaders > 0)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker std::vector<GLuint> shaders(attached_shaders);
180*35238bceSAndroid Build Coastguard Worker glGetAttachedShaders(program, attached_shaders, NULL, &shaders[0]);
181*35238bceSAndroid Build Coastguard Worker
182*35238bceSAndroid Build Coastguard Worker for (GLint i = 0; i < attached_shaders; ++i)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker GLenum type;
185*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shaders[i], GL_SHADER_TYPE, reinterpret_cast<GLint *>(&type));
186*35238bceSAndroid Build Coastguard Worker switch (type)
187*35238bceSAndroid Build Coastguard Worker {
188*35238bceSAndroid Build Coastguard Worker case GL_VERTEX_SHADER:
189*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
190*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Vertex Shader ***" << tcu::TestLog::EndMessage;
191*35238bceSAndroid Build Coastguard Worker break;
192*35238bceSAndroid Build Coastguard Worker case GL_TESS_CONTROL_SHADER:
193*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
194*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Tessellation Control Shader ***"
195*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
196*35238bceSAndroid Build Coastguard Worker break;
197*35238bceSAndroid Build Coastguard Worker case GL_TESS_EVALUATION_SHADER:
198*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
199*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Tessellation Evaluation Shader ***"
200*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
201*35238bceSAndroid Build Coastguard Worker break;
202*35238bceSAndroid Build Coastguard Worker case GL_GEOMETRY_SHADER:
203*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
204*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Geometry Shader ***" << tcu::TestLog::EndMessage;
205*35238bceSAndroid Build Coastguard Worker break;
206*35238bceSAndroid Build Coastguard Worker case GL_FRAGMENT_SHADER:
207*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
208*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Fragment Shader ***" << tcu::TestLog::EndMessage;
209*35238bceSAndroid Build Coastguard Worker break;
210*35238bceSAndroid Build Coastguard Worker case GL_COMPUTE_SHADER:
211*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
212*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Compute Shader ***" << tcu::TestLog::EndMessage;
213*35238bceSAndroid Build Coastguard Worker break;
214*35238bceSAndroid Build Coastguard Worker default:
215*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
216*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "*** Unknown Shader ***" << tcu::TestLog::EndMessage;
217*35238bceSAndroid Build Coastguard Worker }
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker GLint res;
220*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shaders[i], GL_COMPILE_STATUS, &res);
221*35238bceSAndroid Build Coastguard Worker if (res != GL_TRUE)
222*35238bceSAndroid Build Coastguard Worker compile_status = res;
223*35238bceSAndroid Build Coastguard Worker
224*35238bceSAndroid Build Coastguard Worker GLint length;
225*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shaders[i], GL_SHADER_SOURCE_LENGTH, &length);
226*35238bceSAndroid Build Coastguard Worker if (length > 0)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker std::vector<GLchar> source(length);
229*35238bceSAndroid Build Coastguard Worker glGetShaderSource(shaders[i], length, NULL, &source[0]);
230*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
231*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << &source[0] << tcu::TestLog::EndMessage;
232*35238bceSAndroid Build Coastguard Worker }
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker glGetShaderiv(shaders[i], GL_INFO_LOG_LENGTH, &length);
235*35238bceSAndroid Build Coastguard Worker if (length > 0)
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker std::vector<GLchar> log(length);
238*35238bceSAndroid Build Coastguard Worker glGetShaderInfoLog(shaders[i], length, NULL, &log[0]);
239*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
240*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage;
241*35238bceSAndroid Build Coastguard Worker }
242*35238bceSAndroid Build Coastguard Worker }
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Worker GLint length;
246*35238bceSAndroid Build Coastguard Worker glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
247*35238bceSAndroid Build Coastguard Worker if (length > 0)
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker std::vector<GLchar> log(length);
250*35238bceSAndroid Build Coastguard Worker glGetProgramInfoLog(program, length, NULL, &log[0]);
251*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog() << tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage;
252*35238bceSAndroid Build Coastguard Worker }
253*35238bceSAndroid Build Coastguard Worker }
254*35238bceSAndroid Build Coastguard Worker
255*35238bceSAndroid Build Coastguard Worker if (compile_error)
256*35238bceSAndroid Build Coastguard Worker *compile_error = (compile_status == GL_TRUE ? false : true);
257*35238bceSAndroid Build Coastguard Worker if (compile_status != GL_TRUE)
258*35238bceSAndroid Build Coastguard Worker return false;
259*35238bceSAndroid Build Coastguard Worker return status == GL_TRUE ? true : false;
260*35238bceSAndroid Build Coastguard Worker }
261*35238bceSAndroid Build Coastguard Worker
distance(GLfloat p0,GLfloat p1)262*35238bceSAndroid Build Coastguard Worker GLfloat distance(GLfloat p0, GLfloat p1)
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker return de::abs(p0 - p1);
265*35238bceSAndroid Build Coastguard Worker }
266*35238bceSAndroid Build Coastguard Worker
ColorEqual(const Vec4 & c0,const Vec4 & c1,const Vec4 & epsilon)267*35238bceSAndroid Build Coastguard Worker inline bool ColorEqual(const Vec4 &c0, const Vec4 &c1, const Vec4 &epsilon)
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker if (distance(c0.x(), c1.x()) > epsilon.x())
270*35238bceSAndroid Build Coastguard Worker return false;
271*35238bceSAndroid Build Coastguard Worker if (distance(c0.y(), c1.y()) > epsilon.y())
272*35238bceSAndroid Build Coastguard Worker return false;
273*35238bceSAndroid Build Coastguard Worker if (distance(c0.z(), c1.z()) > epsilon.z())
274*35238bceSAndroid Build Coastguard Worker return false;
275*35238bceSAndroid Build Coastguard Worker if (distance(c0.w(), c1.w()) > epsilon.w())
276*35238bceSAndroid Build Coastguard Worker return false;
277*35238bceSAndroid Build Coastguard Worker return true;
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker
Setup()280*35238bceSAndroid Build Coastguard Worker virtual long Setup()
281*35238bceSAndroid Build Coastguard Worker {
282*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
283*35238bceSAndroid Build Coastguard Worker }
284*35238bceSAndroid Build Coastguard Worker
Cleanup()285*35238bceSAndroid Build Coastguard Worker virtual long Cleanup()
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
288*35238bceSAndroid Build Coastguard Worker }
289*35238bceSAndroid Build Coastguard Worker };
290*35238bceSAndroid Build Coastguard Worker
291*35238bceSAndroid Build Coastguard Worker class GatherEnumsTest : public TGBase
292*35238bceSAndroid Build Coastguard Worker {
Title()293*35238bceSAndroid Build Coastguard Worker virtual std::string Title()
294*35238bceSAndroid Build Coastguard Worker {
295*35238bceSAndroid Build Coastguard Worker return "Basic Enum Test";
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker
Purpose()298*35238bceSAndroid Build Coastguard Worker virtual std::string Purpose()
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker return "Verify that gather related enums are correct.";
301*35238bceSAndroid Build Coastguard Worker }
302*35238bceSAndroid Build Coastguard Worker
Method()303*35238bceSAndroid Build Coastguard Worker virtual std::string Method()
304*35238bceSAndroid Build Coastguard Worker {
305*35238bceSAndroid Build Coastguard Worker return "Query GL_*_TEXTURE_GATHER_OFFSET enums.";
306*35238bceSAndroid Build Coastguard Worker }
307*35238bceSAndroid Build Coastguard Worker
PassCriteria()308*35238bceSAndroid Build Coastguard Worker virtual std::string PassCriteria()
309*35238bceSAndroid Build Coastguard Worker {
310*35238bceSAndroid Build Coastguard Worker return "Values of enums meet GL spec requirements.";
311*35238bceSAndroid Build Coastguard Worker }
312*35238bceSAndroid Build Coastguard Worker
Run()313*35238bceSAndroid Build Coastguard Worker virtual long Run()
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker GLint res;
316*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, &res);
317*35238bceSAndroid Build Coastguard Worker if (res > -8)
318*35238bceSAndroid Build Coastguard Worker {
319*35238bceSAndroid Build Coastguard Worker return ERROR;
320*35238bceSAndroid Build Coastguard Worker }
321*35238bceSAndroid Build Coastguard Worker glGetIntegerv(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, &res);
322*35238bceSAndroid Build Coastguard Worker if (res < 7)
323*35238bceSAndroid Build Coastguard Worker {
324*35238bceSAndroid Build Coastguard Worker return ERROR;
325*35238bceSAndroid Build Coastguard Worker }
326*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker };
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker class GatherGLSLCompile : public TGBase
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker GLuint program;
333*35238bceSAndroid Build Coastguard Worker
Title()334*35238bceSAndroid Build Coastguard Worker virtual std::string Title()
335*35238bceSAndroid Build Coastguard Worker {
336*35238bceSAndroid Build Coastguard Worker return "GLSL Compile Test";
337*35238bceSAndroid Build Coastguard Worker }
338*35238bceSAndroid Build Coastguard Worker
Purpose()339*35238bceSAndroid Build Coastguard Worker virtual std::string Purpose()
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker return "Verify that gather functions are visible in the shaders.";
342*35238bceSAndroid Build Coastguard Worker }
343*35238bceSAndroid Build Coastguard Worker
Method()344*35238bceSAndroid Build Coastguard Worker virtual std::string Method()
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker return "Create shaders which use all types of gather functions.";
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker
PassCriteria()349*35238bceSAndroid Build Coastguard Worker virtual std::string PassCriteria()
350*35238bceSAndroid Build Coastguard Worker {
351*35238bceSAndroid Build Coastguard Worker return "Programs compile and link successfuly.";
352*35238bceSAndroid Build Coastguard Worker }
353*35238bceSAndroid Build Coastguard Worker
Uniforms()354*35238bceSAndroid Build Coastguard Worker virtual std::string Uniforms()
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D tex_2d; \n"
357*35238bceSAndroid Build Coastguard Worker "uniform isamplerCube itex_cube; \n"
358*35238bceSAndroid Build Coastguard Worker "uniform usampler2DArray utex_2da; \n"
359*35238bceSAndroid Build Coastguard Worker "uniform isampler2DRect itex_2dr; \n"
360*35238bceSAndroid Build Coastguard Worker ""
361*35238bceSAndroid Build Coastguard Worker "uniform sampler2DRectShadow tex_2drs; \n"
362*35238bceSAndroid Build Coastguard Worker "uniform sampler2DShadow tex_2ds; \n"
363*35238bceSAndroid Build Coastguard Worker "uniform samplerCubeShadow tex_cubes; \n"
364*35238bceSAndroid Build Coastguard Worker "uniform sampler2DArrayShadow tex_2das; \n";
365*35238bceSAndroid Build Coastguard Worker }
366*35238bceSAndroid Build Coastguard Worker
Sampling()367*35238bceSAndroid Build Coastguard Worker virtual std::string Sampling()
368*35238bceSAndroid Build Coastguard Worker {
369*35238bceSAndroid Build Coastguard Worker return " textureGather(tex_2d,vec2(1)); \n"
370*35238bceSAndroid Build Coastguard Worker " textureGather(itex_cube,vec3(1)); \n"
371*35238bceSAndroid Build Coastguard Worker " textureGather(utex_2da,vec3(1)); \n"
372*35238bceSAndroid Build Coastguard Worker " textureGather(itex_2dr,vec2(1)); \n"
373*35238bceSAndroid Build Coastguard Worker ""
374*35238bceSAndroid Build Coastguard Worker " textureGather(tex_2drs,vec2(1), 0.5); \n"
375*35238bceSAndroid Build Coastguard Worker " textureGather(tex_2ds,vec2(1), 0.5); \n"
376*35238bceSAndroid Build Coastguard Worker " textureGather(tex_cubes,vec3(1), 0.5); \n"
377*35238bceSAndroid Build Coastguard Worker " textureGather(tex_2das,vec3(1), 0.5); \n"
378*35238bceSAndroid Build Coastguard Worker ""
379*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(tex_2d,vec2(1), ivec2(0)); \n"
380*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(utex_2da,vec3(1), ivec2(0)); \n"
381*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(itex_2dr,vec2(1), ivec2(0)); \n"
382*35238bceSAndroid Build Coastguard Worker ""
383*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(tex_2drs,vec2(1), 0.5, ivec2(0)); \n"
384*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(tex_2ds,vec2(1), 0.5, ivec2(0)); \n"
385*35238bceSAndroid Build Coastguard Worker " textureGatherOffset(tex_2das,vec3(1), 0.5, ivec2(0)); \n"
386*35238bceSAndroid Build Coastguard Worker ""
387*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(0), ivec2(0), ivec2(0), ivec2(0)); \n"
388*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(tex_2d,vec2(1), offsets); \n"
389*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(utex_2da,vec3(1), offsets); \n"
390*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(itex_2dr,vec2(1), offsets); \n"
391*35238bceSAndroid Build Coastguard Worker ""
392*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(tex_2drs,vec2(1), 0.5, offsets); \n"
393*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(tex_2ds,vec2(1), 0.5, offsets); \n"
394*35238bceSAndroid Build Coastguard Worker " textureGatherOffsets(tex_2das,vec3(1), 0.5, offsets); \n";
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker
VertexShader()397*35238bceSAndroid Build Coastguard Worker virtual std::string VertexShader()
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker return "#version 400 \n" + Uniforms() +
400*35238bceSAndroid Build Coastguard Worker " void main() { \n" + Sampling() +
401*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(1); \n"
402*35238bceSAndroid Build Coastguard Worker " } \n";
403*35238bceSAndroid Build Coastguard Worker }
404*35238bceSAndroid Build Coastguard Worker
FragmentShader()405*35238bceSAndroid Build Coastguard Worker virtual std::string FragmentShader()
406*35238bceSAndroid Build Coastguard Worker {
407*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
408*35238bceSAndroid Build Coastguard Worker "out vec4 color; \n" +
409*35238bceSAndroid Build Coastguard Worker Uniforms() + " void main() { \n" + Sampling() +
410*35238bceSAndroid Build Coastguard Worker " color = vec4(1); \n"
411*35238bceSAndroid Build Coastguard Worker " } \n";
412*35238bceSAndroid Build Coastguard Worker }
413*35238bceSAndroid Build Coastguard Worker
Run()414*35238bceSAndroid Build Coastguard Worker virtual long Run()
415*35238bceSAndroid Build Coastguard Worker {
416*35238bceSAndroid Build Coastguard Worker program = CreateProgram(VertexShader().c_str(), NULL, NULL, NULL, FragmentShader().c_str());
417*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
418*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
419*35238bceSAndroid Build Coastguard Worker return ERROR;
420*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
421*35238bceSAndroid Build Coastguard Worker }
422*35238bceSAndroid Build Coastguard Worker
Cleanup()423*35238bceSAndroid Build Coastguard Worker virtual long Cleanup()
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
426*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
427*35238bceSAndroid Build Coastguard Worker }
428*35238bceSAndroid Build Coastguard Worker };
429*35238bceSAndroid Build Coastguard Worker
430*35238bceSAndroid Build Coastguard Worker class GatherBase : public TGBase
431*35238bceSAndroid Build Coastguard Worker {
432*35238bceSAndroid Build Coastguard Worker public:
433*35238bceSAndroid Build Coastguard Worker GLuint tex, fbo, rbo, program, vao, vbo;
434*35238bceSAndroid Build Coastguard Worker
CreateTexture2DRgb(bool base_level=false)435*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DRgb(bool base_level = false)
436*35238bceSAndroid Build Coastguard Worker {
437*35238bceSAndroid Build Coastguard Worker GLenum internal_format = GL_RGB32F;
438*35238bceSAndroid Build Coastguard Worker GLenum format = GL_RGB;
439*35238bceSAndroid Build Coastguard Worker const GLint csize = base_level ? 64 : 32;
440*35238bceSAndroid Build Coastguard Worker GLint size = csize;
441*35238bceSAndroid Build Coastguard Worker GLenum target = GL_TEXTURE_2D;
442*35238bceSAndroid Build Coastguard Worker GLenum tex_type = GL_FLOAT;
443*35238bceSAndroid Build Coastguard Worker
444*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
445*35238bceSAndroid Build Coastguard Worker glBindTexture(target, tex);
446*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, i, internal_format, size, size, 0, format, tex_type, 0);
449*35238bceSAndroid Build Coastguard Worker }
450*35238bceSAndroid Build Coastguard Worker std::vector<Vec3> pixels(csize * csize, Vec3(1.0));
451*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 0, 0, csize, csize, format, tex_type, &pixels[0]);
452*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(target);
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker Vec3 data[4] = {Vec3(12. / 16, 13. / 16, 14. / 16), Vec3(8. / 16, 9. / 16, 10. / 16),
455*35238bceSAndroid Build Coastguard Worker Vec3(0. / 16, 1. / 16, 2. / 16), Vec3(4. / 16, 5. / 16, 6. / 16)};
456*35238bceSAndroid Build Coastguard Worker
457*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 22, 25, 2, 2, format, tex_type, data);
458*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 16, 10, 1, 1, format, tex_type, data + 0);
459*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 11, 2, 1, 1, format, tex_type, data + 1);
460*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 24, 13, 1, 1, format, tex_type, data + 2);
461*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 9, 14, 1, 1, format, tex_type, data + 3);
462*35238bceSAndroid Build Coastguard Worker
463*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
464*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
465*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker
CreateTexture2DRg(bool base_level=false)468*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DRg(bool base_level = false)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker GLenum internal_format = GL_RG32F;
471*35238bceSAndroid Build Coastguard Worker GLenum format = GL_RG;
472*35238bceSAndroid Build Coastguard Worker const GLint csize = base_level ? 64 : 32;
473*35238bceSAndroid Build Coastguard Worker GLint size = csize;
474*35238bceSAndroid Build Coastguard Worker GLenum target = GL_TEXTURE_2D;
475*35238bceSAndroid Build Coastguard Worker GLenum tex_type = GL_FLOAT;
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
478*35238bceSAndroid Build Coastguard Worker glBindTexture(target, tex);
479*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
480*35238bceSAndroid Build Coastguard Worker {
481*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, i, internal_format, size, size, 0, format, tex_type, 0);
482*35238bceSAndroid Build Coastguard Worker }
483*35238bceSAndroid Build Coastguard Worker std::vector<Vec2> pixels(csize * csize, Vec2(1.0));
484*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 0, 0, csize, csize, format, tex_type, &pixels[0]);
485*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(target);
486*35238bceSAndroid Build Coastguard Worker
487*35238bceSAndroid Build Coastguard Worker Vec2 data[4] = {Vec2(12. / 16, 13. / 16), Vec2(8. / 16, 9. / 16), Vec2(0. / 16, 1. / 16),
488*35238bceSAndroid Build Coastguard Worker Vec2(4. / 16, 5. / 16)};
489*35238bceSAndroid Build Coastguard Worker
490*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 22, 25, 2, 2, format, tex_type, data);
491*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 16, 10, 1, 1, format, tex_type, data + 0);
492*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 11, 2, 1, 1, format, tex_type, data + 1);
493*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 24, 13, 1, 1, format, tex_type, data + 2);
494*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 9, 14, 1, 1, format, tex_type, data + 3);
495*35238bceSAndroid Build Coastguard Worker
496*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
497*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
498*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
499*35238bceSAndroid Build Coastguard Worker }
500*35238bceSAndroid Build Coastguard Worker
CreateTexture2DR(bool base_level=false)501*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DR(bool base_level = false)
502*35238bceSAndroid Build Coastguard Worker {
503*35238bceSAndroid Build Coastguard Worker GLenum internal_format = GL_R32F;
504*35238bceSAndroid Build Coastguard Worker GLenum format = GL_RED;
505*35238bceSAndroid Build Coastguard Worker const GLint csize = base_level ? 64 : 32;
506*35238bceSAndroid Build Coastguard Worker GLint size = csize;
507*35238bceSAndroid Build Coastguard Worker GLenum target = GL_TEXTURE_2D;
508*35238bceSAndroid Build Coastguard Worker GLenum tex_type = GL_FLOAT;
509*35238bceSAndroid Build Coastguard Worker
510*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
511*35238bceSAndroid Build Coastguard Worker glBindTexture(target, tex);
512*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
513*35238bceSAndroid Build Coastguard Worker {
514*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, i, internal_format, size, size, 0, format, tex_type, 0);
515*35238bceSAndroid Build Coastguard Worker }
516*35238bceSAndroid Build Coastguard Worker std::vector<GLfloat> pixels(csize * csize, 1.0);
517*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 0, 0, csize, csize, format, tex_type, &pixels[0]);
518*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(target);
519*35238bceSAndroid Build Coastguard Worker
520*35238bceSAndroid Build Coastguard Worker GLfloat data[4] = {12. / 16., 8. / 16., 0. / 16., 4. / 16.};
521*35238bceSAndroid Build Coastguard Worker
522*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 22, 25, 2, 2, format, tex_type, data);
523*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 16, 10, 1, 1, format, tex_type, data + 0);
524*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 11, 2, 1, 1, format, tex_type, data + 1);
525*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 24, 13, 1, 1, format, tex_type, data + 2);
526*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 9, 14, 1, 1, format, tex_type, data + 3);
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
529*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
530*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
531*35238bceSAndroid Build Coastguard Worker }
532*35238bceSAndroid Build Coastguard Worker
CreateTexture2DInt(bool rect=false)533*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DInt(bool rect = false)
534*35238bceSAndroid Build Coastguard Worker {
535*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
536*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
537*35238bceSAndroid Build Coastguard Worker GLint size = csize;
538*35238bceSAndroid Build Coastguard Worker GLenum target = rect ? GL_TEXTURE_RECTANGLE : GL_TEXTURE_2D;
539*35238bceSAndroid Build Coastguard Worker
540*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
541*35238bceSAndroid Build Coastguard Worker glBindTexture(target, tex);
542*35238bceSAndroid Build Coastguard Worker if (!rect)
543*35238bceSAndroid Build Coastguard Worker {
544*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
545*35238bceSAndroid Build Coastguard Worker {
546*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, i, internal_format, size, size, 0, GL_RGBA_INTEGER, GL_INT, 0);
547*35238bceSAndroid Build Coastguard Worker }
548*35238bceSAndroid Build Coastguard Worker }
549*35238bceSAndroid Build Coastguard Worker else
550*35238bceSAndroid Build Coastguard Worker {
551*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, 0, internal_format, size, size, 0, GL_RGBA_INTEGER, GL_INT, 0);
552*35238bceSAndroid Build Coastguard Worker }
553*35238bceSAndroid Build Coastguard Worker std::vector<IVec4> pixels(csize * csize, IVec4(999));
554*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 0, 0, csize, csize, GL_RGBA_INTEGER, GL_INT, &pixels[0]);
555*35238bceSAndroid Build Coastguard Worker
556*35238bceSAndroid Build Coastguard Worker IVec4 data[4] = {IVec4(12, 13, 14, 15), IVec4(8, 9, 10, 11), IVec4(0, 1, 2, 3), IVec4(4, 5, 6, 7)};
557*35238bceSAndroid Build Coastguard Worker
558*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 22, 25, 2, 2, GL_RGBA_INTEGER, GL_INT, data);
559*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 16, 10, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 0);
560*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 11, 2, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 1);
561*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 24, 13, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 2);
562*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 9, 14, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 3);
563*35238bceSAndroid Build Coastguard Worker
564*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
565*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
566*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
567*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
568*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
569*35238bceSAndroid Build Coastguard Worker }
570*35238bceSAndroid Build Coastguard Worker
CreateTexture2DArrayInt(int slices,int data_slice)571*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DArrayInt(int slices, int data_slice)
572*35238bceSAndroid Build Coastguard Worker {
573*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
574*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
575*35238bceSAndroid Build Coastguard Worker GLint size = csize;
576*35238bceSAndroid Build Coastguard Worker
577*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
578*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
579*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
580*35238bceSAndroid Build Coastguard Worker {
581*35238bceSAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, i, internal_format, size, size, slices, 0, GL_RGBA_INTEGER, GL_INT, 0);
582*35238bceSAndroid Build Coastguard Worker }
583*35238bceSAndroid Build Coastguard Worker std::vector<IVec4> pixels(csize * csize, IVec4(999));
584*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < slices; ++i)
585*35238bceSAndroid Build Coastguard Worker {
586*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, csize, csize, 1, GL_RGBA_INTEGER, GL_INT, &pixels[0]);
587*35238bceSAndroid Build Coastguard Worker }
588*35238bceSAndroid Build Coastguard Worker
589*35238bceSAndroid Build Coastguard Worker IVec4 data[4] = {IVec4(12, 13, 14, 15), IVec4(8, 9, 10, 11), IVec4(0, 1, 2, 3), IVec4(4, 5, 6, 7)};
590*35238bceSAndroid Build Coastguard Worker
591*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 22, 25, data_slice, 2, 2, 1, GL_RGBA_INTEGER, GL_INT, data);
592*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 16, 10, data_slice, 1, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 0);
593*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 11, 2, data_slice, 1, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 1);
594*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 24, 13, data_slice, 1, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 2);
595*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 9, 14, data_slice, 1, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 3);
596*35238bceSAndroid Build Coastguard Worker
597*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
598*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
599*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
600*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
601*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
602*35238bceSAndroid Build Coastguard Worker }
603*35238bceSAndroid Build Coastguard Worker
CreateTextureCubeArray(int slices,int data_slice)604*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTextureCubeArray(int slices, int data_slice)
605*35238bceSAndroid Build Coastguard Worker {
606*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
607*35238bceSAndroid Build Coastguard Worker GLenum format = Format();
608*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
609*35238bceSAndroid Build Coastguard Worker GLint size = csize;
610*35238bceSAndroid Build Coastguard Worker
611*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
612*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
613*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
614*35238bceSAndroid Build Coastguard Worker {
615*35238bceSAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, internal_format, size, size, 6 * slices, 0, format, GL_FLOAT, 0);
616*35238bceSAndroid Build Coastguard Worker }
617*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> pixels(csize * csize, Vec4(1.0));
618*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6 * slices; ++j)
619*35238bceSAndroid Build Coastguard Worker {
620*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, j, csize, csize, 1, format, GL_FLOAT, &pixels[0]);
621*35238bceSAndroid Build Coastguard Worker }
622*35238bceSAndroid Build Coastguard Worker
623*35238bceSAndroid Build Coastguard Worker if (format != GL_DEPTH_COMPONENT)
624*35238bceSAndroid Build Coastguard Worker {
625*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_CUBE_MAP_ARRAY);
626*35238bceSAndroid Build Coastguard Worker }
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker Vec4 data[4] = {Vec4(12. / 16, 13. / 16, 14. / 16, 15. / 16), Vec4(8. / 16, 9. / 16, 10. / 16, 11. / 16),
629*35238bceSAndroid Build Coastguard Worker Vec4(0. / 16, 1. / 16, 2. / 16, 3. / 16), Vec4(4. / 16, 5. / 16, 6. / 16, 7. / 16)};
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker Vec4 depthData(data[0][0], data[1][0], data[2][0], data[3][0]);
632*35238bceSAndroid Build Coastguard Worker Vec4 *packedData = (format == GL_DEPTH_COMPONENT) ? &depthData : data;
633*35238bceSAndroid Build Coastguard Worker
634*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 6; ++i)
635*35238bceSAndroid Build Coastguard Worker {
636*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 22, 25, (6 * data_slice) + i, 2, 2, 1, format, GL_FLOAT,
637*35238bceSAndroid Build Coastguard Worker packedData);
638*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 16, 10, (6 * data_slice) + i, 1, 1, 1, format, GL_FLOAT,
639*35238bceSAndroid Build Coastguard Worker data + 0);
640*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 11, 2, (6 * data_slice) + i, 1, 1, 1, format, GL_FLOAT,
641*35238bceSAndroid Build Coastguard Worker data + 1);
642*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 24, 13, (6 * data_slice) + i, 1, 1, 1, format, GL_FLOAT,
643*35238bceSAndroid Build Coastguard Worker data + 2);
644*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 9, 14, (6 * data_slice) + i, 1, 1, 1, format, GL_FLOAT,
645*35238bceSAndroid Build Coastguard Worker data + 3);
646*35238bceSAndroid Build Coastguard Worker }
647*35238bceSAndroid Build Coastguard Worker
648*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
649*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
650*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
651*35238bceSAndroid Build Coastguard Worker }
652*35238bceSAndroid Build Coastguard Worker
CreateTextureCubeArrayInt(int slices,int data_slice)653*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTextureCubeArrayInt(int slices, int data_slice)
654*35238bceSAndroid Build Coastguard Worker {
655*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
656*35238bceSAndroid Build Coastguard Worker GLenum format = GL_RGBA_INTEGER;
657*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
658*35238bceSAndroid Build Coastguard Worker GLint size = csize;
659*35238bceSAndroid Build Coastguard Worker
660*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
661*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
662*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
663*35238bceSAndroid Build Coastguard Worker {
664*35238bceSAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, internal_format, size, size, 6 * slices, 0, format, GL_INT, 0);
665*35238bceSAndroid Build Coastguard Worker }
666*35238bceSAndroid Build Coastguard Worker std::vector<IVec4> pixels(csize * csize, IVec4(999));
667*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6 * slices; ++j)
668*35238bceSAndroid Build Coastguard Worker {
669*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, j, csize, csize, 1, format, GL_INT, &pixels[0]);
670*35238bceSAndroid Build Coastguard Worker }
671*35238bceSAndroid Build Coastguard Worker
672*35238bceSAndroid Build Coastguard Worker IVec4 data[4] = {IVec4(12, 13, 14, 15), IVec4(8, 9, 10, 11), IVec4(0, 1, 2, 3), IVec4(4, 5, 6, 7)};
673*35238bceSAndroid Build Coastguard Worker
674*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 6; ++i)
675*35238bceSAndroid Build Coastguard Worker {
676*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 22, 25, (6 * data_slice) + i, 2, 2, 1, format, GL_INT, data);
677*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 9, 14, (6 * data_slice) + i, 1, 1, 1, format, GL_INT,
678*35238bceSAndroid Build Coastguard Worker data + 3);
679*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 16, 10, (6 * data_slice) + i, 1, 1, 1, format, GL_INT,
680*35238bceSAndroid Build Coastguard Worker data + 0);
681*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 11, 2, (6 * data_slice) + i, 1, 1, 1, format, GL_INT,
682*35238bceSAndroid Build Coastguard Worker data + 1);
683*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 24, 13, (6 * data_slice) + i, 1, 1, 1, format, GL_INT,
684*35238bceSAndroid Build Coastguard Worker data + 2);
685*35238bceSAndroid Build Coastguard Worker }
686*35238bceSAndroid Build Coastguard Worker
687*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
688*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
689*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
690*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
691*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
692*35238bceSAndroid Build Coastguard Worker }
693*35238bceSAndroid Build Coastguard Worker
CreateTexture2DArray(int slices,int data_slice)694*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2DArray(int slices, int data_slice)
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
697*35238bceSAndroid Build Coastguard Worker GLenum format = Format();
698*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
699*35238bceSAndroid Build Coastguard Worker GLint size = csize;
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
702*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
703*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
704*35238bceSAndroid Build Coastguard Worker {
705*35238bceSAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, i, internal_format, size, size, slices, 0, format, GL_FLOAT, 0);
706*35238bceSAndroid Build Coastguard Worker }
707*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> pixels(csize * csize, Vec4(1.0));
708*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < slices; ++i)
709*35238bceSAndroid Build Coastguard Worker {
710*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, csize, csize, 1, format, GL_FLOAT, &pixels[0]);
711*35238bceSAndroid Build Coastguard Worker }
712*35238bceSAndroid Build Coastguard Worker
713*35238bceSAndroid Build Coastguard Worker if (format != GL_DEPTH_COMPONENT)
714*35238bceSAndroid Build Coastguard Worker {
715*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
716*35238bceSAndroid Build Coastguard Worker }
717*35238bceSAndroid Build Coastguard Worker
718*35238bceSAndroid Build Coastguard Worker Vec4 data[4] = {Vec4(12. / 16, 13. / 16, 14. / 16, 15. / 16), Vec4(8. / 16, 9. / 16, 10. / 16, 11. / 16),
719*35238bceSAndroid Build Coastguard Worker Vec4(0. / 16, 1. / 16, 2. / 16, 3. / 16), Vec4(4. / 16, 5. / 16, 6. / 16, 7. / 16)};
720*35238bceSAndroid Build Coastguard Worker
721*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 22, 25, data_slice, 2, 2, 1, format, GL_FLOAT, data);
722*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 16, 10, data_slice, 1, 1, 1, format, GL_FLOAT, data + 0);
723*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 11, 2, data_slice, 1, 1, 1, format, GL_FLOAT, data + 1);
724*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 24, 13, data_slice, 1, 1, 1, format, GL_FLOAT, data + 2);
725*35238bceSAndroid Build Coastguard Worker glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 9, 14, data_slice, 1, 1, 1, format, GL_FLOAT, data + 3);
726*35238bceSAndroid Build Coastguard Worker
727*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
728*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
729*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
730*35238bceSAndroid Build Coastguard Worker }
731*35238bceSAndroid Build Coastguard Worker
CreateTextureCubeInt()732*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTextureCubeInt()
733*35238bceSAndroid Build Coastguard Worker {
734*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
735*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
736*35238bceSAndroid Build Coastguard Worker GLint size = csize;
737*35238bceSAndroid Build Coastguard Worker
738*35238bceSAndroid Build Coastguard Worker const GLenum faces[6] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
739*35238bceSAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
740*35238bceSAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};
741*35238bceSAndroid Build Coastguard Worker
742*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
743*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
744*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
745*35238bceSAndroid Build Coastguard Worker {
746*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
747*35238bceSAndroid Build Coastguard Worker {
748*35238bceSAndroid Build Coastguard Worker glTexImage2D(faces[j], i, internal_format, size, size, 0, GL_RGBA_INTEGER, GL_INT, 0);
749*35238bceSAndroid Build Coastguard Worker }
750*35238bceSAndroid Build Coastguard Worker }
751*35238bceSAndroid Build Coastguard Worker std::vector<IVec4> pixels(csize * csize, IVec4(999));
752*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
753*35238bceSAndroid Build Coastguard Worker {
754*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 0, 0, csize, csize, GL_RGBA_INTEGER, GL_INT, &pixels[0]);
755*35238bceSAndroid Build Coastguard Worker }
756*35238bceSAndroid Build Coastguard Worker
757*35238bceSAndroid Build Coastguard Worker IVec4 data[4] = {IVec4(12, 13, 14, 15), IVec4(8, 9, 10, 11), IVec4(0, 1, 2, 3), IVec4(4, 5, 6, 7)};
758*35238bceSAndroid Build Coastguard Worker
759*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
760*35238bceSAndroid Build Coastguard Worker {
761*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 22, 25, 2, 2, GL_RGBA_INTEGER, GL_INT, data);
762*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 16, 10, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 0);
763*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 11, 2, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 1);
764*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 24, 13, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 2);
765*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 9, 14, 1, 1, GL_RGBA_INTEGER, GL_INT, data + 3);
766*35238bceSAndroid Build Coastguard Worker }
767*35238bceSAndroid Build Coastguard Worker
768*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
769*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
770*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
771*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
772*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
773*35238bceSAndroid Build Coastguard Worker }
774*35238bceSAndroid Build Coastguard Worker
CreateTextureCube()775*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTextureCube()
776*35238bceSAndroid Build Coastguard Worker {
777*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
778*35238bceSAndroid Build Coastguard Worker GLenum format = Format();
779*35238bceSAndroid Build Coastguard Worker const GLint csize = 32;
780*35238bceSAndroid Build Coastguard Worker GLint size = csize;
781*35238bceSAndroid Build Coastguard Worker
782*35238bceSAndroid Build Coastguard Worker const GLenum faces[6] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
783*35238bceSAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
784*35238bceSAndroid Build Coastguard Worker GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z};
785*35238bceSAndroid Build Coastguard Worker
786*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
787*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
788*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
789*35238bceSAndroid Build Coastguard Worker {
790*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
791*35238bceSAndroid Build Coastguard Worker {
792*35238bceSAndroid Build Coastguard Worker glTexImage2D(faces[j], i, internal_format, size, size, 0, format, GL_FLOAT, 0);
793*35238bceSAndroid Build Coastguard Worker }
794*35238bceSAndroid Build Coastguard Worker }
795*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> pixels(csize * csize, Vec4(1.0));
796*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
797*35238bceSAndroid Build Coastguard Worker {
798*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 0, 0, csize, csize, format, GL_FLOAT, &pixels[0]);
799*35238bceSAndroid Build Coastguard Worker }
800*35238bceSAndroid Build Coastguard Worker
801*35238bceSAndroid Build Coastguard Worker if (format != GL_DEPTH_COMPONENT)
802*35238bceSAndroid Build Coastguard Worker {
803*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
804*35238bceSAndroid Build Coastguard Worker }
805*35238bceSAndroid Build Coastguard Worker
806*35238bceSAndroid Build Coastguard Worker Vec4 data[4] = {Vec4(12. / 16, 13. / 16, 14. / 16, 15. / 16), Vec4(8. / 16, 9. / 16, 10. / 16, 11. / 16),
807*35238bceSAndroid Build Coastguard Worker Vec4(0. / 16, 1. / 16, 2. / 16, 3. / 16), Vec4(4. / 16, 5. / 16, 6. / 16, 7. / 16)};
808*35238bceSAndroid Build Coastguard Worker
809*35238bceSAndroid Build Coastguard Worker Vec4 depthData(data[0][0], data[1][0], data[2][0], data[3][0]);
810*35238bceSAndroid Build Coastguard Worker Vec4 *packedData = (format == GL_DEPTH_COMPONENT) ? &depthData : data;
811*35238bceSAndroid Build Coastguard Worker
812*35238bceSAndroid Build Coastguard Worker for (int j = 0; j < 6; ++j)
813*35238bceSAndroid Build Coastguard Worker {
814*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 22, 25, 2, 2, format, GL_FLOAT, packedData);
815*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 16, 10, 1, 1, format, GL_FLOAT, data + 0);
816*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 11, 2, 1, 1, format, GL_FLOAT, data + 1);
817*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 24, 13, 1, 1, format, GL_FLOAT, data + 2);
818*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(faces[j], 0, 9, 14, 1, 1, format, GL_FLOAT, data + 3);
819*35238bceSAndroid Build Coastguard Worker }
820*35238bceSAndroid Build Coastguard Worker
821*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
822*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
823*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
824*35238bceSAndroid Build Coastguard Worker }
825*35238bceSAndroid Build Coastguard Worker
CreateTexture2D(bool rect=false,bool base_level=false)826*35238bceSAndroid Build Coastguard Worker virtual GLvoid CreateTexture2D(bool rect = false, bool base_level = false)
827*35238bceSAndroid Build Coastguard Worker {
828*35238bceSAndroid Build Coastguard Worker GLenum internal_format = InternalFormat();
829*35238bceSAndroid Build Coastguard Worker GLenum format = Format();
830*35238bceSAndroid Build Coastguard Worker const GLint csize = base_level ? 64 : 32;
831*35238bceSAndroid Build Coastguard Worker GLint size = csize;
832*35238bceSAndroid Build Coastguard Worker GLenum target = rect ? GL_TEXTURE_RECTANGLE : GL_TEXTURE_2D;
833*35238bceSAndroid Build Coastguard Worker
834*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
835*35238bceSAndroid Build Coastguard Worker glBindTexture(target, tex);
836*35238bceSAndroid Build Coastguard Worker if (!rect)
837*35238bceSAndroid Build Coastguard Worker {
838*35238bceSAndroid Build Coastguard Worker for (int i = 0; size > 0; ++i, size /= 2)
839*35238bceSAndroid Build Coastguard Worker {
840*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, i, internal_format, size, size, 0, format, GL_FLOAT, 0);
841*35238bceSAndroid Build Coastguard Worker }
842*35238bceSAndroid Build Coastguard Worker }
843*35238bceSAndroid Build Coastguard Worker else
844*35238bceSAndroid Build Coastguard Worker {
845*35238bceSAndroid Build Coastguard Worker glTexImage2D(target, 0, internal_format, size, size, 0, format, GL_FLOAT, 0);
846*35238bceSAndroid Build Coastguard Worker }
847*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> pixels(csize * csize, Vec4(1.0));
848*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, 0, 0, 0, csize, csize, format, GL_FLOAT, &pixels[0]);
849*35238bceSAndroid Build Coastguard Worker
850*35238bceSAndroid Build Coastguard Worker if (!rect && format != GL_DEPTH_COMPONENT)
851*35238bceSAndroid Build Coastguard Worker {
852*35238bceSAndroid Build Coastguard Worker glGenerateMipmap(target);
853*35238bceSAndroid Build Coastguard Worker }
854*35238bceSAndroid Build Coastguard Worker
855*35238bceSAndroid Build Coastguard Worker Vec4 data[4] = {Vec4(12. / 16, 13. / 16, 14. / 16, 15. / 16), Vec4(8. / 16, 9. / 16, 10. / 16, 11. / 16),
856*35238bceSAndroid Build Coastguard Worker Vec4(0. / 16, 1. / 16, 2. / 16, 3. / 16), Vec4(4. / 16, 5. / 16, 6. / 16, 7. / 16)};
857*35238bceSAndroid Build Coastguard Worker
858*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 22, 25, 2, 2, format, GL_FLOAT, data);
859*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 16, 10, 1, 1, format, GL_FLOAT, data + 0);
860*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 11, 2, 1, 1, format, GL_FLOAT, data + 1);
861*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 24, 13, 1, 1, format, GL_FLOAT, data + 2);
862*35238bceSAndroid Build Coastguard Worker glTexSubImage2D(target, base_level, 9, 14, 1, 1, format, GL_FLOAT, data + 3);
863*35238bceSAndroid Build Coastguard Worker
864*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
865*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
866*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
867*35238bceSAndroid Build Coastguard Worker
868*35238bceSAndroid Build Coastguard Worker if (base_level)
869*35238bceSAndroid Build Coastguard Worker glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, 1);
870*35238bceSAndroid Build Coastguard Worker }
871*35238bceSAndroid Build Coastguard Worker
FallthroughVertexShader()872*35238bceSAndroid Build Coastguard Worker virtual std::string FallthroughVertexShader()
873*35238bceSAndroid Build Coastguard Worker {
874*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
875*35238bceSAndroid Build Coastguard Worker "in vec4 v_in_0; \n"
876*35238bceSAndroid Build Coastguard Worker "flat out vec4 v_out_0; \n"
877*35238bceSAndroid Build Coastguard Worker "void main() { \n"
878*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0,0,0,1); \n"
879*35238bceSAndroid Build Coastguard Worker " v_out_0 = v_in_0; \n"
880*35238bceSAndroid Build Coastguard Worker "}";
881*35238bceSAndroid Build Coastguard Worker }
882*35238bceSAndroid Build Coastguard Worker
FallthroughFragmentShader()883*35238bceSAndroid Build Coastguard Worker virtual std::string FallthroughFragmentShader()
884*35238bceSAndroid Build Coastguard Worker {
885*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
886*35238bceSAndroid Build Coastguard Worker "out " +
887*35238bceSAndroid Build Coastguard Worker Type() +
888*35238bceSAndroid Build Coastguard Worker " f_out_0; \n"
889*35238bceSAndroid Build Coastguard Worker "flat in " +
890*35238bceSAndroid Build Coastguard Worker Type() +
891*35238bceSAndroid Build Coastguard Worker " v_out_0; \n"
892*35238bceSAndroid Build Coastguard Worker "void main() { \n"
893*35238bceSAndroid Build Coastguard Worker " f_out_0 = v_out_0; \n"
894*35238bceSAndroid Build Coastguard Worker "}";
895*35238bceSAndroid Build Coastguard Worker }
896*35238bceSAndroid Build Coastguard Worker
TestFunction()897*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
898*35238bceSAndroid Build Coastguard Worker {
899*35238bceSAndroid Build Coastguard Worker return Sampler() + TextBody();
900*35238bceSAndroid Build Coastguard Worker }
901*35238bceSAndroid Build Coastguard Worker
Type()902*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
903*35238bceSAndroid Build Coastguard Worker {
904*35238bceSAndroid Build Coastguard Worker return "vec4";
905*35238bceSAndroid Build Coastguard Worker }
906*35238bceSAndroid Build Coastguard Worker
Sampler()907*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
908*35238bceSAndroid Build Coastguard Worker {
909*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n";
910*35238bceSAndroid Build Coastguard Worker }
911*35238bceSAndroid Build Coastguard Worker
TextBody()912*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
913*35238bceSAndroid Build Coastguard Worker {
914*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
915*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y)); \n"
916*35238bceSAndroid Build Coastguard Worker "}\n";
917*35238bceSAndroid Build Coastguard Worker }
918*35238bceSAndroid Build Coastguard Worker
VertexShader()919*35238bceSAndroid Build Coastguard Worker virtual std::string VertexShader()
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
922*35238bceSAndroid Build Coastguard Worker "#extension GL_ARB_texture_cube_map_array : enable \n"
923*35238bceSAndroid Build Coastguard Worker ""
924*35238bceSAndroid Build Coastguard Worker "in vec4 v_in_0; \n"
925*35238bceSAndroid Build Coastguard Worker "flat out " +
926*35238bceSAndroid Build Coastguard Worker Type() + " v_out_0; \n" + TestFunction() +
927*35238bceSAndroid Build Coastguard Worker "void main() { \n"
928*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0,0,0,1); \n"
929*35238bceSAndroid Build Coastguard Worker " v_out_0 = test_function(v_in_0); \n"
930*35238bceSAndroid Build Coastguard Worker "}";
931*35238bceSAndroid Build Coastguard Worker }
932*35238bceSAndroid Build Coastguard Worker
FragmentShader()933*35238bceSAndroid Build Coastguard Worker virtual std::string FragmentShader()
934*35238bceSAndroid Build Coastguard Worker {
935*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
936*35238bceSAndroid Build Coastguard Worker "#extension GL_ARB_texture_cube_map_array : enable \n"
937*35238bceSAndroid Build Coastguard Worker ""
938*35238bceSAndroid Build Coastguard Worker "flat in vec4 v_out_0; \n"
939*35238bceSAndroid Build Coastguard Worker "out " +
940*35238bceSAndroid Build Coastguard Worker Type() + " f_out_0; \n" + TestFunction() +
941*35238bceSAndroid Build Coastguard Worker "void main() { \n"
942*35238bceSAndroid Build Coastguard Worker " f_out_0 = test_function(v_out_0); \n"
943*35238bceSAndroid Build Coastguard Worker "}";
944*35238bceSAndroid Build Coastguard Worker }
945*35238bceSAndroid Build Coastguard Worker
ComputeShader()946*35238bceSAndroid Build Coastguard Worker virtual std::string ComputeShader()
947*35238bceSAndroid Build Coastguard Worker {
948*35238bceSAndroid Build Coastguard Worker return "#version 420 core \n"
949*35238bceSAndroid Build Coastguard Worker "#extension GL_ARB_shader_storage_buffer_object : require \n"
950*35238bceSAndroid Build Coastguard Worker "#extension GL_ARB_compute_shader : require \n"
951*35238bceSAndroid Build Coastguard Worker "#extension GL_ARB_texture_cube_map_array : enable \n"
952*35238bceSAndroid Build Coastguard Worker "layout(local_size_x = 1, local_size_y = 1) in; \n"
953*35238bceSAndroid Build Coastguard Worker "layout(std430) buffer Output { \n"
954*35238bceSAndroid Build Coastguard Worker " " +
955*35238bceSAndroid Build Coastguard Worker Type() +
956*35238bceSAndroid Build Coastguard Worker " data; \n"
957*35238bceSAndroid Build Coastguard Worker "} g_out; \n"
958*35238bceSAndroid Build Coastguard Worker "uniform vec4 cs_in; \n" +
959*35238bceSAndroid Build Coastguard Worker TestFunction() +
960*35238bceSAndroid Build Coastguard Worker "void main() { \n"
961*35238bceSAndroid Build Coastguard Worker " g_out.data = test_function(cs_in); \n"
962*35238bceSAndroid Build Coastguard Worker "} \n";
963*35238bceSAndroid Build Coastguard Worker }
964*35238bceSAndroid Build Coastguard Worker
Init()965*35238bceSAndroid Build Coastguard Worker virtual void Init()
966*35238bceSAndroid Build Coastguard Worker {
967*35238bceSAndroid Build Coastguard Worker CreateTexture2D();
968*35238bceSAndroid Build Coastguard Worker }
969*35238bceSAndroid Build Coastguard Worker
SetRbo()970*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
971*35238bceSAndroid Build Coastguard Worker {
972*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
973*35238bceSAndroid Build Coastguard Worker }
974*35238bceSAndroid Build Coastguard Worker
Verify()975*35238bceSAndroid Build Coastguard Worker virtual long Verify()
976*35238bceSAndroid Build Coastguard Worker {
977*35238bceSAndroid Build Coastguard Worker Vec4 data;
978*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &data);
979*35238bceSAndroid Build Coastguard Worker if (!ColorEqual(data, Expected(), g_color_eps))
980*35238bceSAndroid Build Coastguard Worker {
981*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
982*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
983*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data.x() << ", " << data.y() << ", "
984*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << ", epsilon: " << g_color_eps.x() << ", " << g_color_eps.y() << ", "
985*35238bceSAndroid Build Coastguard Worker << g_color_eps.z() << ", " << g_color_eps.w() << tcu::TestLog::EndMessage;
986*35238bceSAndroid Build Coastguard Worker return ERROR;
987*35238bceSAndroid Build Coastguard Worker }
988*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
989*35238bceSAndroid Build Coastguard Worker }
990*35238bceSAndroid Build Coastguard Worker
Expected()991*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
992*35238bceSAndroid Build Coastguard Worker {
993*35238bceSAndroid Build Coastguard Worker return Vec4(0. / 16, 4. / 16, 8. / 16, 12. / 16);
994*35238bceSAndroid Build Coastguard Worker }
995*35238bceSAndroid Build Coastguard Worker
InternalFormat()996*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
997*35238bceSAndroid Build Coastguard Worker {
998*35238bceSAndroid Build Coastguard Worker return GL_RGBA32F;
999*35238bceSAndroid Build Coastguard Worker }
1000*35238bceSAndroid Build Coastguard Worker
Format()1001*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
1002*35238bceSAndroid Build Coastguard Worker {
1003*35238bceSAndroid Build Coastguard Worker return GL_RGBA;
1004*35238bceSAndroid Build Coastguard Worker }
1005*35238bceSAndroid Build Coastguard Worker
BufferData()1006*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1007*35238bceSAndroid Build Coastguard Worker {
1008*35238bceSAndroid Build Coastguard Worker return Vec4(23. / 32, 26. / 32, 5, 3);
1009*35238bceSAndroid Build Coastguard Worker }
1010*35238bceSAndroid Build Coastguard Worker
Supported()1011*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
1012*35238bceSAndroid Build Coastguard Worker {
1013*35238bceSAndroid Build Coastguard Worker return true;
1014*35238bceSAndroid Build Coastguard Worker }
1015*35238bceSAndroid Build Coastguard Worker
Run()1016*35238bceSAndroid Build Coastguard Worker virtual long Run()
1017*35238bceSAndroid Build Coastguard Worker {
1018*35238bceSAndroid Build Coastguard Worker
1019*35238bceSAndroid Build Coastguard Worker if (!Supported())
1020*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1021*35238bceSAndroid Build Coastguard Worker Init();
1022*35238bceSAndroid Build Coastguard Worker
1023*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
1024*35238bceSAndroid Build Coastguard Worker glGenRenderbuffers(1, &rbo);
1025*35238bceSAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1026*35238bceSAndroid Build Coastguard Worker SetRbo();
1027*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1028*35238bceSAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1029*35238bceSAndroid Build Coastguard Worker GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
1030*35238bceSAndroid Build Coastguard Worker glDrawBuffers(1, &drawBuffer);
1031*35238bceSAndroid Build Coastguard Worker GLfloat colorf[4] = {0, 0, 0, 0};
1032*35238bceSAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, colorf);
1033*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, 1, 1);
1034*35238bceSAndroid Build Coastguard Worker
1035*35238bceSAndroid Build Coastguard Worker glGenVertexArrays(1, &vao);
1036*35238bceSAndroid Build Coastguard Worker glBindVertexArray(vao);
1037*35238bceSAndroid Build Coastguard Worker glGenBuffers(1, &vbo);
1038*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vbo);
1039*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
1040*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
1041*35238bceSAndroid Build Coastguard Worker Vec4 buffData = BufferData();
1042*35238bceSAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, 16, &buffData, GL_STATIC_DRAW);
1043*35238bceSAndroid Build Coastguard Worker
1044*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i)
1045*35238bceSAndroid Build Coastguard Worker {
1046*35238bceSAndroid Build Coastguard Worker if (i == 0)
1047*35238bceSAndroid Build Coastguard Worker program = CreateProgram(VertexShader().c_str(), NULL, NULL, NULL, FallthroughFragmentShader().c_str());
1048*35238bceSAndroid Build Coastguard Worker else
1049*35238bceSAndroid Build Coastguard Worker program = CreateProgram(FallthroughVertexShader().c_str(), NULL, NULL, NULL, FragmentShader().c_str());
1050*35238bceSAndroid Build Coastguard Worker glBindAttribLocation(program, 0, "v_in_0");
1051*35238bceSAndroid Build Coastguard Worker glBindFragDataLocation(program, 0, "f_out_0");
1052*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
1053*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
1054*35238bceSAndroid Build Coastguard Worker return ERROR;
1055*35238bceSAndroid Build Coastguard Worker glUseProgram(program);
1056*35238bceSAndroid Build Coastguard Worker
1057*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
1058*35238bceSAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
1059*35238bceSAndroid Build Coastguard Worker
1060*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
1061*35238bceSAndroid Build Coastguard Worker
1062*35238bceSAndroid Build Coastguard Worker if (Verify() == ERROR)
1063*35238bceSAndroid Build Coastguard Worker return ERROR;
1064*35238bceSAndroid Build Coastguard Worker }
1065*35238bceSAndroid Build Coastguard Worker
1066*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_compute_shader"))
1067*35238bceSAndroid Build Coastguard Worker {
1068*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1069*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected "
1070*35238bceSAndroid Build Coastguard Worker << "GL_ARB_compute_shader or GL_ARB_compute_shader not supported, skipping compute stage"
1071*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
1072*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1073*35238bceSAndroid Build Coastguard Worker }
1074*35238bceSAndroid Build Coastguard Worker else
1075*35238bceSAndroid Build Coastguard Worker {
1076*35238bceSAndroid Build Coastguard Worker return TestCompute();
1077*35238bceSAndroid Build Coastguard Worker }
1078*35238bceSAndroid Build Coastguard Worker }
1079*35238bceSAndroid Build Coastguard Worker
TestCompute()1080*35238bceSAndroid Build Coastguard Worker virtual long TestCompute()
1081*35238bceSAndroid Build Coastguard Worker {
1082*35238bceSAndroid Build Coastguard Worker GLuint m_buffer;
1083*35238bceSAndroid Build Coastguard Worker
1084*35238bceSAndroid Build Coastguard Worker program = CreateComputeProgram(ComputeShader());
1085*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
1086*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
1087*35238bceSAndroid Build Coastguard Worker return ERROR;
1088*35238bceSAndroid Build Coastguard Worker glUseProgram(program);
1089*35238bceSAndroid Build Coastguard Worker
1090*35238bceSAndroid Build Coastguard Worker glUniform4f(glGetUniformLocation(program, "cs_in"), BufferData().x(), BufferData().y(), BufferData().z(),
1091*35238bceSAndroid Build Coastguard Worker BufferData().w());
1092*35238bceSAndroid Build Coastguard Worker
1093*35238bceSAndroid Build Coastguard Worker glGenBuffers(1, &m_buffer);
1094*35238bceSAndroid Build Coastguard Worker glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
1095*35238bceSAndroid Build Coastguard Worker glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Vec4), NULL, GL_DYNAMIC_DRAW);
1096*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
1097*35238bceSAndroid Build Coastguard Worker
1098*35238bceSAndroid Build Coastguard Worker glDispatchCompute(1, 1, 1);
1099*35238bceSAndroid Build Coastguard Worker
1100*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_buffer);
1101*35238bceSAndroid Build Coastguard Worker glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
1102*35238bceSAndroid Build Coastguard Worker long error = VerifyCompute();
1103*35238bceSAndroid Build Coastguard Worker glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
1104*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
1105*35238bceSAndroid Build Coastguard Worker glDeleteBuffers(1, &m_buffer);
1106*35238bceSAndroid Build Coastguard Worker
1107*35238bceSAndroid Build Coastguard Worker return error;
1108*35238bceSAndroid Build Coastguard Worker }
1109*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1110*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1111*35238bceSAndroid Build Coastguard Worker {
1112*35238bceSAndroid Build Coastguard Worker Vec4 *data;
1113*35238bceSAndroid Build Coastguard Worker data = static_cast<Vec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(Vec4), GL_MAP_READ_BIT));
1114*35238bceSAndroid Build Coastguard Worker if (!ColorEqual(data[0], Expected(), g_color_eps))
1115*35238bceSAndroid Build Coastguard Worker { // for unorms
1116*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1117*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1118*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << " got: " << data[0].x() << ", " << data[0].y() << ", "
1119*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1120*35238bceSAndroid Build Coastguard Worker return ERROR;
1121*35238bceSAndroid Build Coastguard Worker }
1122*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1123*35238bceSAndroid Build Coastguard Worker }
1124*35238bceSAndroid Build Coastguard Worker
Cleanup()1125*35238bceSAndroid Build Coastguard Worker virtual long Cleanup()
1126*35238bceSAndroid Build Coastguard Worker {
1127*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, GetWindowWidth(), GetWindowHeight());
1128*35238bceSAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
1129*35238bceSAndroid Build Coastguard Worker glDeleteTextures(1, &tex);
1130*35238bceSAndroid Build Coastguard Worker glDeleteVertexArrays(1, &vao);
1131*35238bceSAndroid Build Coastguard Worker glDeleteBuffers(1, &vbo);
1132*35238bceSAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &rbo);
1133*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
1134*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
1135*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1136*35238bceSAndroid Build Coastguard Worker }
1137*35238bceSAndroid Build Coastguard Worker };
1138*35238bceSAndroid Build Coastguard Worker
1139*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DRgba : public GatherBase
1140*35238bceSAndroid Build Coastguard Worker {
1141*35238bceSAndroid Build Coastguard Worker };
1142*35238bceSAndroid Build Coastguard Worker
1143*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DRg : public GatherBase
1144*35238bceSAndroid Build Coastguard Worker {
1145*35238bceSAndroid Build Coastguard Worker public:
TestFunction()1146*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
1147*35238bceSAndroid Build Coastguard Worker {
1148*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
1149*35238bceSAndroid Build Coastguard Worker ""
1150*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
1151*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 1); \n"
1152*35238bceSAndroid Build Coastguard Worker "}\n";
1153*35238bceSAndroid Build Coastguard Worker }
1154*35238bceSAndroid Build Coastguard Worker
Expected()1155*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker return Vec4(1. / 16, 5. / 16, 9. / 16, 13. / 16);
1158*35238bceSAndroid Build Coastguard Worker }
1159*35238bceSAndroid Build Coastguard Worker
InternalFormat()1160*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1161*35238bceSAndroid Build Coastguard Worker {
1162*35238bceSAndroid Build Coastguard Worker return GL_RG32F;
1163*35238bceSAndroid Build Coastguard Worker }
1164*35238bceSAndroid Build Coastguard Worker };
1165*35238bceSAndroid Build Coastguard Worker
1166*35238bceSAndroid Build Coastguard Worker class PlainGatherUnorm2D : public GatherBase
1167*35238bceSAndroid Build Coastguard Worker {
1168*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1169*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1170*35238bceSAndroid Build Coastguard Worker {
1171*35238bceSAndroid Build Coastguard Worker return GL_RGBA16;
1172*35238bceSAndroid Build Coastguard Worker }
1173*35238bceSAndroid Build Coastguard Worker
TestFunction()1174*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
1175*35238bceSAndroid Build Coastguard Worker {
1176*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
1177*35238bceSAndroid Build Coastguard Worker ""
1178*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
1179*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 0); \n"
1180*35238bceSAndroid Build Coastguard Worker "}\n";
1181*35238bceSAndroid Build Coastguard Worker }
1182*35238bceSAndroid Build Coastguard Worker };
1183*35238bceSAndroid Build Coastguard Worker
1184*35238bceSAndroid Build Coastguard Worker class PlainGatherInt2DRgba : public GatherBase
1185*35238bceSAndroid Build Coastguard Worker {
1186*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1187*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1188*35238bceSAndroid Build Coastguard Worker {
1189*35238bceSAndroid Build Coastguard Worker return GL_RGBA32I;
1190*35238bceSAndroid Build Coastguard Worker }
1191*35238bceSAndroid Build Coastguard Worker
Init()1192*35238bceSAndroid Build Coastguard Worker virtual void Init()
1193*35238bceSAndroid Build Coastguard Worker {
1194*35238bceSAndroid Build Coastguard Worker CreateTexture2DInt();
1195*35238bceSAndroid Build Coastguard Worker }
1196*35238bceSAndroid Build Coastguard Worker
SetRbo()1197*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
1200*35238bceSAndroid Build Coastguard Worker }
1201*35238bceSAndroid Build Coastguard Worker
Verify()1202*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1203*35238bceSAndroid Build Coastguard Worker {
1204*35238bceSAndroid Build Coastguard Worker IVec4 data;
1205*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
1206*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
1207*35238bceSAndroid Build Coastguard Worker {
1208*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1209*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
1210*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1211*35238bceSAndroid Build Coastguard Worker return ERROR;
1212*35238bceSAndroid Build Coastguard Worker }
1213*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1214*35238bceSAndroid Build Coastguard Worker }
1215*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1216*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1217*35238bceSAndroid Build Coastguard Worker {
1218*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1219*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1220*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
1221*35238bceSAndroid Build Coastguard Worker {
1222*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1223*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1224*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1225*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1226*35238bceSAndroid Build Coastguard Worker return ERROR;
1227*35238bceSAndroid Build Coastguard Worker }
1228*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1229*35238bceSAndroid Build Coastguard Worker }
1230*35238bceSAndroid Build Coastguard Worker
Sampler()1231*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1232*35238bceSAndroid Build Coastguard Worker {
1233*35238bceSAndroid Build Coastguard Worker return "uniform isampler2D my_sampler; \n";
1234*35238bceSAndroid Build Coastguard Worker }
1235*35238bceSAndroid Build Coastguard Worker
Type()1236*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1237*35238bceSAndroid Build Coastguard Worker {
1238*35238bceSAndroid Build Coastguard Worker return "ivec4";
1239*35238bceSAndroid Build Coastguard Worker }
1240*35238bceSAndroid Build Coastguard Worker };
1241*35238bceSAndroid Build Coastguard Worker
1242*35238bceSAndroid Build Coastguard Worker class PlainGatherInt2DRg : public PlainGatherInt2DRgba
1243*35238bceSAndroid Build Coastguard Worker {
1244*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1245*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1246*35238bceSAndroid Build Coastguard Worker {
1247*35238bceSAndroid Build Coastguard Worker return GL_RG32I;
1248*35238bceSAndroid Build Coastguard Worker }
1249*35238bceSAndroid Build Coastguard Worker };
1250*35238bceSAndroid Build Coastguard Worker
1251*35238bceSAndroid Build Coastguard Worker class PlainGatherUint2D : public GatherBase
1252*35238bceSAndroid Build Coastguard Worker {
1253*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1254*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1255*35238bceSAndroid Build Coastguard Worker {
1256*35238bceSAndroid Build Coastguard Worker return GL_RGBA32UI;
1257*35238bceSAndroid Build Coastguard Worker }
1258*35238bceSAndroid Build Coastguard Worker
Init()1259*35238bceSAndroid Build Coastguard Worker virtual void Init()
1260*35238bceSAndroid Build Coastguard Worker {
1261*35238bceSAndroid Build Coastguard Worker CreateTexture2DInt();
1262*35238bceSAndroid Build Coastguard Worker }
1263*35238bceSAndroid Build Coastguard Worker
SetRbo()1264*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1265*35238bceSAndroid Build Coastguard Worker {
1266*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32UI, 1, 1);
1267*35238bceSAndroid Build Coastguard Worker }
1268*35238bceSAndroid Build Coastguard Worker
Verify()1269*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1270*35238bceSAndroid Build Coastguard Worker {
1271*35238bceSAndroid Build Coastguard Worker IVec4 data;
1272*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data);
1273*35238bceSAndroid Build Coastguard Worker if (data != IVec4(2, 6, 10, 14))
1274*35238bceSAndroid Build Coastguard Worker {
1275*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1276*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 2, 6, 10, 14, got: " << data.x() << ", " << data.y() << ", "
1277*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1278*35238bceSAndroid Build Coastguard Worker return ERROR;
1279*35238bceSAndroid Build Coastguard Worker }
1280*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1281*35238bceSAndroid Build Coastguard Worker }
1282*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1283*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1284*35238bceSAndroid Build Coastguard Worker {
1285*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1286*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1287*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(2, 6, 10, 14))
1288*35238bceSAndroid Build Coastguard Worker {
1289*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1290*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1291*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1292*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1293*35238bceSAndroid Build Coastguard Worker return ERROR;
1294*35238bceSAndroid Build Coastguard Worker }
1295*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1296*35238bceSAndroid Build Coastguard Worker }
1297*35238bceSAndroid Build Coastguard Worker
Sampler()1298*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1299*35238bceSAndroid Build Coastguard Worker {
1300*35238bceSAndroid Build Coastguard Worker return "uniform usampler2D my_sampler; \n";
1301*35238bceSAndroid Build Coastguard Worker }
1302*35238bceSAndroid Build Coastguard Worker
BufferData()1303*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1304*35238bceSAndroid Build Coastguard Worker {
1305*35238bceSAndroid Build Coastguard Worker return Vec4(22.9f / 32, 25.9f / 32, 2, 2);
1306*35238bceSAndroid Build Coastguard Worker }
1307*35238bceSAndroid Build Coastguard Worker
Type()1308*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1309*35238bceSAndroid Build Coastguard Worker {
1310*35238bceSAndroid Build Coastguard Worker return "uvec4";
1311*35238bceSAndroid Build Coastguard Worker }
1312*35238bceSAndroid Build Coastguard Worker
TextBody()1313*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1314*35238bceSAndroid Build Coastguard Worker {
1315*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1316*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 2); \n"
1317*35238bceSAndroid Build Coastguard Worker "}\n";
1318*35238bceSAndroid Build Coastguard Worker }
1319*35238bceSAndroid Build Coastguard Worker };
1320*35238bceSAndroid Build Coastguard Worker
1321*35238bceSAndroid Build Coastguard Worker class PlainGatherDepth2D : public GatherBase
1322*35238bceSAndroid Build Coastguard Worker {
1323*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1324*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1325*35238bceSAndroid Build Coastguard Worker {
1326*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT32F;
1327*35238bceSAndroid Build Coastguard Worker }
1328*35238bceSAndroid Build Coastguard Worker
Format()1329*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
1330*35238bceSAndroid Build Coastguard Worker {
1331*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT;
1332*35238bceSAndroid Build Coastguard Worker }
1333*35238bceSAndroid Build Coastguard Worker
Init()1334*35238bceSAndroid Build Coastguard Worker virtual void Init()
1335*35238bceSAndroid Build Coastguard Worker {
1336*35238bceSAndroid Build Coastguard Worker CreateTexture2D();
1337*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1338*35238bceSAndroid Build Coastguard Worker }
1339*35238bceSAndroid Build Coastguard Worker
Expected()1340*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
1341*35238bceSAndroid Build Coastguard Worker {
1342*35238bceSAndroid Build Coastguard Worker return Vec4(1, 1, 0, 0);
1343*35238bceSAndroid Build Coastguard Worker }
1344*35238bceSAndroid Build Coastguard Worker
BufferData()1345*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1346*35238bceSAndroid Build Coastguard Worker {
1347*35238bceSAndroid Build Coastguard Worker return Vec4(23. / 32, 26. / 32, 13.5 / 16, 3);
1348*35238bceSAndroid Build Coastguard Worker }
1349*35238bceSAndroid Build Coastguard Worker
Sampler()1350*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1351*35238bceSAndroid Build Coastguard Worker {
1352*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DShadow my_sampler; \n";
1353*35238bceSAndroid Build Coastguard Worker }
1354*35238bceSAndroid Build Coastguard Worker
TextBody()1355*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1356*35238bceSAndroid Build Coastguard Worker {
1357*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1358*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), p.z); \n"
1359*35238bceSAndroid Build Coastguard Worker "}\n";
1360*35238bceSAndroid Build Coastguard Worker }
1361*35238bceSAndroid Build Coastguard Worker };
1362*35238bceSAndroid Build Coastguard Worker
1363*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DArray : public GatherBase
1364*35238bceSAndroid Build Coastguard Worker {
1365*35238bceSAndroid Build Coastguard Worker public:
Init()1366*35238bceSAndroid Build Coastguard Worker virtual void Init()
1367*35238bceSAndroid Build Coastguard Worker {
1368*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(9, 5);
1369*35238bceSAndroid Build Coastguard Worker }
1370*35238bceSAndroid Build Coastguard Worker
Sampler()1371*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1372*35238bceSAndroid Build Coastguard Worker {
1373*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DArray my_sampler; \n";
1374*35238bceSAndroid Build Coastguard Worker }
1375*35238bceSAndroid Build Coastguard Worker
TextBody()1376*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1377*35238bceSAndroid Build Coastguard Worker {
1378*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1379*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z)); \n"
1380*35238bceSAndroid Build Coastguard Worker "}\n";
1381*35238bceSAndroid Build Coastguard Worker }
1382*35238bceSAndroid Build Coastguard Worker };
1383*35238bceSAndroid Build Coastguard Worker
1384*35238bceSAndroid Build Coastguard Worker class PlainGatherUnorm2DArray : public GatherBase
1385*35238bceSAndroid Build Coastguard Worker {
1386*35238bceSAndroid Build Coastguard Worker public:
Init()1387*35238bceSAndroid Build Coastguard Worker virtual void Init()
1388*35238bceSAndroid Build Coastguard Worker {
1389*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(7, 3);
1390*35238bceSAndroid Build Coastguard Worker }
1391*35238bceSAndroid Build Coastguard Worker
Sampler()1392*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1393*35238bceSAndroid Build Coastguard Worker {
1394*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DArray my_sampler; \n";
1395*35238bceSAndroid Build Coastguard Worker }
1396*35238bceSAndroid Build Coastguard Worker
TextBody()1397*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1398*35238bceSAndroid Build Coastguard Worker {
1399*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1400*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.w)); \n"
1401*35238bceSAndroid Build Coastguard Worker "}\n";
1402*35238bceSAndroid Build Coastguard Worker }
1403*35238bceSAndroid Build Coastguard Worker
InternalFormat()1404*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1405*35238bceSAndroid Build Coastguard Worker {
1406*35238bceSAndroid Build Coastguard Worker return GL_RGBA16;
1407*35238bceSAndroid Build Coastguard Worker }
1408*35238bceSAndroid Build Coastguard Worker };
1409*35238bceSAndroid Build Coastguard Worker
1410*35238bceSAndroid Build Coastguard Worker class PlainGatherInt2DArray : public GatherBase
1411*35238bceSAndroid Build Coastguard Worker {
1412*35238bceSAndroid Build Coastguard Worker public:
Init()1413*35238bceSAndroid Build Coastguard Worker virtual void Init()
1414*35238bceSAndroid Build Coastguard Worker {
1415*35238bceSAndroid Build Coastguard Worker CreateTexture2DArrayInt(20, 11);
1416*35238bceSAndroid Build Coastguard Worker }
1417*35238bceSAndroid Build Coastguard Worker
InternalFormat()1418*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1419*35238bceSAndroid Build Coastguard Worker {
1420*35238bceSAndroid Build Coastguard Worker return GL_RGBA32I;
1421*35238bceSAndroid Build Coastguard Worker }
1422*35238bceSAndroid Build Coastguard Worker
SetRbo()1423*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1424*35238bceSAndroid Build Coastguard Worker {
1425*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
1426*35238bceSAndroid Build Coastguard Worker }
1427*35238bceSAndroid Build Coastguard Worker
Verify()1428*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1429*35238bceSAndroid Build Coastguard Worker {
1430*35238bceSAndroid Build Coastguard Worker IVec4 data;
1431*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
1432*35238bceSAndroid Build Coastguard Worker if (data != IVec4(3, 7, 11, 15))
1433*35238bceSAndroid Build Coastguard Worker {
1434*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1435*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 3, 7, 11, 15, got: " << data.x() << ", " << data.y() << ", "
1436*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1437*35238bceSAndroid Build Coastguard Worker return ERROR;
1438*35238bceSAndroid Build Coastguard Worker }
1439*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1440*35238bceSAndroid Build Coastguard Worker }
1441*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1442*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1443*35238bceSAndroid Build Coastguard Worker {
1444*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1445*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1446*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(3, 7, 11, 15))
1447*35238bceSAndroid Build Coastguard Worker {
1448*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1449*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1450*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1451*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1452*35238bceSAndroid Build Coastguard Worker return ERROR;
1453*35238bceSAndroid Build Coastguard Worker }
1454*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1455*35238bceSAndroid Build Coastguard Worker }
1456*35238bceSAndroid Build Coastguard Worker
Type()1457*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1458*35238bceSAndroid Build Coastguard Worker {
1459*35238bceSAndroid Build Coastguard Worker return "ivec4";
1460*35238bceSAndroid Build Coastguard Worker }
1461*35238bceSAndroid Build Coastguard Worker
BufferData()1462*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1463*35238bceSAndroid Build Coastguard Worker {
1464*35238bceSAndroid Build Coastguard Worker return Vec4(23. / 32, 26. / 32, 11, 3);
1465*35238bceSAndroid Build Coastguard Worker }
1466*35238bceSAndroid Build Coastguard Worker
Sampler()1467*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1468*35238bceSAndroid Build Coastguard Worker {
1469*35238bceSAndroid Build Coastguard Worker return "uniform isampler2DArray my_sampler; \n";
1470*35238bceSAndroid Build Coastguard Worker }
1471*35238bceSAndroid Build Coastguard Worker
TextBody()1472*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1473*35238bceSAndroid Build Coastguard Worker {
1474*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1475*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), 3); \n"
1476*35238bceSAndroid Build Coastguard Worker "}\n";
1477*35238bceSAndroid Build Coastguard Worker }
1478*35238bceSAndroid Build Coastguard Worker };
1479*35238bceSAndroid Build Coastguard Worker
1480*35238bceSAndroid Build Coastguard Worker class PlainGatherUint2DArray : public GatherBase
1481*35238bceSAndroid Build Coastguard Worker {
1482*35238bceSAndroid Build Coastguard Worker public:
Init()1483*35238bceSAndroid Build Coastguard Worker virtual void Init()
1484*35238bceSAndroid Build Coastguard Worker {
1485*35238bceSAndroid Build Coastguard Worker CreateTexture2DArrayInt(3, 1);
1486*35238bceSAndroid Build Coastguard Worker }
1487*35238bceSAndroid Build Coastguard Worker
InternalFormat()1488*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1489*35238bceSAndroid Build Coastguard Worker {
1490*35238bceSAndroid Build Coastguard Worker return GL_RGBA32UI;
1491*35238bceSAndroid Build Coastguard Worker }
1492*35238bceSAndroid Build Coastguard Worker
SetRbo()1493*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1494*35238bceSAndroid Build Coastguard Worker {
1495*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32UI, 1, 1);
1496*35238bceSAndroid Build Coastguard Worker }
1497*35238bceSAndroid Build Coastguard Worker
Verify()1498*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1499*35238bceSAndroid Build Coastguard Worker {
1500*35238bceSAndroid Build Coastguard Worker IVec4 data;
1501*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data);
1502*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
1503*35238bceSAndroid Build Coastguard Worker {
1504*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1505*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
1506*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1507*35238bceSAndroid Build Coastguard Worker return ERROR;
1508*35238bceSAndroid Build Coastguard Worker }
1509*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1510*35238bceSAndroid Build Coastguard Worker }
1511*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1512*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1513*35238bceSAndroid Build Coastguard Worker {
1514*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1515*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1516*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
1517*35238bceSAndroid Build Coastguard Worker {
1518*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1519*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1520*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1521*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1522*35238bceSAndroid Build Coastguard Worker return ERROR;
1523*35238bceSAndroid Build Coastguard Worker }
1524*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1525*35238bceSAndroid Build Coastguard Worker }
1526*35238bceSAndroid Build Coastguard Worker
Type()1527*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1528*35238bceSAndroid Build Coastguard Worker {
1529*35238bceSAndroid Build Coastguard Worker return "uvec4";
1530*35238bceSAndroid Build Coastguard Worker }
1531*35238bceSAndroid Build Coastguard Worker
BufferData()1532*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1533*35238bceSAndroid Build Coastguard Worker {
1534*35238bceSAndroid Build Coastguard Worker return Vec4(23. / 32, 26. / 32, 1, 3);
1535*35238bceSAndroid Build Coastguard Worker }
1536*35238bceSAndroid Build Coastguard Worker
Sampler()1537*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1538*35238bceSAndroid Build Coastguard Worker {
1539*35238bceSAndroid Build Coastguard Worker return "uniform usampler2DArray my_sampler; \n";
1540*35238bceSAndroid Build Coastguard Worker }
1541*35238bceSAndroid Build Coastguard Worker
TextBody()1542*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1543*35238bceSAndroid Build Coastguard Worker {
1544*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1545*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z)); \n"
1546*35238bceSAndroid Build Coastguard Worker "}\n";
1547*35238bceSAndroid Build Coastguard Worker }
1548*35238bceSAndroid Build Coastguard Worker };
1549*35238bceSAndroid Build Coastguard Worker
1550*35238bceSAndroid Build Coastguard Worker class PlainGatherDepth2DArray : public GatherBase
1551*35238bceSAndroid Build Coastguard Worker {
1552*35238bceSAndroid Build Coastguard Worker public:
InternalFormat()1553*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1554*35238bceSAndroid Build Coastguard Worker {
1555*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT32F;
1556*35238bceSAndroid Build Coastguard Worker }
1557*35238bceSAndroid Build Coastguard Worker
Format()1558*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
1559*35238bceSAndroid Build Coastguard Worker {
1560*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT;
1561*35238bceSAndroid Build Coastguard Worker }
1562*35238bceSAndroid Build Coastguard Worker
Init()1563*35238bceSAndroid Build Coastguard Worker virtual void Init()
1564*35238bceSAndroid Build Coastguard Worker {
1565*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(9, 5);
1566*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1567*35238bceSAndroid Build Coastguard Worker }
1568*35238bceSAndroid Build Coastguard Worker
Expected()1569*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
1570*35238bceSAndroid Build Coastguard Worker {
1571*35238bceSAndroid Build Coastguard Worker return Vec4(1, 1, 0, 0);
1572*35238bceSAndroid Build Coastguard Worker }
1573*35238bceSAndroid Build Coastguard Worker
BufferData()1574*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1575*35238bceSAndroid Build Coastguard Worker {
1576*35238bceSAndroid Build Coastguard Worker return Vec4(23. / 32, 26. / 32, 5, 13.5 / 16);
1577*35238bceSAndroid Build Coastguard Worker }
1578*35238bceSAndroid Build Coastguard Worker
Sampler()1579*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1580*35238bceSAndroid Build Coastguard Worker {
1581*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DArrayShadow my_sampler; \n";
1582*35238bceSAndroid Build Coastguard Worker }
1583*35238bceSAndroid Build Coastguard Worker
TextBody()1584*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1585*35238bceSAndroid Build Coastguard Worker {
1586*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1587*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), p.w); \n"
1588*35238bceSAndroid Build Coastguard Worker "}\n";
1589*35238bceSAndroid Build Coastguard Worker }
1590*35238bceSAndroid Build Coastguard Worker };
1591*35238bceSAndroid Build Coastguard Worker
1592*35238bceSAndroid Build Coastguard Worker class PlainGatherFloatCubeRgba : public GatherBase
1593*35238bceSAndroid Build Coastguard Worker {
1594*35238bceSAndroid Build Coastguard Worker public:
Init()1595*35238bceSAndroid Build Coastguard Worker virtual void Init()
1596*35238bceSAndroid Build Coastguard Worker {
1597*35238bceSAndroid Build Coastguard Worker CreateTextureCube();
1598*35238bceSAndroid Build Coastguard Worker }
1599*35238bceSAndroid Build Coastguard Worker
BufferData()1600*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1601*35238bceSAndroid Build Coastguard Worker {
1602*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1603*35238bceSAndroid Build Coastguard Worker }
1604*35238bceSAndroid Build Coastguard Worker
Sampler()1605*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1606*35238bceSAndroid Build Coastguard Worker {
1607*35238bceSAndroid Build Coastguard Worker return "uniform samplerCube my_sampler; \n";
1608*35238bceSAndroid Build Coastguard Worker }
1609*35238bceSAndroid Build Coastguard Worker
TextBody()1610*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1611*35238bceSAndroid Build Coastguard Worker {
1612*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1613*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z)); \n"
1614*35238bceSAndroid Build Coastguard Worker "}\n";
1615*35238bceSAndroid Build Coastguard Worker }
1616*35238bceSAndroid Build Coastguard Worker };
1617*35238bceSAndroid Build Coastguard Worker
1618*35238bceSAndroid Build Coastguard Worker class PlainGatherFloatCubeRg : public GatherBase
1619*35238bceSAndroid Build Coastguard Worker {
1620*35238bceSAndroid Build Coastguard Worker public:
Init()1621*35238bceSAndroid Build Coastguard Worker virtual void Init()
1622*35238bceSAndroid Build Coastguard Worker {
1623*35238bceSAndroid Build Coastguard Worker CreateTextureCube();
1624*35238bceSAndroid Build Coastguard Worker }
1625*35238bceSAndroid Build Coastguard Worker
BufferData()1626*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1627*35238bceSAndroid Build Coastguard Worker {
1628*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1629*35238bceSAndroid Build Coastguard Worker }
1630*35238bceSAndroid Build Coastguard Worker
Sampler()1631*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1632*35238bceSAndroid Build Coastguard Worker {
1633*35238bceSAndroid Build Coastguard Worker return "uniform samplerCube my_sampler; \n";
1634*35238bceSAndroid Build Coastguard Worker }
1635*35238bceSAndroid Build Coastguard Worker
TextBody()1636*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1637*35238bceSAndroid Build Coastguard Worker {
1638*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1639*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), 1); \n"
1640*35238bceSAndroid Build Coastguard Worker "}\n";
1641*35238bceSAndroid Build Coastguard Worker }
1642*35238bceSAndroid Build Coastguard Worker
Expected()1643*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
1644*35238bceSAndroid Build Coastguard Worker {
1645*35238bceSAndroid Build Coastguard Worker return Vec4(1. / 16, 5. / 16, 9. / 16, 13. / 16);
1646*35238bceSAndroid Build Coastguard Worker }
1647*35238bceSAndroid Build Coastguard Worker
InternalFormat()1648*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1649*35238bceSAndroid Build Coastguard Worker {
1650*35238bceSAndroid Build Coastguard Worker return GL_RG32F;
1651*35238bceSAndroid Build Coastguard Worker }
1652*35238bceSAndroid Build Coastguard Worker };
1653*35238bceSAndroid Build Coastguard Worker
1654*35238bceSAndroid Build Coastguard Worker class PlainGatherUnormCube : public GatherBase
1655*35238bceSAndroid Build Coastguard Worker {
1656*35238bceSAndroid Build Coastguard Worker public:
Init()1657*35238bceSAndroid Build Coastguard Worker virtual void Init()
1658*35238bceSAndroid Build Coastguard Worker {
1659*35238bceSAndroid Build Coastguard Worker CreateTextureCube();
1660*35238bceSAndroid Build Coastguard Worker }
1661*35238bceSAndroid Build Coastguard Worker
BufferData()1662*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1663*35238bceSAndroid Build Coastguard Worker {
1664*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1665*35238bceSAndroid Build Coastguard Worker }
1666*35238bceSAndroid Build Coastguard Worker
Sampler()1667*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1668*35238bceSAndroid Build Coastguard Worker {
1669*35238bceSAndroid Build Coastguard Worker return "uniform samplerCube my_sampler; \n";
1670*35238bceSAndroid Build Coastguard Worker }
1671*35238bceSAndroid Build Coastguard Worker
TextBody()1672*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1673*35238bceSAndroid Build Coastguard Worker {
1674*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1675*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z)); \n"
1676*35238bceSAndroid Build Coastguard Worker "}\n";
1677*35238bceSAndroid Build Coastguard Worker }
1678*35238bceSAndroid Build Coastguard Worker
InternalFormat()1679*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1680*35238bceSAndroid Build Coastguard Worker {
1681*35238bceSAndroid Build Coastguard Worker return GL_RGBA16;
1682*35238bceSAndroid Build Coastguard Worker }
1683*35238bceSAndroid Build Coastguard Worker };
1684*35238bceSAndroid Build Coastguard Worker
1685*35238bceSAndroid Build Coastguard Worker class PlainGatherIntCubeRgba : public GatherBase
1686*35238bceSAndroid Build Coastguard Worker {
1687*35238bceSAndroid Build Coastguard Worker public:
Init()1688*35238bceSAndroid Build Coastguard Worker virtual void Init()
1689*35238bceSAndroid Build Coastguard Worker {
1690*35238bceSAndroid Build Coastguard Worker CreateTextureCubeInt();
1691*35238bceSAndroid Build Coastguard Worker }
1692*35238bceSAndroid Build Coastguard Worker
BufferData()1693*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1694*35238bceSAndroid Build Coastguard Worker {
1695*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1696*35238bceSAndroid Build Coastguard Worker }
1697*35238bceSAndroid Build Coastguard Worker
Sampler()1698*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1699*35238bceSAndroid Build Coastguard Worker {
1700*35238bceSAndroid Build Coastguard Worker return "uniform isamplerCube my_sampler; \n";
1701*35238bceSAndroid Build Coastguard Worker }
1702*35238bceSAndroid Build Coastguard Worker
TextBody()1703*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1704*35238bceSAndroid Build Coastguard Worker {
1705*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1706*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z)); \n"
1707*35238bceSAndroid Build Coastguard Worker "}\n";
1708*35238bceSAndroid Build Coastguard Worker }
1709*35238bceSAndroid Build Coastguard Worker
InternalFormat()1710*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1711*35238bceSAndroid Build Coastguard Worker {
1712*35238bceSAndroid Build Coastguard Worker return GL_RGBA32I;
1713*35238bceSAndroid Build Coastguard Worker }
1714*35238bceSAndroid Build Coastguard Worker
SetRbo()1715*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1716*35238bceSAndroid Build Coastguard Worker {
1717*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
1718*35238bceSAndroid Build Coastguard Worker }
1719*35238bceSAndroid Build Coastguard Worker
Verify()1720*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1721*35238bceSAndroid Build Coastguard Worker {
1722*35238bceSAndroid Build Coastguard Worker IVec4 data;
1723*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
1724*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
1725*35238bceSAndroid Build Coastguard Worker {
1726*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1727*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
1728*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1729*35238bceSAndroid Build Coastguard Worker return ERROR;
1730*35238bceSAndroid Build Coastguard Worker }
1731*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1732*35238bceSAndroid Build Coastguard Worker }
1733*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1734*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1735*35238bceSAndroid Build Coastguard Worker {
1736*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1737*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1738*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
1739*35238bceSAndroid Build Coastguard Worker {
1740*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1741*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1742*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1743*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1744*35238bceSAndroid Build Coastguard Worker return ERROR;
1745*35238bceSAndroid Build Coastguard Worker }
1746*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1747*35238bceSAndroid Build Coastguard Worker }
1748*35238bceSAndroid Build Coastguard Worker
Type()1749*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1750*35238bceSAndroid Build Coastguard Worker {
1751*35238bceSAndroid Build Coastguard Worker return "ivec4";
1752*35238bceSAndroid Build Coastguard Worker }
1753*35238bceSAndroid Build Coastguard Worker };
1754*35238bceSAndroid Build Coastguard Worker
1755*35238bceSAndroid Build Coastguard Worker class PlainGatherIntCubeRg : public GatherBase
1756*35238bceSAndroid Build Coastguard Worker {
1757*35238bceSAndroid Build Coastguard Worker public:
Init()1758*35238bceSAndroid Build Coastguard Worker virtual void Init()
1759*35238bceSAndroid Build Coastguard Worker {
1760*35238bceSAndroid Build Coastguard Worker CreateTextureCubeInt();
1761*35238bceSAndroid Build Coastguard Worker }
1762*35238bceSAndroid Build Coastguard Worker
BufferData()1763*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1764*35238bceSAndroid Build Coastguard Worker {
1765*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1766*35238bceSAndroid Build Coastguard Worker }
1767*35238bceSAndroid Build Coastguard Worker
Sampler()1768*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1769*35238bceSAndroid Build Coastguard Worker {
1770*35238bceSAndroid Build Coastguard Worker return "uniform isamplerCube my_sampler; \n";
1771*35238bceSAndroid Build Coastguard Worker }
1772*35238bceSAndroid Build Coastguard Worker
TextBody()1773*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1774*35238bceSAndroid Build Coastguard Worker {
1775*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1776*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), 1); \n"
1777*35238bceSAndroid Build Coastguard Worker "}\n";
1778*35238bceSAndroid Build Coastguard Worker }
1779*35238bceSAndroid Build Coastguard Worker
InternalFormat()1780*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1781*35238bceSAndroid Build Coastguard Worker {
1782*35238bceSAndroid Build Coastguard Worker return GL_RG32I;
1783*35238bceSAndroid Build Coastguard Worker }
1784*35238bceSAndroid Build Coastguard Worker
SetRbo()1785*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1786*35238bceSAndroid Build Coastguard Worker {
1787*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
1788*35238bceSAndroid Build Coastguard Worker }
1789*35238bceSAndroid Build Coastguard Worker
Verify()1790*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1791*35238bceSAndroid Build Coastguard Worker {
1792*35238bceSAndroid Build Coastguard Worker IVec4 data;
1793*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
1794*35238bceSAndroid Build Coastguard Worker if (data != IVec4(1, 5, 9, 13))
1795*35238bceSAndroid Build Coastguard Worker {
1796*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1797*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 1, 5, 9, 13, got: " << data.x() << ", " << data.y() << ", "
1798*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1799*35238bceSAndroid Build Coastguard Worker return ERROR;
1800*35238bceSAndroid Build Coastguard Worker }
1801*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1802*35238bceSAndroid Build Coastguard Worker }
1803*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1804*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1805*35238bceSAndroid Build Coastguard Worker {
1806*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1807*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1808*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(1, 5, 9, 13))
1809*35238bceSAndroid Build Coastguard Worker {
1810*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1811*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1812*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1813*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1814*35238bceSAndroid Build Coastguard Worker return ERROR;
1815*35238bceSAndroid Build Coastguard Worker }
1816*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1817*35238bceSAndroid Build Coastguard Worker }
1818*35238bceSAndroid Build Coastguard Worker
Type()1819*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1820*35238bceSAndroid Build Coastguard Worker {
1821*35238bceSAndroid Build Coastguard Worker return "ivec4";
1822*35238bceSAndroid Build Coastguard Worker }
1823*35238bceSAndroid Build Coastguard Worker };
1824*35238bceSAndroid Build Coastguard Worker
1825*35238bceSAndroid Build Coastguard Worker class PlainGatherUintCube : public GatherBase
1826*35238bceSAndroid Build Coastguard Worker {
1827*35238bceSAndroid Build Coastguard Worker public:
Init()1828*35238bceSAndroid Build Coastguard Worker virtual void Init()
1829*35238bceSAndroid Build Coastguard Worker {
1830*35238bceSAndroid Build Coastguard Worker CreateTextureCubeInt();
1831*35238bceSAndroid Build Coastguard Worker }
1832*35238bceSAndroid Build Coastguard Worker
BufferData()1833*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1834*35238bceSAndroid Build Coastguard Worker {
1835*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1836*35238bceSAndroid Build Coastguard Worker }
1837*35238bceSAndroid Build Coastguard Worker
Sampler()1838*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1839*35238bceSAndroid Build Coastguard Worker {
1840*35238bceSAndroid Build Coastguard Worker return "uniform usamplerCube my_sampler; \n";
1841*35238bceSAndroid Build Coastguard Worker }
1842*35238bceSAndroid Build Coastguard Worker
TextBody()1843*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1844*35238bceSAndroid Build Coastguard Worker {
1845*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1846*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), 0); \n"
1847*35238bceSAndroid Build Coastguard Worker "}\n";
1848*35238bceSAndroid Build Coastguard Worker }
1849*35238bceSAndroid Build Coastguard Worker
InternalFormat()1850*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1851*35238bceSAndroid Build Coastguard Worker {
1852*35238bceSAndroid Build Coastguard Worker return GL_RGBA32UI;
1853*35238bceSAndroid Build Coastguard Worker }
1854*35238bceSAndroid Build Coastguard Worker
SetRbo()1855*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
1856*35238bceSAndroid Build Coastguard Worker {
1857*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32UI, 1, 1);
1858*35238bceSAndroid Build Coastguard Worker }
1859*35238bceSAndroid Build Coastguard Worker
Verify()1860*35238bceSAndroid Build Coastguard Worker virtual long Verify()
1861*35238bceSAndroid Build Coastguard Worker {
1862*35238bceSAndroid Build Coastguard Worker IVec4 data;
1863*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
1864*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
1865*35238bceSAndroid Build Coastguard Worker {
1866*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1867*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
1868*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
1869*35238bceSAndroid Build Coastguard Worker return ERROR;
1870*35238bceSAndroid Build Coastguard Worker }
1871*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1872*35238bceSAndroid Build Coastguard Worker }
1873*35238bceSAndroid Build Coastguard Worker
VerifyCompute()1874*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
1875*35238bceSAndroid Build Coastguard Worker {
1876*35238bceSAndroid Build Coastguard Worker IVec4 *data;
1877*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
1878*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
1879*35238bceSAndroid Build Coastguard Worker {
1880*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
1881*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
1882*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
1883*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
1884*35238bceSAndroid Build Coastguard Worker return ERROR;
1885*35238bceSAndroid Build Coastguard Worker }
1886*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
1887*35238bceSAndroid Build Coastguard Worker }
1888*35238bceSAndroid Build Coastguard Worker
Type()1889*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
1890*35238bceSAndroid Build Coastguard Worker {
1891*35238bceSAndroid Build Coastguard Worker return "uvec4";
1892*35238bceSAndroid Build Coastguard Worker }
1893*35238bceSAndroid Build Coastguard Worker };
1894*35238bceSAndroid Build Coastguard Worker
1895*35238bceSAndroid Build Coastguard Worker class PlainGatherDepthCube : public GatherBase
1896*35238bceSAndroid Build Coastguard Worker {
1897*35238bceSAndroid Build Coastguard Worker public:
Init()1898*35238bceSAndroid Build Coastguard Worker virtual void Init()
1899*35238bceSAndroid Build Coastguard Worker {
1900*35238bceSAndroid Build Coastguard Worker CreateTextureCube();
1901*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
1902*35238bceSAndroid Build Coastguard Worker }
1903*35238bceSAndroid Build Coastguard Worker
InternalFormat()1904*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
1905*35238bceSAndroid Build Coastguard Worker {
1906*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT32F;
1907*35238bceSAndroid Build Coastguard Worker }
1908*35238bceSAndroid Build Coastguard Worker
Format()1909*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
1910*35238bceSAndroid Build Coastguard Worker {
1911*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT;
1912*35238bceSAndroid Build Coastguard Worker }
1913*35238bceSAndroid Build Coastguard Worker
BufferData()1914*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1915*35238bceSAndroid Build Coastguard Worker {
1916*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 7.5 / 16);
1917*35238bceSAndroid Build Coastguard Worker }
1918*35238bceSAndroid Build Coastguard Worker
Sampler()1919*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1920*35238bceSAndroid Build Coastguard Worker {
1921*35238bceSAndroid Build Coastguard Worker return "uniform samplerCubeShadow my_sampler; \n";
1922*35238bceSAndroid Build Coastguard Worker }
1923*35238bceSAndroid Build Coastguard Worker
TextBody()1924*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1925*35238bceSAndroid Build Coastguard Worker {
1926*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1927*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec3(p.x, p.y, p.z), p.w); \n"
1928*35238bceSAndroid Build Coastguard Worker "}\n";
1929*35238bceSAndroid Build Coastguard Worker }
1930*35238bceSAndroid Build Coastguard Worker
Expected()1931*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
1932*35238bceSAndroid Build Coastguard Worker {
1933*35238bceSAndroid Build Coastguard Worker return Vec4(0, 0, 1, 1);
1934*35238bceSAndroid Build Coastguard Worker }
1935*35238bceSAndroid Build Coastguard Worker };
1936*35238bceSAndroid Build Coastguard Worker
1937*35238bceSAndroid Build Coastguard Worker class PlainGatherFloatCubeArray : public GatherBase
1938*35238bceSAndroid Build Coastguard Worker {
1939*35238bceSAndroid Build Coastguard Worker public:
Supported()1940*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
1941*35238bceSAndroid Build Coastguard Worker {
1942*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_cube_map_array"))
1943*35238bceSAndroid Build Coastguard Worker {
1944*35238bceSAndroid Build Coastguard Worker OutputNotSupported("GL_ARB_texture_cube_map_array not supported");
1945*35238bceSAndroid Build Coastguard Worker return false;
1946*35238bceSAndroid Build Coastguard Worker }
1947*35238bceSAndroid Build Coastguard Worker return true;
1948*35238bceSAndroid Build Coastguard Worker }
1949*35238bceSAndroid Build Coastguard Worker
Init()1950*35238bceSAndroid Build Coastguard Worker virtual void Init()
1951*35238bceSAndroid Build Coastguard Worker {
1952*35238bceSAndroid Build Coastguard Worker CreateTextureCubeArray(9, 5);
1953*35238bceSAndroid Build Coastguard Worker }
1954*35238bceSAndroid Build Coastguard Worker
BufferData()1955*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1956*35238bceSAndroid Build Coastguard Worker {
1957*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 5);
1958*35238bceSAndroid Build Coastguard Worker }
1959*35238bceSAndroid Build Coastguard Worker
Sampler()1960*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1961*35238bceSAndroid Build Coastguard Worker {
1962*35238bceSAndroid Build Coastguard Worker return "uniform samplerCubeArray my_sampler; \n";
1963*35238bceSAndroid Build Coastguard Worker }
1964*35238bceSAndroid Build Coastguard Worker
TextBody()1965*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
1966*35238bceSAndroid Build Coastguard Worker {
1967*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
1968*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, p); \n"
1969*35238bceSAndroid Build Coastguard Worker "}\n";
1970*35238bceSAndroid Build Coastguard Worker }
1971*35238bceSAndroid Build Coastguard Worker };
1972*35238bceSAndroid Build Coastguard Worker
1973*35238bceSAndroid Build Coastguard Worker class PlainGatherUnormCubeArray : public GatherBase
1974*35238bceSAndroid Build Coastguard Worker {
1975*35238bceSAndroid Build Coastguard Worker public:
Supported()1976*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
1977*35238bceSAndroid Build Coastguard Worker {
1978*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_cube_map_array"))
1979*35238bceSAndroid Build Coastguard Worker {
1980*35238bceSAndroid Build Coastguard Worker OutputNotSupported("GL_ARB_texture_cube_map_array not supported");
1981*35238bceSAndroid Build Coastguard Worker return false;
1982*35238bceSAndroid Build Coastguard Worker }
1983*35238bceSAndroid Build Coastguard Worker return true;
1984*35238bceSAndroid Build Coastguard Worker }
1985*35238bceSAndroid Build Coastguard Worker
Init()1986*35238bceSAndroid Build Coastguard Worker virtual void Init()
1987*35238bceSAndroid Build Coastguard Worker {
1988*35238bceSAndroid Build Coastguard Worker CreateTextureCubeArray(7, 3);
1989*35238bceSAndroid Build Coastguard Worker }
1990*35238bceSAndroid Build Coastguard Worker
BufferData()1991*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
1992*35238bceSAndroid Build Coastguard Worker {
1993*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 3);
1994*35238bceSAndroid Build Coastguard Worker }
1995*35238bceSAndroid Build Coastguard Worker
Sampler()1996*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
1997*35238bceSAndroid Build Coastguard Worker {
1998*35238bceSAndroid Build Coastguard Worker return "uniform samplerCubeArray my_sampler; \n";
1999*35238bceSAndroid Build Coastguard Worker }
2000*35238bceSAndroid Build Coastguard Worker
TextBody()2001*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2002*35238bceSAndroid Build Coastguard Worker {
2003*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2004*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, p); \n"
2005*35238bceSAndroid Build Coastguard Worker "}\n";
2006*35238bceSAndroid Build Coastguard Worker }
2007*35238bceSAndroid Build Coastguard Worker
InternalFormat()2008*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2009*35238bceSAndroid Build Coastguard Worker {
2010*35238bceSAndroid Build Coastguard Worker return GL_RGBA16;
2011*35238bceSAndroid Build Coastguard Worker }
2012*35238bceSAndroid Build Coastguard Worker };
2013*35238bceSAndroid Build Coastguard Worker
2014*35238bceSAndroid Build Coastguard Worker class PlainGatherIntCubeArray : public GatherBase
2015*35238bceSAndroid Build Coastguard Worker {
2016*35238bceSAndroid Build Coastguard Worker public:
Supported()2017*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
2018*35238bceSAndroid Build Coastguard Worker {
2019*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_cube_map_array"))
2020*35238bceSAndroid Build Coastguard Worker {
2021*35238bceSAndroid Build Coastguard Worker OutputNotSupported("GL_ARB_texture_cube_map_array not supported");
2022*35238bceSAndroid Build Coastguard Worker return false;
2023*35238bceSAndroid Build Coastguard Worker }
2024*35238bceSAndroid Build Coastguard Worker return true;
2025*35238bceSAndroid Build Coastguard Worker }
2026*35238bceSAndroid Build Coastguard Worker
Init()2027*35238bceSAndroid Build Coastguard Worker virtual void Init()
2028*35238bceSAndroid Build Coastguard Worker {
2029*35238bceSAndroid Build Coastguard Worker CreateTextureCubeArrayInt(20, 11);
2030*35238bceSAndroid Build Coastguard Worker }
2031*35238bceSAndroid Build Coastguard Worker
BufferData()2032*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2033*35238bceSAndroid Build Coastguard Worker {
2034*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 11);
2035*35238bceSAndroid Build Coastguard Worker }
2036*35238bceSAndroid Build Coastguard Worker
Sampler()2037*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2038*35238bceSAndroid Build Coastguard Worker {
2039*35238bceSAndroid Build Coastguard Worker return "uniform isamplerCubeArray my_sampler; \n";
2040*35238bceSAndroid Build Coastguard Worker }
2041*35238bceSAndroid Build Coastguard Worker
TextBody()2042*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2043*35238bceSAndroid Build Coastguard Worker {
2044*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2045*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, p); \n"
2046*35238bceSAndroid Build Coastguard Worker "}\n";
2047*35238bceSAndroid Build Coastguard Worker }
2048*35238bceSAndroid Build Coastguard Worker
InternalFormat()2049*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2050*35238bceSAndroid Build Coastguard Worker {
2051*35238bceSAndroid Build Coastguard Worker return GL_RGBA32I;
2052*35238bceSAndroid Build Coastguard Worker }
2053*35238bceSAndroid Build Coastguard Worker
SetRbo()2054*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
2055*35238bceSAndroid Build Coastguard Worker {
2056*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
2057*35238bceSAndroid Build Coastguard Worker }
2058*35238bceSAndroid Build Coastguard Worker
Verify()2059*35238bceSAndroid Build Coastguard Worker virtual long Verify()
2060*35238bceSAndroid Build Coastguard Worker {
2061*35238bceSAndroid Build Coastguard Worker IVec4 data;
2062*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
2063*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
2064*35238bceSAndroid Build Coastguard Worker {
2065*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2066*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
2067*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
2068*35238bceSAndroid Build Coastguard Worker return ERROR;
2069*35238bceSAndroid Build Coastguard Worker }
2070*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2071*35238bceSAndroid Build Coastguard Worker }
2072*35238bceSAndroid Build Coastguard Worker
VerifyCompute()2073*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
2074*35238bceSAndroid Build Coastguard Worker {
2075*35238bceSAndroid Build Coastguard Worker IVec4 *data;
2076*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
2077*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
2078*35238bceSAndroid Build Coastguard Worker {
2079*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2080*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
2081*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
2082*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
2083*35238bceSAndroid Build Coastguard Worker return ERROR;
2084*35238bceSAndroid Build Coastguard Worker }
2085*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2086*35238bceSAndroid Build Coastguard Worker }
2087*35238bceSAndroid Build Coastguard Worker
Type()2088*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
2089*35238bceSAndroid Build Coastguard Worker {
2090*35238bceSAndroid Build Coastguard Worker return "ivec4";
2091*35238bceSAndroid Build Coastguard Worker }
2092*35238bceSAndroid Build Coastguard Worker };
2093*35238bceSAndroid Build Coastguard Worker
2094*35238bceSAndroid Build Coastguard Worker class PlainGatherUintCubeArray : public GatherBase
2095*35238bceSAndroid Build Coastguard Worker {
2096*35238bceSAndroid Build Coastguard Worker public:
Supported()2097*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
2098*35238bceSAndroid Build Coastguard Worker {
2099*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_cube_map_array"))
2100*35238bceSAndroid Build Coastguard Worker {
2101*35238bceSAndroid Build Coastguard Worker OutputNotSupported("GL_ARB_texture_cube_map_array not supported");
2102*35238bceSAndroid Build Coastguard Worker return false;
2103*35238bceSAndroid Build Coastguard Worker }
2104*35238bceSAndroid Build Coastguard Worker return true;
2105*35238bceSAndroid Build Coastguard Worker }
2106*35238bceSAndroid Build Coastguard Worker
Init()2107*35238bceSAndroid Build Coastguard Worker virtual void Init()
2108*35238bceSAndroid Build Coastguard Worker {
2109*35238bceSAndroid Build Coastguard Worker CreateTextureCubeArrayInt(3, 1);
2110*35238bceSAndroid Build Coastguard Worker }
2111*35238bceSAndroid Build Coastguard Worker
BufferData()2112*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2113*35238bceSAndroid Build Coastguard Worker {
2114*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 1);
2115*35238bceSAndroid Build Coastguard Worker }
2116*35238bceSAndroid Build Coastguard Worker
Sampler()2117*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2118*35238bceSAndroid Build Coastguard Worker {
2119*35238bceSAndroid Build Coastguard Worker return "uniform usamplerCubeArray my_sampler; \n";
2120*35238bceSAndroid Build Coastguard Worker }
2121*35238bceSAndroid Build Coastguard Worker
TextBody()2122*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2123*35238bceSAndroid Build Coastguard Worker {
2124*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2125*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, p); \n"
2126*35238bceSAndroid Build Coastguard Worker "}\n";
2127*35238bceSAndroid Build Coastguard Worker }
2128*35238bceSAndroid Build Coastguard Worker
InternalFormat()2129*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2130*35238bceSAndroid Build Coastguard Worker {
2131*35238bceSAndroid Build Coastguard Worker return GL_RGBA32UI;
2132*35238bceSAndroid Build Coastguard Worker }
2133*35238bceSAndroid Build Coastguard Worker
SetRbo()2134*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
2135*35238bceSAndroid Build Coastguard Worker {
2136*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32UI, 1, 1);
2137*35238bceSAndroid Build Coastguard Worker }
2138*35238bceSAndroid Build Coastguard Worker
Verify()2139*35238bceSAndroid Build Coastguard Worker virtual long Verify()
2140*35238bceSAndroid Build Coastguard Worker {
2141*35238bceSAndroid Build Coastguard Worker UVec4 data;
2142*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data);
2143*35238bceSAndroid Build Coastguard Worker if (data != UVec4(0, 4, 8, 12))
2144*35238bceSAndroid Build Coastguard Worker {
2145*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2146*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
2147*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
2148*35238bceSAndroid Build Coastguard Worker return ERROR;
2149*35238bceSAndroid Build Coastguard Worker }
2150*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2151*35238bceSAndroid Build Coastguard Worker }
2152*35238bceSAndroid Build Coastguard Worker
VerifyCompute()2153*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
2154*35238bceSAndroid Build Coastguard Worker {
2155*35238bceSAndroid Build Coastguard Worker IVec4 *data;
2156*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
2157*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
2158*35238bceSAndroid Build Coastguard Worker {
2159*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2160*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
2161*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
2162*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
2163*35238bceSAndroid Build Coastguard Worker return ERROR;
2164*35238bceSAndroid Build Coastguard Worker }
2165*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2166*35238bceSAndroid Build Coastguard Worker }
2167*35238bceSAndroid Build Coastguard Worker
Type()2168*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
2169*35238bceSAndroid Build Coastguard Worker {
2170*35238bceSAndroid Build Coastguard Worker return "uvec4";
2171*35238bceSAndroid Build Coastguard Worker }
2172*35238bceSAndroid Build Coastguard Worker };
2173*35238bceSAndroid Build Coastguard Worker
2174*35238bceSAndroid Build Coastguard Worker class PlainGatherDepthCubeArray : public GatherBase
2175*35238bceSAndroid Build Coastguard Worker {
2176*35238bceSAndroid Build Coastguard Worker public:
Supported()2177*35238bceSAndroid Build Coastguard Worker virtual bool Supported()
2178*35238bceSAndroid Build Coastguard Worker {
2179*35238bceSAndroid Build Coastguard Worker if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_texture_cube_map_array"))
2180*35238bceSAndroid Build Coastguard Worker {
2181*35238bceSAndroid Build Coastguard Worker OutputNotSupported("GL_ARB_texture_cube_map_array not supported");
2182*35238bceSAndroid Build Coastguard Worker return false;
2183*35238bceSAndroid Build Coastguard Worker }
2184*35238bceSAndroid Build Coastguard Worker return true;
2185*35238bceSAndroid Build Coastguard Worker }
2186*35238bceSAndroid Build Coastguard Worker
Init()2187*35238bceSAndroid Build Coastguard Worker virtual void Init()
2188*35238bceSAndroid Build Coastguard Worker {
2189*35238bceSAndroid Build Coastguard Worker CreateTextureCubeArray(7, 3);
2190*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
2191*35238bceSAndroid Build Coastguard Worker }
2192*35238bceSAndroid Build Coastguard Worker
BufferData()2193*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2194*35238bceSAndroid Build Coastguard Worker {
2195*35238bceSAndroid Build Coastguard Worker return Vec4(7. / 16, -10. / 16, 1, 3);
2196*35238bceSAndroid Build Coastguard Worker }
2197*35238bceSAndroid Build Coastguard Worker
Sampler()2198*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2199*35238bceSAndroid Build Coastguard Worker {
2200*35238bceSAndroid Build Coastguard Worker return "uniform samplerCubeArrayShadow my_sampler; \n";
2201*35238bceSAndroid Build Coastguard Worker }
2202*35238bceSAndroid Build Coastguard Worker
TextBody()2203*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2204*35238bceSAndroid Build Coastguard Worker {
2205*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2206*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, p, 7.5/16); \n"
2207*35238bceSAndroid Build Coastguard Worker "}\n";
2208*35238bceSAndroid Build Coastguard Worker }
2209*35238bceSAndroid Build Coastguard Worker
InternalFormat()2210*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2211*35238bceSAndroid Build Coastguard Worker {
2212*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT32F;
2213*35238bceSAndroid Build Coastguard Worker }
2214*35238bceSAndroid Build Coastguard Worker
Format()2215*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
2216*35238bceSAndroid Build Coastguard Worker {
2217*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT;
2218*35238bceSAndroid Build Coastguard Worker }
2219*35238bceSAndroid Build Coastguard Worker
Expected()2220*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2221*35238bceSAndroid Build Coastguard Worker {
2222*35238bceSAndroid Build Coastguard Worker return Vec4(0, 0, 1, 1);
2223*35238bceSAndroid Build Coastguard Worker }
2224*35238bceSAndroid Build Coastguard Worker };
2225*35238bceSAndroid Build Coastguard Worker
2226*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DRect : public GatherBase
2227*35238bceSAndroid Build Coastguard Worker {
2228*35238bceSAndroid Build Coastguard Worker public:
Init()2229*35238bceSAndroid Build Coastguard Worker virtual void Init()
2230*35238bceSAndroid Build Coastguard Worker {
2231*35238bceSAndroid Build Coastguard Worker CreateTexture2D(true);
2232*35238bceSAndroid Build Coastguard Worker }
2233*35238bceSAndroid Build Coastguard Worker
BufferData()2234*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2235*35238bceSAndroid Build Coastguard Worker {
2236*35238bceSAndroid Build Coastguard Worker return Vec4(23, 26, 0, 0);
2237*35238bceSAndroid Build Coastguard Worker }
2238*35238bceSAndroid Build Coastguard Worker
Sampler()2239*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2240*35238bceSAndroid Build Coastguard Worker {
2241*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DRect my_sampler; \n";
2242*35238bceSAndroid Build Coastguard Worker }
2243*35238bceSAndroid Build Coastguard Worker
Expected()2244*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2245*35238bceSAndroid Build Coastguard Worker {
2246*35238bceSAndroid Build Coastguard Worker return Vec4(1. / 16, 5. / 16, 9. / 16, 13. / 16);
2247*35238bceSAndroid Build Coastguard Worker }
2248*35238bceSAndroid Build Coastguard Worker
TextBody()2249*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2250*35238bceSAndroid Build Coastguard Worker {
2251*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2252*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 1); \n"
2253*35238bceSAndroid Build Coastguard Worker "}\n";
2254*35238bceSAndroid Build Coastguard Worker }
2255*35238bceSAndroid Build Coastguard Worker };
2256*35238bceSAndroid Build Coastguard Worker
2257*35238bceSAndroid Build Coastguard Worker class PlainGatherUnorm2DRect : public GatherBase
2258*35238bceSAndroid Build Coastguard Worker {
2259*35238bceSAndroid Build Coastguard Worker public:
Init()2260*35238bceSAndroid Build Coastguard Worker virtual void Init()
2261*35238bceSAndroid Build Coastguard Worker {
2262*35238bceSAndroid Build Coastguard Worker CreateTexture2D(true);
2263*35238bceSAndroid Build Coastguard Worker }
2264*35238bceSAndroid Build Coastguard Worker
BufferData()2265*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2266*35238bceSAndroid Build Coastguard Worker {
2267*35238bceSAndroid Build Coastguard Worker return Vec4(23, 26, 0, 0);
2268*35238bceSAndroid Build Coastguard Worker }
2269*35238bceSAndroid Build Coastguard Worker
Sampler()2270*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2271*35238bceSAndroid Build Coastguard Worker {
2272*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DRect my_sampler; \n";
2273*35238bceSAndroid Build Coastguard Worker }
2274*35238bceSAndroid Build Coastguard Worker
TextBody()2275*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2276*35238bceSAndroid Build Coastguard Worker {
2277*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2278*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y)); \n"
2279*35238bceSAndroid Build Coastguard Worker "}\n";
2280*35238bceSAndroid Build Coastguard Worker }
2281*35238bceSAndroid Build Coastguard Worker
InternalFormat()2282*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2283*35238bceSAndroid Build Coastguard Worker {
2284*35238bceSAndroid Build Coastguard Worker return GL_RGBA16;
2285*35238bceSAndroid Build Coastguard Worker }
2286*35238bceSAndroid Build Coastguard Worker };
2287*35238bceSAndroid Build Coastguard Worker
2288*35238bceSAndroid Build Coastguard Worker class PlainGatherInt2DRect : public GatherBase
2289*35238bceSAndroid Build Coastguard Worker {
2290*35238bceSAndroid Build Coastguard Worker public:
Init()2291*35238bceSAndroid Build Coastguard Worker virtual void Init()
2292*35238bceSAndroid Build Coastguard Worker {
2293*35238bceSAndroid Build Coastguard Worker CreateTexture2DInt(true);
2294*35238bceSAndroid Build Coastguard Worker }
2295*35238bceSAndroid Build Coastguard Worker
BufferData()2296*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2297*35238bceSAndroid Build Coastguard Worker {
2298*35238bceSAndroid Build Coastguard Worker return Vec4(22.9f, 25.9f, 0, 0);
2299*35238bceSAndroid Build Coastguard Worker }
2300*35238bceSAndroid Build Coastguard Worker
Sampler()2301*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2302*35238bceSAndroid Build Coastguard Worker {
2303*35238bceSAndroid Build Coastguard Worker return "uniform isampler2DRect my_sampler; \n";
2304*35238bceSAndroid Build Coastguard Worker }
2305*35238bceSAndroid Build Coastguard Worker
TextBody()2306*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2307*35238bceSAndroid Build Coastguard Worker {
2308*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2309*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y)); \n"
2310*35238bceSAndroid Build Coastguard Worker "}\n";
2311*35238bceSAndroid Build Coastguard Worker }
2312*35238bceSAndroid Build Coastguard Worker
InternalFormat()2313*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2314*35238bceSAndroid Build Coastguard Worker {
2315*35238bceSAndroid Build Coastguard Worker return GL_RGBA32I;
2316*35238bceSAndroid Build Coastguard Worker }
2317*35238bceSAndroid Build Coastguard Worker
SetRbo()2318*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
2319*35238bceSAndroid Build Coastguard Worker {
2320*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32I, 1, 1);
2321*35238bceSAndroid Build Coastguard Worker }
2322*35238bceSAndroid Build Coastguard Worker
Verify()2323*35238bceSAndroid Build Coastguard Worker virtual long Verify()
2324*35238bceSAndroid Build Coastguard Worker {
2325*35238bceSAndroid Build Coastguard Worker IVec4 data;
2326*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &data);
2327*35238bceSAndroid Build Coastguard Worker if (data != IVec4(0, 4, 8, 12))
2328*35238bceSAndroid Build Coastguard Worker {
2329*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2330*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
2331*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
2332*35238bceSAndroid Build Coastguard Worker return ERROR;
2333*35238bceSAndroid Build Coastguard Worker }
2334*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2335*35238bceSAndroid Build Coastguard Worker }
2336*35238bceSAndroid Build Coastguard Worker
VerifyCompute()2337*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
2338*35238bceSAndroid Build Coastguard Worker {
2339*35238bceSAndroid Build Coastguard Worker IVec4 *data;
2340*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
2341*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
2342*35238bceSAndroid Build Coastguard Worker {
2343*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2344*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
2345*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
2346*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
2347*35238bceSAndroid Build Coastguard Worker return ERROR;
2348*35238bceSAndroid Build Coastguard Worker }
2349*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2350*35238bceSAndroid Build Coastguard Worker }
2351*35238bceSAndroid Build Coastguard Worker
Type()2352*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
2353*35238bceSAndroid Build Coastguard Worker {
2354*35238bceSAndroid Build Coastguard Worker return "ivec4";
2355*35238bceSAndroid Build Coastguard Worker }
2356*35238bceSAndroid Build Coastguard Worker };
2357*35238bceSAndroid Build Coastguard Worker
2358*35238bceSAndroid Build Coastguard Worker class PlainGatherUint2DRect : public GatherBase
2359*35238bceSAndroid Build Coastguard Worker {
2360*35238bceSAndroid Build Coastguard Worker public:
Init()2361*35238bceSAndroid Build Coastguard Worker virtual void Init()
2362*35238bceSAndroid Build Coastguard Worker {
2363*35238bceSAndroid Build Coastguard Worker CreateTexture2DInt(true);
2364*35238bceSAndroid Build Coastguard Worker }
2365*35238bceSAndroid Build Coastguard Worker
BufferData()2366*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2367*35238bceSAndroid Build Coastguard Worker {
2368*35238bceSAndroid Build Coastguard Worker return Vec4(22.9f, 25.9f, 0, 0);
2369*35238bceSAndroid Build Coastguard Worker }
2370*35238bceSAndroid Build Coastguard Worker
Sampler()2371*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2372*35238bceSAndroid Build Coastguard Worker {
2373*35238bceSAndroid Build Coastguard Worker return "uniform usampler2DRect my_sampler; \n";
2374*35238bceSAndroid Build Coastguard Worker }
2375*35238bceSAndroid Build Coastguard Worker
TextBody()2376*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2377*35238bceSAndroid Build Coastguard Worker {
2378*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2379*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y)); \n"
2380*35238bceSAndroid Build Coastguard Worker "}\n";
2381*35238bceSAndroid Build Coastguard Worker }
2382*35238bceSAndroid Build Coastguard Worker
InternalFormat()2383*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2384*35238bceSAndroid Build Coastguard Worker {
2385*35238bceSAndroid Build Coastguard Worker return GL_RGBA32UI;
2386*35238bceSAndroid Build Coastguard Worker }
2387*35238bceSAndroid Build Coastguard Worker
SetRbo()2388*35238bceSAndroid Build Coastguard Worker virtual void SetRbo()
2389*35238bceSAndroid Build Coastguard Worker {
2390*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32UI, 1, 1);
2391*35238bceSAndroid Build Coastguard Worker }
2392*35238bceSAndroid Build Coastguard Worker
Verify()2393*35238bceSAndroid Build Coastguard Worker virtual long Verify()
2394*35238bceSAndroid Build Coastguard Worker {
2395*35238bceSAndroid Build Coastguard Worker UVec4 data;
2396*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data);
2397*35238bceSAndroid Build Coastguard Worker if (data != UVec4(0, 4, 8, 12))
2398*35238bceSAndroid Build Coastguard Worker {
2399*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2400*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected 0, 4, 8, 12, got: " << data.x() << ", " << data.y() << ", "
2401*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << tcu::TestLog::EndMessage;
2402*35238bceSAndroid Build Coastguard Worker return ERROR;
2403*35238bceSAndroid Build Coastguard Worker }
2404*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2405*35238bceSAndroid Build Coastguard Worker }
2406*35238bceSAndroid Build Coastguard Worker
VerifyCompute()2407*35238bceSAndroid Build Coastguard Worker virtual long VerifyCompute()
2408*35238bceSAndroid Build Coastguard Worker {
2409*35238bceSAndroid Build Coastguard Worker IVec4 *data;
2410*35238bceSAndroid Build Coastguard Worker data = static_cast<IVec4 *>(glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT));
2411*35238bceSAndroid Build Coastguard Worker if (data[0] != IVec4(0, 4, 8, 12))
2412*35238bceSAndroid Build Coastguard Worker {
2413*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
2414*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected " << Expected().x() << ", " << Expected().y() << ", "
2415*35238bceSAndroid Build Coastguard Worker << Expected().z() << ", " << Expected().w() << ", got: " << data[0].x() << ", " << data[0].y() << ", "
2416*35238bceSAndroid Build Coastguard Worker << data[0].z() << ", " << data[0].w() << tcu::TestLog::EndMessage;
2417*35238bceSAndroid Build Coastguard Worker return ERROR;
2418*35238bceSAndroid Build Coastguard Worker }
2419*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
2420*35238bceSAndroid Build Coastguard Worker }
2421*35238bceSAndroid Build Coastguard Worker
Type()2422*35238bceSAndroid Build Coastguard Worker virtual std::string Type()
2423*35238bceSAndroid Build Coastguard Worker {
2424*35238bceSAndroid Build Coastguard Worker return "uvec4";
2425*35238bceSAndroid Build Coastguard Worker }
2426*35238bceSAndroid Build Coastguard Worker };
2427*35238bceSAndroid Build Coastguard Worker
2428*35238bceSAndroid Build Coastguard Worker class PlainGatherDepth2DRect : public GatherBase
2429*35238bceSAndroid Build Coastguard Worker {
2430*35238bceSAndroid Build Coastguard Worker public:
Init()2431*35238bceSAndroid Build Coastguard Worker virtual void Init()
2432*35238bceSAndroid Build Coastguard Worker {
2433*35238bceSAndroid Build Coastguard Worker CreateTexture2D(true);
2434*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
2435*35238bceSAndroid Build Coastguard Worker }
2436*35238bceSAndroid Build Coastguard Worker
BufferData()2437*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2438*35238bceSAndroid Build Coastguard Worker {
2439*35238bceSAndroid Build Coastguard Worker return Vec4(23, 26, 13.5 / 16, 3);
2440*35238bceSAndroid Build Coastguard Worker }
2441*35238bceSAndroid Build Coastguard Worker
Sampler()2442*35238bceSAndroid Build Coastguard Worker virtual std::string Sampler()
2443*35238bceSAndroid Build Coastguard Worker {
2444*35238bceSAndroid Build Coastguard Worker return "uniform sampler2DRectShadow my_sampler; \n";
2445*35238bceSAndroid Build Coastguard Worker }
2446*35238bceSAndroid Build Coastguard Worker
TextBody()2447*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2448*35238bceSAndroid Build Coastguard Worker {
2449*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2450*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), p.z); \n"
2451*35238bceSAndroid Build Coastguard Worker "}\n";
2452*35238bceSAndroid Build Coastguard Worker }
2453*35238bceSAndroid Build Coastguard Worker
InternalFormat()2454*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
2455*35238bceSAndroid Build Coastguard Worker {
2456*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT32F;
2457*35238bceSAndroid Build Coastguard Worker }
2458*35238bceSAndroid Build Coastguard Worker
Format()2459*35238bceSAndroid Build Coastguard Worker virtual GLenum Format()
2460*35238bceSAndroid Build Coastguard Worker {
2461*35238bceSAndroid Build Coastguard Worker return GL_DEPTH_COMPONENT;
2462*35238bceSAndroid Build Coastguard Worker }
2463*35238bceSAndroid Build Coastguard Worker
Expected()2464*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2465*35238bceSAndroid Build Coastguard Worker {
2466*35238bceSAndroid Build Coastguard Worker return Vec4(1, 1, 0, 0);
2467*35238bceSAndroid Build Coastguard Worker }
2468*35238bceSAndroid Build Coastguard Worker };
2469*35238bceSAndroid Build Coastguard Worker
2470*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2D : public GatherBase
2471*35238bceSAndroid Build Coastguard Worker {
BufferData()2472*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2473*35238bceSAndroid Build Coastguard Worker {
2474*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 4, 4);
2475*35238bceSAndroid Build Coastguard Worker }
2476*35238bceSAndroid Build Coastguard Worker
TextBody()2477*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2478*35238bceSAndroid Build Coastguard Worker {
2479*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2480*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.z))); \n"
2481*35238bceSAndroid Build Coastguard Worker "}\n";
2482*35238bceSAndroid Build Coastguard Worker }
2483*35238bceSAndroid Build Coastguard Worker };
2484*35238bceSAndroid Build Coastguard Worker
2485*35238bceSAndroid Build Coastguard Worker class OffsetGatherUnorm2D : public PlainGatherUnorm2D
2486*35238bceSAndroid Build Coastguard Worker {
BufferData()2487*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2488*35238bceSAndroid Build Coastguard Worker {
2489*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 4, 4);
2490*35238bceSAndroid Build Coastguard Worker }
2491*35238bceSAndroid Build Coastguard Worker
TestFunction()2492*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
2493*35238bceSAndroid Build Coastguard Worker {
2494*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
2495*35238bceSAndroid Build Coastguard Worker ""
2496*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
2497*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.z))); \n"
2498*35238bceSAndroid Build Coastguard Worker "}\n";
2499*35238bceSAndroid Build Coastguard Worker }
2500*35238bceSAndroid Build Coastguard Worker };
2501*35238bceSAndroid Build Coastguard Worker
2502*35238bceSAndroid Build Coastguard Worker class OffsetGatherInt2D : public PlainGatherInt2DRgba
2503*35238bceSAndroid Build Coastguard Worker {
BufferData()2504*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2505*35238bceSAndroid Build Coastguard Worker {
2506*35238bceSAndroid Build Coastguard Worker return Vec4(18.9f / 32.f, 21.9f / 32.f, 4, 4);
2507*35238bceSAndroid Build Coastguard Worker }
2508*35238bceSAndroid Build Coastguard Worker
TextBody()2509*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2510*35238bceSAndroid Build Coastguard Worker {
2511*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2512*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.z))); \n"
2513*35238bceSAndroid Build Coastguard Worker "}\n";
2514*35238bceSAndroid Build Coastguard Worker }
2515*35238bceSAndroid Build Coastguard Worker };
2516*35238bceSAndroid Build Coastguard Worker
2517*35238bceSAndroid Build Coastguard Worker class OffsetGatherUint2D : public PlainGatherUint2D
2518*35238bceSAndroid Build Coastguard Worker {
BufferData()2519*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2520*35238bceSAndroid Build Coastguard Worker {
2521*35238bceSAndroid Build Coastguard Worker return Vec4(18.9f / 32.f, 21.9f / 32.f, 4, 2);
2522*35238bceSAndroid Build Coastguard Worker }
2523*35238bceSAndroid Build Coastguard Worker
TextBody()2524*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2525*35238bceSAndroid Build Coastguard Worker {
2526*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2527*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.z)), 2); \n"
2528*35238bceSAndroid Build Coastguard Worker "}\n";
2529*35238bceSAndroid Build Coastguard Worker }
2530*35238bceSAndroid Build Coastguard Worker };
2531*35238bceSAndroid Build Coastguard Worker
2532*35238bceSAndroid Build Coastguard Worker class OffsetGatherDepth2D : public PlainGatherDepth2D
2533*35238bceSAndroid Build Coastguard Worker {
BufferData()2534*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2535*35238bceSAndroid Build Coastguard Worker {
2536*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 4, 13.5 / 16);
2537*35238bceSAndroid Build Coastguard Worker }
2538*35238bceSAndroid Build Coastguard Worker
TextBody()2539*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2540*35238bceSAndroid Build Coastguard Worker {
2541*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2542*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), p.w, ivec2(int(p.z))); \n"
2543*35238bceSAndroid Build Coastguard Worker "}\n";
2544*35238bceSAndroid Build Coastguard Worker }
2545*35238bceSAndroid Build Coastguard Worker };
2546*35238bceSAndroid Build Coastguard Worker
2547*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2DArray : public PlainGatherFloat2DArray
2548*35238bceSAndroid Build Coastguard Worker {
BufferData()2549*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2550*35238bceSAndroid Build Coastguard Worker {
2551*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 5, 4);
2552*35238bceSAndroid Build Coastguard Worker }
2553*35238bceSAndroid Build Coastguard Worker
TextBody()2554*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2555*35238bceSAndroid Build Coastguard Worker {
2556*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2557*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec3(p.x, p.y, p.z), ivec2(int(p.w))); \n"
2558*35238bceSAndroid Build Coastguard Worker "}\n";
2559*35238bceSAndroid Build Coastguard Worker }
2560*35238bceSAndroid Build Coastguard Worker };
2561*35238bceSAndroid Build Coastguard Worker
2562*35238bceSAndroid Build Coastguard Worker class OffsetGatherUnorm2DArray : public PlainGatherUnorm2DArray
2563*35238bceSAndroid Build Coastguard Worker {
BufferData()2564*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2565*35238bceSAndroid Build Coastguard Worker {
2566*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 3, 4);
2567*35238bceSAndroid Build Coastguard Worker }
2568*35238bceSAndroid Build Coastguard Worker
TextBody()2569*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2570*35238bceSAndroid Build Coastguard Worker {
2571*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2572*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec3(p.x, p.y, p.z), ivec2(int(p.w))); \n"
2573*35238bceSAndroid Build Coastguard Worker "}\n";
2574*35238bceSAndroid Build Coastguard Worker }
2575*35238bceSAndroid Build Coastguard Worker };
2576*35238bceSAndroid Build Coastguard Worker
2577*35238bceSAndroid Build Coastguard Worker class OffsetGatherInt2DArray : public PlainGatherInt2DArray
2578*35238bceSAndroid Build Coastguard Worker {
BufferData()2579*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2580*35238bceSAndroid Build Coastguard Worker {
2581*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 11, 4);
2582*35238bceSAndroid Build Coastguard Worker }
2583*35238bceSAndroid Build Coastguard Worker
TextBody()2584*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2585*35238bceSAndroid Build Coastguard Worker {
2586*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2587*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec3(p.x, p.y, p.z), ivec2(int(p.w)), 3); \n"
2588*35238bceSAndroid Build Coastguard Worker "}\n";
2589*35238bceSAndroid Build Coastguard Worker }
2590*35238bceSAndroid Build Coastguard Worker };
2591*35238bceSAndroid Build Coastguard Worker
2592*35238bceSAndroid Build Coastguard Worker class OffsetGatherUint2DArray : public PlainGatherUint2DArray
2593*35238bceSAndroid Build Coastguard Worker {
BufferData()2594*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2595*35238bceSAndroid Build Coastguard Worker {
2596*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 1, 4);
2597*35238bceSAndroid Build Coastguard Worker }
2598*35238bceSAndroid Build Coastguard Worker
TextBody()2599*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2600*35238bceSAndroid Build Coastguard Worker {
2601*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2602*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec3(p.x, p.y, p.z), ivec2(int(p.w))); \n"
2603*35238bceSAndroid Build Coastguard Worker "}\n";
2604*35238bceSAndroid Build Coastguard Worker }
2605*35238bceSAndroid Build Coastguard Worker };
2606*35238bceSAndroid Build Coastguard Worker
2607*35238bceSAndroid Build Coastguard Worker class OffsetGatherDepth2DArray : public PlainGatherDepth2DArray
2608*35238bceSAndroid Build Coastguard Worker {
Init()2609*35238bceSAndroid Build Coastguard Worker virtual void Init()
2610*35238bceSAndroid Build Coastguard Worker {
2611*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(7, 3);
2612*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
2613*35238bceSAndroid Build Coastguard Worker }
2614*35238bceSAndroid Build Coastguard Worker
BufferData()2615*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2616*35238bceSAndroid Build Coastguard Worker {
2617*35238bceSAndroid Build Coastguard Worker return Vec4(19. / 32, 22. / 32, 3, 4);
2618*35238bceSAndroid Build Coastguard Worker }
2619*35238bceSAndroid Build Coastguard Worker
TextBody()2620*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2621*35238bceSAndroid Build Coastguard Worker {
2622*35238bceSAndroid Build Coastguard Worker return Type() +
2623*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2624*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec3(p.x, p.y, p.z), p.y + (5./32), ivec2(int(p.w))); \n"
2625*35238bceSAndroid Build Coastguard Worker "}\n";
2626*35238bceSAndroid Build Coastguard Worker }
2627*35238bceSAndroid Build Coastguard Worker };
2628*35238bceSAndroid Build Coastguard Worker
2629*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2DRect : public PlainGatherFloat2DRect
2630*35238bceSAndroid Build Coastguard Worker {
BufferData()2631*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2632*35238bceSAndroid Build Coastguard Worker {
2633*35238bceSAndroid Build Coastguard Worker return Vec4(19, 22, 0, 4);
2634*35238bceSAndroid Build Coastguard Worker }
2635*35238bceSAndroid Build Coastguard Worker
TextBody()2636*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2637*35238bceSAndroid Build Coastguard Worker {
2638*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2639*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.w)), 1); \n"
2640*35238bceSAndroid Build Coastguard Worker "}\n";
2641*35238bceSAndroid Build Coastguard Worker }
2642*35238bceSAndroid Build Coastguard Worker };
2643*35238bceSAndroid Build Coastguard Worker
2644*35238bceSAndroid Build Coastguard Worker class OffsetGatherUnorm2DRect : public PlainGatherUnorm2DRect
2645*35238bceSAndroid Build Coastguard Worker {
BufferData()2646*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2647*35238bceSAndroid Build Coastguard Worker {
2648*35238bceSAndroid Build Coastguard Worker return Vec4(30.9f, 18.9f, -8.f, 7.f);
2649*35238bceSAndroid Build Coastguard Worker }
2650*35238bceSAndroid Build Coastguard Worker
TextBody()2651*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2652*35238bceSAndroid Build Coastguard Worker {
2653*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2654*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.z), int(p.w))); \n"
2655*35238bceSAndroid Build Coastguard Worker "}\n";
2656*35238bceSAndroid Build Coastguard Worker }
2657*35238bceSAndroid Build Coastguard Worker };
2658*35238bceSAndroid Build Coastguard Worker
2659*35238bceSAndroid Build Coastguard Worker class OffsetGatherInt2DRect : public PlainGatherInt2DRect
2660*35238bceSAndroid Build Coastguard Worker {
BufferData()2661*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2662*35238bceSAndroid Build Coastguard Worker {
2663*35238bceSAndroid Build Coastguard Worker return Vec4(22.9f, 25.9f, 0, 0);
2664*35238bceSAndroid Build Coastguard Worker }
2665*35238bceSAndroid Build Coastguard Worker
TextBody()2666*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2667*35238bceSAndroid Build Coastguard Worker {
2668*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2669*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.w))); \n"
2670*35238bceSAndroid Build Coastguard Worker "}\n";
2671*35238bceSAndroid Build Coastguard Worker }
2672*35238bceSAndroid Build Coastguard Worker };
2673*35238bceSAndroid Build Coastguard Worker
2674*35238bceSAndroid Build Coastguard Worker class OffsetGatherUint2DRect : public PlainGatherUint2DRect
2675*35238bceSAndroid Build Coastguard Worker {
BufferData()2676*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2677*35238bceSAndroid Build Coastguard Worker {
2678*35238bceSAndroid Build Coastguard Worker return Vec4(26.9f, 29.9f, 0, -4);
2679*35238bceSAndroid Build Coastguard Worker }
2680*35238bceSAndroid Build Coastguard Worker
TextBody()2681*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2682*35238bceSAndroid Build Coastguard Worker {
2683*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2684*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), ivec2(int(p.w))); \n"
2685*35238bceSAndroid Build Coastguard Worker "}\n";
2686*35238bceSAndroid Build Coastguard Worker }
2687*35238bceSAndroid Build Coastguard Worker };
2688*35238bceSAndroid Build Coastguard Worker
2689*35238bceSAndroid Build Coastguard Worker class OffsetGatherDepth2DRect : public PlainGatherDepth2DRect
2690*35238bceSAndroid Build Coastguard Worker {
BufferData()2691*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2692*35238bceSAndroid Build Coastguard Worker {
2693*35238bceSAndroid Build Coastguard Worker return Vec4(19, 22, 13.5 / 16, 4);
2694*35238bceSAndroid Build Coastguard Worker }
2695*35238bceSAndroid Build Coastguard Worker
TextBody()2696*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2697*35238bceSAndroid Build Coastguard Worker {
2698*35238bceSAndroid Build Coastguard Worker return Type() + " test_function(vec4 p) { \n"
2699*35238bceSAndroid Build Coastguard Worker " return textureGatherOffset(my_sampler, vec2(p.x, p.y), p.z, ivec2(int(p.w))); \n"
2700*35238bceSAndroid Build Coastguard Worker "}\n";
2701*35238bceSAndroid Build Coastguard Worker }
2702*35238bceSAndroid Build Coastguard Worker };
2703*35238bceSAndroid Build Coastguard Worker
2704*35238bceSAndroid Build Coastguard Worker class OffsetsGatherFloat2D : public OffsetGatherFloat2D
2705*35238bceSAndroid Build Coastguard Worker {
BufferData()2706*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2707*35238bceSAndroid Build Coastguard Worker {
2708*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 0, 0);
2709*35238bceSAndroid Build Coastguard Worker }
2710*35238bceSAndroid Build Coastguard Worker
TextBody()2711*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2712*35238bceSAndroid Build Coastguard Worker {
2713*35238bceSAndroid Build Coastguard Worker return Type() +
2714*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2715*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2716*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2717*35238bceSAndroid Build Coastguard Worker "}\n";
2718*35238bceSAndroid Build Coastguard Worker }
2719*35238bceSAndroid Build Coastguard Worker };
2720*35238bceSAndroid Build Coastguard Worker
2721*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUnorm2D : public OffsetGatherUnorm2D
2722*35238bceSAndroid Build Coastguard Worker {
BufferData()2723*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2724*35238bceSAndroid Build Coastguard Worker {
2725*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 0, 0);
2726*35238bceSAndroid Build Coastguard Worker }
2727*35238bceSAndroid Build Coastguard Worker
TestFunction()2728*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
2729*35238bceSAndroid Build Coastguard Worker {
2730*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
2731*35238bceSAndroid Build Coastguard Worker ""
2732*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
2733*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2734*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2735*35238bceSAndroid Build Coastguard Worker "}\n";
2736*35238bceSAndroid Build Coastguard Worker }
2737*35238bceSAndroid Build Coastguard Worker };
2738*35238bceSAndroid Build Coastguard Worker
2739*35238bceSAndroid Build Coastguard Worker class OffsetsGatherInt2D : public OffsetGatherInt2D
2740*35238bceSAndroid Build Coastguard Worker {
BufferData()2741*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2742*35238bceSAndroid Build Coastguard Worker {
2743*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 0, 0);
2744*35238bceSAndroid Build Coastguard Worker }
2745*35238bceSAndroid Build Coastguard Worker
TextBody()2746*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2747*35238bceSAndroid Build Coastguard Worker {
2748*35238bceSAndroid Build Coastguard Worker return Type() +
2749*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2750*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2751*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2752*35238bceSAndroid Build Coastguard Worker "}\n";
2753*35238bceSAndroid Build Coastguard Worker }
2754*35238bceSAndroid Build Coastguard Worker };
2755*35238bceSAndroid Build Coastguard Worker
2756*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUint2D : public OffsetGatherUint2D
2757*35238bceSAndroid Build Coastguard Worker {
BufferData()2758*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2759*35238bceSAndroid Build Coastguard Worker {
2760*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 2, 2);
2761*35238bceSAndroid Build Coastguard Worker }
2762*35238bceSAndroid Build Coastguard Worker
TextBody()2763*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2764*35238bceSAndroid Build Coastguard Worker {
2765*35238bceSAndroid Build Coastguard Worker return Type() +
2766*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2767*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2768*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets, 2); \n"
2769*35238bceSAndroid Build Coastguard Worker "}\n";
2770*35238bceSAndroid Build Coastguard Worker }
2771*35238bceSAndroid Build Coastguard Worker };
2772*35238bceSAndroid Build Coastguard Worker
2773*35238bceSAndroid Build Coastguard Worker class OffsetsGatherDepth2D : public OffsetGatherDepth2D
2774*35238bceSAndroid Build Coastguard Worker {
BufferData()2775*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2776*35238bceSAndroid Build Coastguard Worker {
2777*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 0.49f, 0);
2778*35238bceSAndroid Build Coastguard Worker }
2779*35238bceSAndroid Build Coastguard Worker
TextBody()2780*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2781*35238bceSAndroid Build Coastguard Worker {
2782*35238bceSAndroid Build Coastguard Worker return Type() +
2783*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2784*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2785*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), p.z, offsets); \n"
2786*35238bceSAndroid Build Coastguard Worker "}\n";
2787*35238bceSAndroid Build Coastguard Worker }
2788*35238bceSAndroid Build Coastguard Worker
Expected()2789*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2790*35238bceSAndroid Build Coastguard Worker {
2791*35238bceSAndroid Build Coastguard Worker return Vec4(0, 0, 1, 1);
2792*35238bceSAndroid Build Coastguard Worker }
2793*35238bceSAndroid Build Coastguard Worker };
2794*35238bceSAndroid Build Coastguard Worker
2795*35238bceSAndroid Build Coastguard Worker class OffsetsGatherFloat2DArray : public PlainGatherFloat2DArray
2796*35238bceSAndroid Build Coastguard Worker {
Init()2797*35238bceSAndroid Build Coastguard Worker virtual void Init()
2798*35238bceSAndroid Build Coastguard Worker {
2799*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(3, 1);
2800*35238bceSAndroid Build Coastguard Worker }
2801*35238bceSAndroid Build Coastguard Worker
BufferData()2802*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2803*35238bceSAndroid Build Coastguard Worker {
2804*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 1, 0);
2805*35238bceSAndroid Build Coastguard Worker }
2806*35238bceSAndroid Build Coastguard Worker
TextBody()2807*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2808*35238bceSAndroid Build Coastguard Worker {
2809*35238bceSAndroid Build Coastguard Worker return Type() +
2810*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2811*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2812*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec3(p.x, p.y, p.z), offsets); \n"
2813*35238bceSAndroid Build Coastguard Worker "}\n";
2814*35238bceSAndroid Build Coastguard Worker }
2815*35238bceSAndroid Build Coastguard Worker };
2816*35238bceSAndroid Build Coastguard Worker
2817*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUnorm2DArray : public PlainGatherUnorm2DArray
2818*35238bceSAndroid Build Coastguard Worker {
Init()2819*35238bceSAndroid Build Coastguard Worker virtual void Init()
2820*35238bceSAndroid Build Coastguard Worker {
2821*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(3, 1);
2822*35238bceSAndroid Build Coastguard Worker }
2823*35238bceSAndroid Build Coastguard Worker
BufferData()2824*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2825*35238bceSAndroid Build Coastguard Worker {
2826*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 1, 0);
2827*35238bceSAndroid Build Coastguard Worker }
2828*35238bceSAndroid Build Coastguard Worker
TextBody()2829*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2830*35238bceSAndroid Build Coastguard Worker {
2831*35238bceSAndroid Build Coastguard Worker return Type() +
2832*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2833*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2834*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec3(p.x, p.y, p.z), offsets); \n"
2835*35238bceSAndroid Build Coastguard Worker "}\n";
2836*35238bceSAndroid Build Coastguard Worker }
2837*35238bceSAndroid Build Coastguard Worker };
2838*35238bceSAndroid Build Coastguard Worker
2839*35238bceSAndroid Build Coastguard Worker class OffsetsGatherInt2DArray : public PlainGatherInt2DArray
2840*35238bceSAndroid Build Coastguard Worker {
Init()2841*35238bceSAndroid Build Coastguard Worker virtual void Init()
2842*35238bceSAndroid Build Coastguard Worker {
2843*35238bceSAndroid Build Coastguard Worker CreateTexture2DArrayInt(3, 1);
2844*35238bceSAndroid Build Coastguard Worker }
2845*35238bceSAndroid Build Coastguard Worker
BufferData()2846*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2847*35238bceSAndroid Build Coastguard Worker {
2848*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 1, 0);
2849*35238bceSAndroid Build Coastguard Worker }
2850*35238bceSAndroid Build Coastguard Worker
TextBody()2851*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2852*35238bceSAndroid Build Coastguard Worker {
2853*35238bceSAndroid Build Coastguard Worker return Type() +
2854*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2855*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2856*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec3(p.x, p.y, p.z), offsets, 3); \n"
2857*35238bceSAndroid Build Coastguard Worker "}\n";
2858*35238bceSAndroid Build Coastguard Worker }
2859*35238bceSAndroid Build Coastguard Worker };
2860*35238bceSAndroid Build Coastguard Worker
2861*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUint2DArray : public PlainGatherUint2DArray
2862*35238bceSAndroid Build Coastguard Worker {
Init()2863*35238bceSAndroid Build Coastguard Worker virtual void Init()
2864*35238bceSAndroid Build Coastguard Worker {
2865*35238bceSAndroid Build Coastguard Worker CreateTexture2DArrayInt(3, 1);
2866*35238bceSAndroid Build Coastguard Worker }
2867*35238bceSAndroid Build Coastguard Worker
BufferData()2868*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2869*35238bceSAndroid Build Coastguard Worker {
2870*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 1, 0);
2871*35238bceSAndroid Build Coastguard Worker }
2872*35238bceSAndroid Build Coastguard Worker
TextBody()2873*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2874*35238bceSAndroid Build Coastguard Worker {
2875*35238bceSAndroid Build Coastguard Worker return Type() +
2876*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2877*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2878*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec3(p.x, p.y, p.z), offsets); \n"
2879*35238bceSAndroid Build Coastguard Worker "}\n";
2880*35238bceSAndroid Build Coastguard Worker }
2881*35238bceSAndroid Build Coastguard Worker };
2882*35238bceSAndroid Build Coastguard Worker
2883*35238bceSAndroid Build Coastguard Worker class OffsetsGatherDepth2DArray : public PlainGatherDepth2DArray
2884*35238bceSAndroid Build Coastguard Worker {
Init()2885*35238bceSAndroid Build Coastguard Worker virtual void Init()
2886*35238bceSAndroid Build Coastguard Worker {
2887*35238bceSAndroid Build Coastguard Worker CreateTexture2DArray(3, 1);
2888*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
2889*35238bceSAndroid Build Coastguard Worker }
2890*35238bceSAndroid Build Coastguard Worker
BufferData()2891*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2892*35238bceSAndroid Build Coastguard Worker {
2893*35238bceSAndroid Build Coastguard Worker return Vec4(18. / 32, 8. / 32, 1, 0.49f);
2894*35238bceSAndroid Build Coastguard Worker }
2895*35238bceSAndroid Build Coastguard Worker
TextBody()2896*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2897*35238bceSAndroid Build Coastguard Worker {
2898*35238bceSAndroid Build Coastguard Worker return Type() +
2899*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2900*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2901*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec3(p.x, p.y, p.z), p.w, offsets); \n"
2902*35238bceSAndroid Build Coastguard Worker "}\n";
2903*35238bceSAndroid Build Coastguard Worker }
2904*35238bceSAndroid Build Coastguard Worker
Expected()2905*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2906*35238bceSAndroid Build Coastguard Worker {
2907*35238bceSAndroid Build Coastguard Worker return Vec4(0, 0, 1, 1);
2908*35238bceSAndroid Build Coastguard Worker }
2909*35238bceSAndroid Build Coastguard Worker };
2910*35238bceSAndroid Build Coastguard Worker
2911*35238bceSAndroid Build Coastguard Worker class OffsetsGatherFloat2DRect : public PlainGatherFloat2DRect
2912*35238bceSAndroid Build Coastguard Worker {
BufferData()2913*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2914*35238bceSAndroid Build Coastguard Worker {
2915*35238bceSAndroid Build Coastguard Worker return Vec4(18, 8, 0, 0);
2916*35238bceSAndroid Build Coastguard Worker }
2917*35238bceSAndroid Build Coastguard Worker
TextBody()2918*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2919*35238bceSAndroid Build Coastguard Worker {
2920*35238bceSAndroid Build Coastguard Worker return Type() +
2921*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2922*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2923*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets, 1); \n"
2924*35238bceSAndroid Build Coastguard Worker "}\n";
2925*35238bceSAndroid Build Coastguard Worker }
2926*35238bceSAndroid Build Coastguard Worker };
2927*35238bceSAndroid Build Coastguard Worker
2928*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUnorm2DRect : public PlainGatherUnorm2DRect
2929*35238bceSAndroid Build Coastguard Worker {
BufferData()2930*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2931*35238bceSAndroid Build Coastguard Worker {
2932*35238bceSAndroid Build Coastguard Worker return Vec4(18, 8, 0, 0);
2933*35238bceSAndroid Build Coastguard Worker }
2934*35238bceSAndroid Build Coastguard Worker
TextBody()2935*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2936*35238bceSAndroid Build Coastguard Worker {
2937*35238bceSAndroid Build Coastguard Worker return Type() +
2938*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2939*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2940*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2941*35238bceSAndroid Build Coastguard Worker "}\n";
2942*35238bceSAndroid Build Coastguard Worker }
2943*35238bceSAndroid Build Coastguard Worker };
2944*35238bceSAndroid Build Coastguard Worker
2945*35238bceSAndroid Build Coastguard Worker class OffsetsGatherInt2DRect : public PlainGatherUint2DRect
2946*35238bceSAndroid Build Coastguard Worker {
BufferData()2947*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2948*35238bceSAndroid Build Coastguard Worker {
2949*35238bceSAndroid Build Coastguard Worker return Vec4(17.9f, 7.9f, 0, 0);
2950*35238bceSAndroid Build Coastguard Worker }
2951*35238bceSAndroid Build Coastguard Worker
TextBody()2952*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2953*35238bceSAndroid Build Coastguard Worker {
2954*35238bceSAndroid Build Coastguard Worker return Type() +
2955*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2956*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2957*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2958*35238bceSAndroid Build Coastguard Worker "}\n";
2959*35238bceSAndroid Build Coastguard Worker }
2960*35238bceSAndroid Build Coastguard Worker };
2961*35238bceSAndroid Build Coastguard Worker
2962*35238bceSAndroid Build Coastguard Worker class OffsetsGatherUint2DRect : public PlainGatherUint2DRect
2963*35238bceSAndroid Build Coastguard Worker {
BufferData()2964*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2965*35238bceSAndroid Build Coastguard Worker {
2966*35238bceSAndroid Build Coastguard Worker return Vec4(17.9f, 7.9f, 0, 0);
2967*35238bceSAndroid Build Coastguard Worker }
2968*35238bceSAndroid Build Coastguard Worker
TextBody()2969*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2970*35238bceSAndroid Build Coastguard Worker {
2971*35238bceSAndroid Build Coastguard Worker return Type() +
2972*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2973*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2974*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), offsets); \n"
2975*35238bceSAndroid Build Coastguard Worker "}\n";
2976*35238bceSAndroid Build Coastguard Worker }
2977*35238bceSAndroid Build Coastguard Worker };
2978*35238bceSAndroid Build Coastguard Worker
2979*35238bceSAndroid Build Coastguard Worker class OffsetsGatherDepth2DRect : public PlainGatherDepth2DRect
2980*35238bceSAndroid Build Coastguard Worker {
BufferData()2981*35238bceSAndroid Build Coastguard Worker virtual Vec4 BufferData()
2982*35238bceSAndroid Build Coastguard Worker {
2983*35238bceSAndroid Build Coastguard Worker return Vec4(17.9f, 7.9f, 0.49f, 0);
2984*35238bceSAndroid Build Coastguard Worker }
2985*35238bceSAndroid Build Coastguard Worker
TextBody()2986*35238bceSAndroid Build Coastguard Worker virtual std::string TextBody()
2987*35238bceSAndroid Build Coastguard Worker {
2988*35238bceSAndroid Build Coastguard Worker return Type() +
2989*35238bceSAndroid Build Coastguard Worker " test_function(vec4 p) { \n"
2990*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
2991*35238bceSAndroid Build Coastguard Worker " return textureGatherOffsets(my_sampler, vec2(p.x, p.y), p.z, offsets); \n"
2992*35238bceSAndroid Build Coastguard Worker "}\n";
2993*35238bceSAndroid Build Coastguard Worker }
2994*35238bceSAndroid Build Coastguard Worker
Expected()2995*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
2996*35238bceSAndroid Build Coastguard Worker {
2997*35238bceSAndroid Build Coastguard Worker return Vec4(0, 0, 1, 1);
2998*35238bceSAndroid Build Coastguard Worker }
2999*35238bceSAndroid Build Coastguard Worker };
3000*35238bceSAndroid Build Coastguard Worker
3001*35238bceSAndroid Build Coastguard Worker class Swizzle : public PlainGatherFloat2DRgba
3002*35238bceSAndroid Build Coastguard Worker {
TestFunction()3003*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
3004*35238bceSAndroid Build Coastguard Worker {
3005*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
3006*35238bceSAndroid Build Coastguard Worker ""
3007*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
3008*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 1).yzww; \n"
3009*35238bceSAndroid Build Coastguard Worker "}\n";
3010*35238bceSAndroid Build Coastguard Worker }
3011*35238bceSAndroid Build Coastguard Worker
Expected()3012*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
3013*35238bceSAndroid Build Coastguard Worker {
3014*35238bceSAndroid Build Coastguard Worker return Vec4(5. / 16, 9. / 16, 13. / 16, 13. / 16);
3015*35238bceSAndroid Build Coastguard Worker }
3016*35238bceSAndroid Build Coastguard Worker };
3017*35238bceSAndroid Build Coastguard Worker
3018*35238bceSAndroid Build Coastguard Worker class BaseLevel : public PlainGatherFloat2DRgba
3019*35238bceSAndroid Build Coastguard Worker {
Init()3020*35238bceSAndroid Build Coastguard Worker virtual void Init()
3021*35238bceSAndroid Build Coastguard Worker {
3022*35238bceSAndroid Build Coastguard Worker CreateTexture2D(false, true);
3023*35238bceSAndroid Build Coastguard Worker }
3024*35238bceSAndroid Build Coastguard Worker };
3025*35238bceSAndroid Build Coastguard Worker
3026*35238bceSAndroid Build Coastguard Worker class IncompleteTexture : public PlainGatherFloat2DRgba
3027*35238bceSAndroid Build Coastguard Worker {
Init()3028*35238bceSAndroid Build Coastguard Worker virtual void Init()
3029*35238bceSAndroid Build Coastguard Worker {
3030*35238bceSAndroid Build Coastguard Worker CreateTexture2D();
3031*35238bceSAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, 0);
3032*35238bceSAndroid Build Coastguard Worker }
3033*35238bceSAndroid Build Coastguard Worker
Expected()3034*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
3035*35238bceSAndroid Build Coastguard Worker {
3036*35238bceSAndroid Build Coastguard Worker return Vec4(0);
3037*35238bceSAndroid Build Coastguard Worker }
3038*35238bceSAndroid Build Coastguard Worker };
3039*35238bceSAndroid Build Coastguard Worker
3040*35238bceSAndroid Build Coastguard Worker class IncompleteTextureLastComp : public PlainGatherFloat2DRgba
3041*35238bceSAndroid Build Coastguard Worker {
Init()3042*35238bceSAndroid Build Coastguard Worker virtual void Init()
3043*35238bceSAndroid Build Coastguard Worker {
3044*35238bceSAndroid Build Coastguard Worker CreateTexture2D();
3045*35238bceSAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA32F, 1, 1, 0, GL_RGBA, GL_FLOAT, 0);
3046*35238bceSAndroid Build Coastguard Worker }
3047*35238bceSAndroid Build Coastguard Worker
Expected()3048*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
3049*35238bceSAndroid Build Coastguard Worker {
3050*35238bceSAndroid Build Coastguard Worker return Vec4(1);
3051*35238bceSAndroid Build Coastguard Worker }
3052*35238bceSAndroid Build Coastguard Worker
TestFunction()3053*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
3054*35238bceSAndroid Build Coastguard Worker {
3055*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
3056*35238bceSAndroid Build Coastguard Worker ""
3057*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
3058*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 3); \n"
3059*35238bceSAndroid Build Coastguard Worker "}\n";
3060*35238bceSAndroid Build Coastguard Worker }
3061*35238bceSAndroid Build Coastguard Worker };
3062*35238bceSAndroid Build Coastguard Worker
3063*35238bceSAndroid Build Coastguard Worker class TriangleDraw : public GatherBase
3064*35238bceSAndroid Build Coastguard Worker {
3065*35238bceSAndroid Build Coastguard Worker GLuint program, rbo, fbo, vao, vbo;
3066*35238bceSAndroid Build Coastguard Worker
VertexShader()3067*35238bceSAndroid Build Coastguard Worker virtual std::string VertexShader()
3068*35238bceSAndroid Build Coastguard Worker {
3069*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3070*35238bceSAndroid Build Coastguard Worker "out vec2 texcoords; \n"
3071*35238bceSAndroid Build Coastguard Worker "in vec4 Vertex; \n"
3072*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3073*35238bceSAndroid Build Coastguard Worker " gl_Position = Vertex; \n"
3074*35238bceSAndroid Build Coastguard Worker " texcoords = (Vertex.xy + vec2(1.0)) / 2.0; \n"
3075*35238bceSAndroid Build Coastguard Worker "}\n";
3076*35238bceSAndroid Build Coastguard Worker }
3077*35238bceSAndroid Build Coastguard Worker
FragmentShader()3078*35238bceSAndroid Build Coastguard Worker virtual std::string FragmentShader()
3079*35238bceSAndroid Build Coastguard Worker {
3080*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3081*35238bceSAndroid Build Coastguard Worker "in vec2 texcoords; \n"
3082*35238bceSAndroid Build Coastguard Worker "out vec4 FragColor; \n"
3083*35238bceSAndroid Build Coastguard Worker "uniform sampler2D tex; \n"
3084*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3085*35238bceSAndroid Build Coastguard Worker " FragColor = textureGather(tex, texcoords, 2); \n"
3086*35238bceSAndroid Build Coastguard Worker "}\n";
3087*35238bceSAndroid Build Coastguard Worker }
3088*35238bceSAndroid Build Coastguard Worker
Run()3089*35238bceSAndroid Build Coastguard Worker virtual long Run()
3090*35238bceSAndroid Build Coastguard Worker {
3091*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
3092*35238bceSAndroid Build Coastguard Worker glGenRenderbuffers(1, &rbo);
3093*35238bceSAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3094*35238bceSAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 100, 100);
3095*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3096*35238bceSAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3097*35238bceSAndroid Build Coastguard Worker GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
3098*35238bceSAndroid Build Coastguard Worker glDrawBuffers(1, &drawBuffer);
3099*35238bceSAndroid Build Coastguard Worker GLfloat colorf[4] = {0, 0, 0, 0};
3100*35238bceSAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, colorf);
3101*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, 100, 100);
3102*35238bceSAndroid Build Coastguard Worker
3103*35238bceSAndroid Build Coastguard Worker program = CreateProgram(VertexShader().c_str(), NULL, NULL, NULL, FragmentShader().c_str());
3104*35238bceSAndroid Build Coastguard Worker glBindAttribLocation(program, 0, "Vertex");
3105*35238bceSAndroid Build Coastguard Worker glBindFragDataLocation(program, 0, "FragColor");
3106*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
3107*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
3108*35238bceSAndroid Build Coastguard Worker return ERROR;
3109*35238bceSAndroid Build Coastguard Worker glUseProgram(program);
3110*35238bceSAndroid Build Coastguard Worker
3111*35238bceSAndroid Build Coastguard Worker glGenTextures(1, &tex);
3112*35238bceSAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
3113*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> data(100 * 100, Vec4(0.25, 0.5, 0.75, 1));
3114*35238bceSAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 100, 100, 0, GL_RGBA, GL_FLOAT, &data[0]);
3115*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3116*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3117*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
3118*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3119*35238bceSAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3120*35238bceSAndroid Build Coastguard Worker
3121*35238bceSAndroid Build Coastguard Worker GLuint l_vao;
3122*35238bceSAndroid Build Coastguard Worker glGenVertexArrays(1, &l_vao);
3123*35238bceSAndroid Build Coastguard Worker glBindVertexArray(l_vao);
3124*35238bceSAndroid Build Coastguard Worker glGenBuffers(1, &vbo);
3125*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vbo);
3126*35238bceSAndroid Build Coastguard Worker GLfloat buffData[16] = {-1, 1, 0, 1, -1, -1, 0, 1, 1, 1, 0, 1, 1, -1, 0, 1};
3127*35238bceSAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, sizeof(buffData), buffData, GL_STATIC_DRAW);
3128*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 4, 0);
3129*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
3130*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
3131*35238bceSAndroid Build Coastguard Worker glDisableVertexAttribArray(0);
3132*35238bceSAndroid Build Coastguard Worker glDeleteVertexArrays(1, &l_vao);
3133*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, 0);
3134*35238bceSAndroid Build Coastguard Worker
3135*35238bceSAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3136*35238bceSAndroid Build Coastguard Worker std::vector<Vec4> read(100 * 100, Vec4(0));
3137*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 100, 100, GL_RGBA, GL_FLOAT, &read[0]);
3138*35238bceSAndroid Build Coastguard Worker for (unsigned int i = 0; i < read.size(); ++i)
3139*35238bceSAndroid Build Coastguard Worker {
3140*35238bceSAndroid Build Coastguard Worker if (read[i] != Vec4(0.75))
3141*35238bceSAndroid Build Coastguard Worker {
3142*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
3143*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Got: " << read[i].x() << " " << read[i].y() << " " << read[i].z()
3144*35238bceSAndroid Build Coastguard Worker << " " << read[i].w() << ", expected vec4(0.25)" << tcu::TestLog::EndMessage;
3145*35238bceSAndroid Build Coastguard Worker return ERROR;
3146*35238bceSAndroid Build Coastguard Worker }
3147*35238bceSAndroid Build Coastguard Worker }
3148*35238bceSAndroid Build Coastguard Worker
3149*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3150*35238bceSAndroid Build Coastguard Worker }
3151*35238bceSAndroid Build Coastguard Worker
Cleanup()3152*35238bceSAndroid Build Coastguard Worker virtual long Cleanup()
3153*35238bceSAndroid Build Coastguard Worker {
3154*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
3155*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, GetWindowWidth(), GetWindowHeight());
3156*35238bceSAndroid Build Coastguard Worker glDeleteTextures(1, &tex);
3157*35238bceSAndroid Build Coastguard Worker glDeleteFramebuffers(1, &fbo);
3158*35238bceSAndroid Build Coastguard Worker glDeleteRenderbuffers(1, &rbo);
3159*35238bceSAndroid Build Coastguard Worker glDeleteVertexArrays(1, &vao);
3160*35238bceSAndroid Build Coastguard Worker glDeleteBuffers(1, &vbo);
3161*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
3162*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3163*35238bceSAndroid Build Coastguard Worker }
3164*35238bceSAndroid Build Coastguard Worker };
3165*35238bceSAndroid Build Coastguard Worker
3166*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DSrgb : public GatherBase
3167*35238bceSAndroid Build Coastguard Worker {
3168*35238bceSAndroid Build Coastguard Worker public:
Expected()3169*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
3170*35238bceSAndroid Build Coastguard Worker {
3171*35238bceSAndroid Build Coastguard Worker return Vec4(0.f, 0.0512695f, 0.21582f, 0.519531f);
3172*35238bceSAndroid Build Coastguard Worker }
3173*35238bceSAndroid Build Coastguard Worker
InternalFormat()3174*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
3175*35238bceSAndroid Build Coastguard Worker {
3176*35238bceSAndroid Build Coastguard Worker return GL_SRGB8_ALPHA8;
3177*35238bceSAndroid Build Coastguard Worker }
3178*35238bceSAndroid Build Coastguard Worker };
3179*35238bceSAndroid Build Coastguard Worker
3180*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DSrgbAlpha : public GatherBase
3181*35238bceSAndroid Build Coastguard Worker {
3182*35238bceSAndroid Build Coastguard Worker public:
TestFunction()3183*35238bceSAndroid Build Coastguard Worker virtual std::string TestFunction()
3184*35238bceSAndroid Build Coastguard Worker {
3185*35238bceSAndroid Build Coastguard Worker return "uniform sampler2D my_sampler; \n"
3186*35238bceSAndroid Build Coastguard Worker ""
3187*35238bceSAndroid Build Coastguard Worker "vec4 test_function(vec4 p) { \n"
3188*35238bceSAndroid Build Coastguard Worker " return textureGather(my_sampler, vec2(p.x, p.y), 3); \n"
3189*35238bceSAndroid Build Coastguard Worker "}\n";
3190*35238bceSAndroid Build Coastguard Worker }
3191*35238bceSAndroid Build Coastguard Worker
Expected()3192*35238bceSAndroid Build Coastguard Worker virtual Vec4 Expected()
3193*35238bceSAndroid Build Coastguard Worker {
3194*35238bceSAndroid Build Coastguard Worker return Vec4(3. / 16, 7. / 16, 11. / 16, 15. / 16);
3195*35238bceSAndroid Build Coastguard Worker }
3196*35238bceSAndroid Build Coastguard Worker
InternalFormat()3197*35238bceSAndroid Build Coastguard Worker virtual GLenum InternalFormat()
3198*35238bceSAndroid Build Coastguard Worker {
3199*35238bceSAndroid Build Coastguard Worker return GL_SRGB8_ALPHA8;
3200*35238bceSAndroid Build Coastguard Worker }
3201*35238bceSAndroid Build Coastguard Worker };
3202*35238bceSAndroid Build Coastguard Worker
3203*35238bceSAndroid Build Coastguard Worker class GatherGeometryShader : public GatherBase
3204*35238bceSAndroid Build Coastguard Worker {
VertexShader()3205*35238bceSAndroid Build Coastguard Worker virtual std::string VertexShader()
3206*35238bceSAndroid Build Coastguard Worker {
3207*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3208*35238bceSAndroid Build Coastguard Worker "in vec4 v_in_0; \n"
3209*35238bceSAndroid Build Coastguard Worker "out vec4 d; \n"
3210*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3211*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0, 0, 0, 1); \n"
3212*35238bceSAndroid Build Coastguard Worker " d = v_in_0; \n"
3213*35238bceSAndroid Build Coastguard Worker "}";
3214*35238bceSAndroid Build Coastguard Worker }
3215*35238bceSAndroid Build Coastguard Worker
GeometryShader()3216*35238bceSAndroid Build Coastguard Worker virtual std::string GeometryShader()
3217*35238bceSAndroid Build Coastguard Worker {
3218*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3219*35238bceSAndroid Build Coastguard Worker "layout(points) in; \n"
3220*35238bceSAndroid Build Coastguard Worker "layout(points, max_vertices = 1) out; \n"
3221*35238bceSAndroid Build Coastguard Worker "out vec4 col; \n"
3222*35238bceSAndroid Build Coastguard Worker "in vec4 d[1]; \n"
3223*35238bceSAndroid Build Coastguard Worker "uniform sampler2D tex; \n"
3224*35238bceSAndroid Build Coastguard Worker ""
3225*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3226*35238bceSAndroid Build Coastguard Worker " vec4 v1 = textureGather(tex, vec2(d[0].x, d[0].y)); \n"
3227*35238bceSAndroid Build Coastguard Worker " vec4 v2 = textureGatherOffset(tex, vec2(d[0].x, d[0].y) - vec2(4./32), ivec2(4)); \n"
3228*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
3229*35238bceSAndroid Build Coastguard Worker " vec4 v3 = textureGatherOffsets(tex, vec2(d[0].x, d[0].y) - vec2(5./32, 18./32), offsets); \n"
3230*35238bceSAndroid Build Coastguard Worker " vec4 expected = vec4(0./16, 4./16, 8./16, 12./16); \n"
3231*35238bceSAndroid Build Coastguard Worker " float error = 0.0; \n"
3232*35238bceSAndroid Build Coastguard Worker ""
3233*35238bceSAndroid Build Coastguard Worker " if (v1 != expected) \n"
3234*35238bceSAndroid Build Coastguard Worker " error += 0.01; \n"
3235*35238bceSAndroid Build Coastguard Worker " if (v2 != expected) \n"
3236*35238bceSAndroid Build Coastguard Worker " error += 0.02; \n"
3237*35238bceSAndroid Build Coastguard Worker " if (v3 != expected) \n"
3238*35238bceSAndroid Build Coastguard Worker " error += 0.04; \n"
3239*35238bceSAndroid Build Coastguard Worker ""
3240*35238bceSAndroid Build Coastguard Worker " if (error != 0.0) \n"
3241*35238bceSAndroid Build Coastguard Worker " col = vec4(v1.x, v2.y, v3.z, d[0].x); \n"
3242*35238bceSAndroid Build Coastguard Worker " else \n"
3243*35238bceSAndroid Build Coastguard Worker " col = vec4(0, 1, 0, 1); \n"
3244*35238bceSAndroid Build Coastguard Worker ""
3245*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0, 0, 0, 1); \n"
3246*35238bceSAndroid Build Coastguard Worker " EmitVertex(); \n"
3247*35238bceSAndroid Build Coastguard Worker " EndPrimitive(); \n"
3248*35238bceSAndroid Build Coastguard Worker "}";
3249*35238bceSAndroid Build Coastguard Worker }
3250*35238bceSAndroid Build Coastguard Worker
FragmentShader()3251*35238bceSAndroid Build Coastguard Worker virtual std::string FragmentShader()
3252*35238bceSAndroid Build Coastguard Worker {
3253*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3254*35238bceSAndroid Build Coastguard Worker "in vec4 col; \n"
3255*35238bceSAndroid Build Coastguard Worker "out vec4 f_out_0; \n"
3256*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3257*35238bceSAndroid Build Coastguard Worker " f_out_0 = col; \n"
3258*35238bceSAndroid Build Coastguard Worker "}";
3259*35238bceSAndroid Build Coastguard Worker }
3260*35238bceSAndroid Build Coastguard Worker
Run()3261*35238bceSAndroid Build Coastguard Worker virtual long Run()
3262*35238bceSAndroid Build Coastguard Worker {
3263*35238bceSAndroid Build Coastguard Worker if (!Supported())
3264*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3265*35238bceSAndroid Build Coastguard Worker Init();
3266*35238bceSAndroid Build Coastguard Worker
3267*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
3268*35238bceSAndroid Build Coastguard Worker glGenRenderbuffers(1, &rbo);
3269*35238bceSAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3270*35238bceSAndroid Build Coastguard Worker SetRbo();
3271*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3272*35238bceSAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3273*35238bceSAndroid Build Coastguard Worker GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
3274*35238bceSAndroid Build Coastguard Worker glDrawBuffers(1, &drawBuffer);
3275*35238bceSAndroid Build Coastguard Worker GLfloat colorf[4] = {0, 0, 0, 0};
3276*35238bceSAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, colorf);
3277*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, 1, 1);
3278*35238bceSAndroid Build Coastguard Worker
3279*35238bceSAndroid Build Coastguard Worker glGenVertexArrays(1, &vao);
3280*35238bceSAndroid Build Coastguard Worker glBindVertexArray(vao);
3281*35238bceSAndroid Build Coastguard Worker glGenBuffers(1, &vbo);
3282*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vbo);
3283*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
3284*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
3285*35238bceSAndroid Build Coastguard Worker Vec4 buffData = BufferData();
3286*35238bceSAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, 16, &buffData, GL_STATIC_DRAW);
3287*35238bceSAndroid Build Coastguard Worker
3288*35238bceSAndroid Build Coastguard Worker program = CreateProgram(VertexShader().c_str(), NULL, NULL, GeometryShader().c_str(), FragmentShader().c_str());
3289*35238bceSAndroid Build Coastguard Worker glBindAttribLocation(program, 0, "v_in_0");
3290*35238bceSAndroid Build Coastguard Worker glBindFragDataLocation(program, 0, "f_out_0");
3291*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
3292*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
3293*35238bceSAndroid Build Coastguard Worker return ERROR;
3294*35238bceSAndroid Build Coastguard Worker glUseProgram(program);
3295*35238bceSAndroid Build Coastguard Worker
3296*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
3297*35238bceSAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3298*35238bceSAndroid Build Coastguard Worker
3299*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
3300*35238bceSAndroid Build Coastguard Worker Vec4 data;
3301*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &data);
3302*35238bceSAndroid Build Coastguard Worker if (!ColorEqual(data, Vec4(0, 1, 0, 1), g_color_eps))
3303*35238bceSAndroid Build Coastguard Worker {
3304*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
3305*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected Vec4(0, 1, 0, 1), got: " << data.x() << ", " << data.y() << ", "
3306*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << ", epsilon: " << g_color_eps.x() << ", " << g_color_eps.y() << ", "
3307*35238bceSAndroid Build Coastguard Worker << g_color_eps.z() << ", " << g_color_eps.w() << tcu::TestLog::EndMessage;
3308*35238bceSAndroid Build Coastguard Worker return ERROR;
3309*35238bceSAndroid Build Coastguard Worker }
3310*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3311*35238bceSAndroid Build Coastguard Worker }
3312*35238bceSAndroid Build Coastguard Worker };
3313*35238bceSAndroid Build Coastguard Worker
3314*35238bceSAndroid Build Coastguard Worker class GatherTesselationShader : public GatherBase
3315*35238bceSAndroid Build Coastguard Worker {
VertexShader()3316*35238bceSAndroid Build Coastguard Worker virtual std::string VertexShader()
3317*35238bceSAndroid Build Coastguard Worker {
3318*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3319*35238bceSAndroid Build Coastguard Worker "in vec4 v_in_0; \n"
3320*35238bceSAndroid Build Coastguard Worker "out vec4 d; \n"
3321*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3322*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0, 0, 0, 1); \n"
3323*35238bceSAndroid Build Coastguard Worker " d = v_in_0; \n"
3324*35238bceSAndroid Build Coastguard Worker "}";
3325*35238bceSAndroid Build Coastguard Worker }
3326*35238bceSAndroid Build Coastguard Worker
ControlShader()3327*35238bceSAndroid Build Coastguard Worker virtual std::string ControlShader()
3328*35238bceSAndroid Build Coastguard Worker {
3329*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3330*35238bceSAndroid Build Coastguard Worker "layout(vertices = 1) out; \n"
3331*35238bceSAndroid Build Coastguard Worker "out vec4 ccol[]; \n"
3332*35238bceSAndroid Build Coastguard Worker "in vec4 d[]; \n"
3333*35238bceSAndroid Build Coastguard Worker "out vec4 d_con[]; \n"
3334*35238bceSAndroid Build Coastguard Worker "uniform sampler2D tex; \n"
3335*35238bceSAndroid Build Coastguard Worker ""
3336*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3337*35238bceSAndroid Build Coastguard Worker " vec4 v1 = textureGather(tex, vec2(d[0].x, d[0].y)); \n"
3338*35238bceSAndroid Build Coastguard Worker " vec4 v2 = textureGatherOffset(tex, vec2(d[0].x, d[0].y) - vec2(4./32), ivec2(4)); \n"
3339*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); \n"
3340*35238bceSAndroid Build Coastguard Worker " vec4 v3 = textureGatherOffsets(tex, vec2(d[0].x, d[0].y) - vec2(5./32, 18./32), offsets); \n"
3341*35238bceSAndroid Build Coastguard Worker " vec4 expected = vec4(0./16, 4./16, 8./16, 12./16); \n"
3342*35238bceSAndroid Build Coastguard Worker " float error = 0.0; \n"
3343*35238bceSAndroid Build Coastguard Worker ""
3344*35238bceSAndroid Build Coastguard Worker " if (v1 != expected) \n"
3345*35238bceSAndroid Build Coastguard Worker " error += 0.01; \n"
3346*35238bceSAndroid Build Coastguard Worker " if (v2 != expected) \n"
3347*35238bceSAndroid Build Coastguard Worker " error += 0.02; \n"
3348*35238bceSAndroid Build Coastguard Worker " if (v3 != expected) \n"
3349*35238bceSAndroid Build Coastguard Worker " error += 0.04; \n"
3350*35238bceSAndroid Build Coastguard Worker ""
3351*35238bceSAndroid Build Coastguard Worker " if (error != 0.0) \n"
3352*35238bceSAndroid Build Coastguard Worker " ccol[gl_InvocationID] = vec4(v1.x, v2.y, d[0].x, 1); \n"
3353*35238bceSAndroid Build Coastguard Worker " else \n"
3354*35238bceSAndroid Build Coastguard Worker " ccol[gl_InvocationID] = vec4(0, 1, 0, 1); \n"
3355*35238bceSAndroid Build Coastguard Worker ""
3356*35238bceSAndroid Build Coastguard Worker " d_con[gl_InvocationID] = d[gl_InvocationID]; \n"
3357*35238bceSAndroid Build Coastguard Worker " gl_out[gl_InvocationID].gl_Position = vec4(0, 0, 0, 1); \n"
3358*35238bceSAndroid Build Coastguard Worker " gl_TessLevelInner[0] = 1.0; \n"
3359*35238bceSAndroid Build Coastguard Worker " gl_TessLevelOuter[0] = 1.0; \n"
3360*35238bceSAndroid Build Coastguard Worker " gl_TessLevelOuter[1] = 1.0; \n"
3361*35238bceSAndroid Build Coastguard Worker " gl_TessLevelOuter[2] = 1.0; \n"
3362*35238bceSAndroid Build Coastguard Worker "}";
3363*35238bceSAndroid Build Coastguard Worker }
3364*35238bceSAndroid Build Coastguard Worker
EvalShader()3365*35238bceSAndroid Build Coastguard Worker virtual std::string EvalShader()
3366*35238bceSAndroid Build Coastguard Worker {
3367*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3368*35238bceSAndroid Build Coastguard Worker "layout(triangles, point_mode) in; \n"
3369*35238bceSAndroid Build Coastguard Worker "in vec4 ccol[]; \n"
3370*35238bceSAndroid Build Coastguard Worker "in vec4 d_con[]; \n"
3371*35238bceSAndroid Build Coastguard Worker "out vec4 ecol; \n"
3372*35238bceSAndroid Build Coastguard Worker "uniform sampler2D tex; \n"
3373*35238bceSAndroid Build Coastguard Worker ""
3374*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3375*35238bceSAndroid Build Coastguard Worker " vec4 v1 = textureGather(tex, vec2(d_con[0].x, d_con[0].y)); "
3376*35238bceSAndroid Build Coastguard Worker " \n"
3377*35238bceSAndroid Build Coastguard Worker " vec4 v2 = textureGatherOffset(tex, vec2(d_con[0].x, d_con[0].y) - vec2(4./32), ivec2(4)); "
3378*35238bceSAndroid Build Coastguard Worker " \n"
3379*35238bceSAndroid Build Coastguard Worker " const ivec2 offsets[4] = ivec2[](ivec2(7, 6), ivec2(-8, 7), ivec2(-6, -5), ivec2(-1, 3)); "
3380*35238bceSAndroid Build Coastguard Worker " \n"
3381*35238bceSAndroid Build Coastguard Worker " vec4 v3 = textureGatherOffsets(tex, vec2(d_con[0].x, d_con[0].y) - vec2(5./32, 18./32), offsets); "
3382*35238bceSAndroid Build Coastguard Worker " \n"
3383*35238bceSAndroid Build Coastguard Worker " vec4 expected = vec4(0./16, 4./16, 8./16, 12./16); "
3384*35238bceSAndroid Build Coastguard Worker " \n"
3385*35238bceSAndroid Build Coastguard Worker " float error = 0.0; \n"
3386*35238bceSAndroid Build Coastguard Worker ""
3387*35238bceSAndroid Build Coastguard Worker " if (v1 != expected) \n"
3388*35238bceSAndroid Build Coastguard Worker " error += 0.01; \n"
3389*35238bceSAndroid Build Coastguard Worker " if (v2 != expected) \n"
3390*35238bceSAndroid Build Coastguard Worker " error += 0.02; \n"
3391*35238bceSAndroid Build Coastguard Worker " if (v3 != expected) \n"
3392*35238bceSAndroid Build Coastguard Worker " error += 0.04; \n"
3393*35238bceSAndroid Build Coastguard Worker ""
3394*35238bceSAndroid Build Coastguard Worker " if (error != 0.0) \n"
3395*35238bceSAndroid Build Coastguard Worker " ecol = vec4(v1.x, v2.y, d_con[0].x, -1); \n"
3396*35238bceSAndroid Build Coastguard Worker " else if (ccol[0] != vec4(0, 1, 0, 1)) \n"
3397*35238bceSAndroid Build Coastguard Worker " ecol = ccol[0]; \n"
3398*35238bceSAndroid Build Coastguard Worker " else \n"
3399*35238bceSAndroid Build Coastguard Worker " ecol = vec4(0, 1, 0, 1); \n"
3400*35238bceSAndroid Build Coastguard Worker ""
3401*35238bceSAndroid Build Coastguard Worker " gl_Position = vec4(0, 0, 0, 1); \n"
3402*35238bceSAndroid Build Coastguard Worker "}";
3403*35238bceSAndroid Build Coastguard Worker }
3404*35238bceSAndroid Build Coastguard Worker
FragmentShader()3405*35238bceSAndroid Build Coastguard Worker virtual std::string FragmentShader()
3406*35238bceSAndroid Build Coastguard Worker {
3407*35238bceSAndroid Build Coastguard Worker return "#version 400 \n"
3408*35238bceSAndroid Build Coastguard Worker "in vec4 ecol; \n"
3409*35238bceSAndroid Build Coastguard Worker "out vec4 f_out_0; \n"
3410*35238bceSAndroid Build Coastguard Worker "void main() { \n"
3411*35238bceSAndroid Build Coastguard Worker " f_out_0 = ecol; \n"
3412*35238bceSAndroid Build Coastguard Worker "}";
3413*35238bceSAndroid Build Coastguard Worker }
3414*35238bceSAndroid Build Coastguard Worker
Run()3415*35238bceSAndroid Build Coastguard Worker virtual long Run()
3416*35238bceSAndroid Build Coastguard Worker {
3417*35238bceSAndroid Build Coastguard Worker
3418*35238bceSAndroid Build Coastguard Worker if (!Supported())
3419*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3420*35238bceSAndroid Build Coastguard Worker Init();
3421*35238bceSAndroid Build Coastguard Worker
3422*35238bceSAndroid Build Coastguard Worker glGenFramebuffers(1, &fbo);
3423*35238bceSAndroid Build Coastguard Worker glGenRenderbuffers(1, &rbo);
3424*35238bceSAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3425*35238bceSAndroid Build Coastguard Worker SetRbo();
3426*35238bceSAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3427*35238bceSAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3428*35238bceSAndroid Build Coastguard Worker GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
3429*35238bceSAndroid Build Coastguard Worker glDrawBuffers(1, &drawBuffer);
3430*35238bceSAndroid Build Coastguard Worker GLfloat colorf[4] = {0, 0, 0, 0};
3431*35238bceSAndroid Build Coastguard Worker glClearBufferfv(GL_COLOR, 0, colorf);
3432*35238bceSAndroid Build Coastguard Worker glViewport(0, 0, 1, 1);
3433*35238bceSAndroid Build Coastguard Worker
3434*35238bceSAndroid Build Coastguard Worker glGenVertexArrays(1, &vao);
3435*35238bceSAndroid Build Coastguard Worker glBindVertexArray(vao);
3436*35238bceSAndroid Build Coastguard Worker glGenBuffers(1, &vbo);
3437*35238bceSAndroid Build Coastguard Worker glBindBuffer(GL_ARRAY_BUFFER, vbo);
3438*35238bceSAndroid Build Coastguard Worker glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
3439*35238bceSAndroid Build Coastguard Worker glEnableVertexAttribArray(0);
3440*35238bceSAndroid Build Coastguard Worker Vec4 buffData = BufferData();
3441*35238bceSAndroid Build Coastguard Worker glBufferData(GL_ARRAY_BUFFER, 16, &buffData, GL_STATIC_DRAW);
3442*35238bceSAndroid Build Coastguard Worker
3443*35238bceSAndroid Build Coastguard Worker program = CreateProgram(VertexShader().c_str(), ControlShader().c_str(), EvalShader().c_str(), NULL,
3444*35238bceSAndroid Build Coastguard Worker FragmentShader().c_str());
3445*35238bceSAndroid Build Coastguard Worker glBindAttribLocation(program, 0, "v_in_0");
3446*35238bceSAndroid Build Coastguard Worker glBindFragDataLocation(program, 0, "f_out_0");
3447*35238bceSAndroid Build Coastguard Worker glLinkProgram(program);
3448*35238bceSAndroid Build Coastguard Worker if (!CheckProgram(program))
3449*35238bceSAndroid Build Coastguard Worker return ERROR;
3450*35238bceSAndroid Build Coastguard Worker glUseProgram(program);
3451*35238bceSAndroid Build Coastguard Worker
3452*35238bceSAndroid Build Coastguard Worker glPatchParameteri(GL_PATCH_VERTICES, 1);
3453*35238bceSAndroid Build Coastguard Worker glDrawArrays(GL_PATCHES, 0, 1);
3454*35238bceSAndroid Build Coastguard Worker glReadBuffer(GL_COLOR_ATTACHMENT0);
3455*35238bceSAndroid Build Coastguard Worker
3456*35238bceSAndroid Build Coastguard Worker glDeleteProgram(program);
3457*35238bceSAndroid Build Coastguard Worker Vec4 data;
3458*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, &data);
3459*35238bceSAndroid Build Coastguard Worker if (!ColorEqual(data, Vec4(0, 1, 0, 1), g_color_eps))
3460*35238bceSAndroid Build Coastguard Worker {
3461*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().getLog()
3462*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::Message << "Expected Vec4(0, 1, 0, 1), got: " << data.x() << ", " << data.y() << ", "
3463*35238bceSAndroid Build Coastguard Worker << data.z() << ", " << data.w() << ", epsilon: " << g_color_eps.x() << ", " << g_color_eps.y() << ", "
3464*35238bceSAndroid Build Coastguard Worker << g_color_eps.z() << ", " << g_color_eps.w() << tcu::TestLog::EndMessage;
3465*35238bceSAndroid Build Coastguard Worker return ERROR;
3466*35238bceSAndroid Build Coastguard Worker }
3467*35238bceSAndroid Build Coastguard Worker return NO_ERROR;
3468*35238bceSAndroid Build Coastguard Worker }
3469*35238bceSAndroid Build Coastguard Worker };
3470*35238bceSAndroid Build Coastguard Worker
3471*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DRgb : public GatherBase
3472*35238bceSAndroid Build Coastguard Worker {
3473*35238bceSAndroid Build Coastguard Worker public:
Init()3474*35238bceSAndroid Build Coastguard Worker virtual void Init()
3475*35238bceSAndroid Build Coastguard Worker {
3476*35238bceSAndroid Build Coastguard Worker CreateTexture2DRgb();
3477*35238bceSAndroid Build Coastguard Worker }
3478*35238bceSAndroid Build Coastguard Worker };
3479*35238bceSAndroid Build Coastguard Worker
3480*35238bceSAndroid Build Coastguard Worker class PlainGatherFloat2DR : public GatherBase
3481*35238bceSAndroid Build Coastguard Worker {
3482*35238bceSAndroid Build Coastguard Worker public:
Init()3483*35238bceSAndroid Build Coastguard Worker virtual void Init()
3484*35238bceSAndroid Build Coastguard Worker {
3485*35238bceSAndroid Build Coastguard Worker CreateTexture2DR();
3486*35238bceSAndroid Build Coastguard Worker }
3487*35238bceSAndroid Build Coastguard Worker };
3488*35238bceSAndroid Build Coastguard Worker
3489*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2DRgb : public OffsetGatherFloat2D
3490*35238bceSAndroid Build Coastguard Worker {
3491*35238bceSAndroid Build Coastguard Worker public:
Init()3492*35238bceSAndroid Build Coastguard Worker virtual void Init()
3493*35238bceSAndroid Build Coastguard Worker {
3494*35238bceSAndroid Build Coastguard Worker CreateTexture2DRgb();
3495*35238bceSAndroid Build Coastguard Worker }
3496*35238bceSAndroid Build Coastguard Worker };
3497*35238bceSAndroid Build Coastguard Worker
3498*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2DRg : public OffsetGatherFloat2D
3499*35238bceSAndroid Build Coastguard Worker {
3500*35238bceSAndroid Build Coastguard Worker public:
Init()3501*35238bceSAndroid Build Coastguard Worker virtual void Init()
3502*35238bceSAndroid Build Coastguard Worker {
3503*35238bceSAndroid Build Coastguard Worker CreateTexture2DRg();
3504*35238bceSAndroid Build Coastguard Worker }
3505*35238bceSAndroid Build Coastguard Worker };
3506*35238bceSAndroid Build Coastguard Worker
3507*35238bceSAndroid Build Coastguard Worker class OffsetGatherFloat2DR : public OffsetGatherFloat2D
3508*35238bceSAndroid Build Coastguard Worker {
3509*35238bceSAndroid Build Coastguard Worker public:
Init()3510*35238bceSAndroid Build Coastguard Worker virtual void Init()
3511*35238bceSAndroid Build Coastguard Worker {
3512*35238bceSAndroid Build Coastguard Worker CreateTexture2DR();
3513*35238bceSAndroid Build Coastguard Worker }
3514*35238bceSAndroid Build Coastguard Worker };
3515*35238bceSAndroid Build Coastguard Worker
3516*35238bceSAndroid Build Coastguard Worker } // anonymous namespace
3517*35238bceSAndroid Build Coastguard Worker
TextureGatherTests(deqp::Context & context)3518*35238bceSAndroid Build Coastguard Worker TextureGatherTests::TextureGatherTests(deqp::Context &context) : TestCaseGroup(context, "texture_gather", "")
3519*35238bceSAndroid Build Coastguard Worker {
3520*35238bceSAndroid Build Coastguard Worker }
3521*35238bceSAndroid Build Coastguard Worker
~TextureGatherTests(void)3522*35238bceSAndroid Build Coastguard Worker TextureGatherTests::~TextureGatherTests(void)
3523*35238bceSAndroid Build Coastguard Worker {
3524*35238bceSAndroid Build Coastguard Worker }
3525*35238bceSAndroid Build Coastguard Worker
init()3526*35238bceSAndroid Build Coastguard Worker void TextureGatherTests::init()
3527*35238bceSAndroid Build Coastguard Worker {
3528*35238bceSAndroid Build Coastguard Worker using namespace deqp;
3529*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "api-enums", TestSubcase::Create<GatherEnumsTest>));
3530*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "gather-glsl-compile", TestSubcase::Create<GatherGLSLCompile>));
3531*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-rgba", TestSubcase::Create<PlainGatherFloat2DRgba>));
3532*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-rg", TestSubcase::Create<PlainGatherFloat2DRg>));
3533*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-unorm-2d", TestSubcase::Create<PlainGatherUnorm2D>));
3534*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-2d-rgba", TestSubcase::Create<PlainGatherInt2DRgba>));
3535*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-2d-rg", TestSubcase::Create<PlainGatherInt2DRg>));
3536*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-uint-2d", TestSubcase::Create<PlainGatherUint2D>));
3537*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-depth-2d", TestSubcase::Create<PlainGatherDepth2D>));
3538*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2darray", TestSubcase::Create<PlainGatherFloat2DArray>));
3539*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-unorm-2darray", TestSubcase::Create<PlainGatherUnorm2DArray>));
3540*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-2darray", TestSubcase::Create<PlainGatherInt2DArray>));
3541*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-uint-2darray", TestSubcase::Create<PlainGatherUint2DArray>));
3542*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-depth-2darray", TestSubcase::Create<PlainGatherDepth2DArray>));
3543*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-cube-rgba", TestSubcase::Create<PlainGatherFloatCubeRgba>));
3544*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-cube-rg", TestSubcase::Create<PlainGatherFloatCubeRg>));
3545*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-unorm-cube", TestSubcase::Create<PlainGatherUnormCube>));
3546*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-cube-rgba", TestSubcase::Create<PlainGatherIntCubeRgba>));
3547*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-cube-rg", TestSubcase::Create<PlainGatherIntCubeRg>));
3548*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-uint-cube", TestSubcase::Create<PlainGatherUintCube>));
3549*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-depth-cube", TestSubcase::Create<PlainGatherDepthCube>));
3550*35238bceSAndroid Build Coastguard Worker addChild(
3551*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "plain-gather-float-cube-array", TestSubcase::Create<PlainGatherFloatCubeArray>));
3552*35238bceSAndroid Build Coastguard Worker addChild(
3553*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "plain-gather-unorm-cube-array", TestSubcase::Create<PlainGatherUnormCubeArray>));
3554*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-cube-array", TestSubcase::Create<PlainGatherIntCubeArray>));
3555*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-uint-cube-array", TestSubcase::Create<PlainGatherUintCubeArray>));
3556*35238bceSAndroid Build Coastguard Worker addChild(
3557*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "plain-gather-depth-cube-array", TestSubcase::Create<PlainGatherDepthCubeArray>));
3558*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2drect", TestSubcase::Create<PlainGatherFloat2DRect>));
3559*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-unorm-2drect", TestSubcase::Create<PlainGatherUnorm2DRect>));
3560*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-int-2drect", TestSubcase::Create<PlainGatherInt2DRect>));
3561*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-uint-2drect", TestSubcase::Create<PlainGatherUint2DRect>));
3562*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-depth-2drect", TestSubcase::Create<PlainGatherDepth2DRect>));
3563*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2d", TestSubcase::Create<OffsetGatherFloat2D>));
3564*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-unorm-2d", TestSubcase::Create<OffsetGatherUnorm2D>));
3565*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-int-2d", TestSubcase::Create<OffsetGatherInt2D>));
3566*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-uint-2d", TestSubcase::Create<OffsetGatherUint2D>));
3567*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-depth-2d", TestSubcase::Create<OffsetGatherDepth2D>));
3568*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2darray", TestSubcase::Create<OffsetGatherFloat2DArray>));
3569*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-unorm-2darray", TestSubcase::Create<OffsetGatherUnorm2DArray>));
3570*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-int-2darray", TestSubcase::Create<OffsetGatherInt2DArray>));
3571*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-uint-2darray", TestSubcase::Create<OffsetGatherUint2DArray>));
3572*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-depth-2darray", TestSubcase::Create<OffsetGatherDepth2DArray>));
3573*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2drect", TestSubcase::Create<OffsetGatherFloat2DRect>));
3574*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-unorm-2drect", TestSubcase::Create<OffsetGatherUnorm2DRect>));
3575*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-int-2drect", TestSubcase::Create<OffsetGatherInt2DRect>));
3576*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-uint-2drect", TestSubcase::Create<OffsetGatherUint2DRect>));
3577*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-depth-2drect", TestSubcase::Create<OffsetGatherDepth2DRect>));
3578*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-float-2d", TestSubcase::Create<OffsetsGatherFloat2D>));
3579*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-unorm-2d", TestSubcase::Create<OffsetsGatherUnorm2D>));
3580*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-int-2d", TestSubcase::Create<OffsetsGatherInt2D>));
3581*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-uint-2d", TestSubcase::Create<OffsetsGatherUint2D>));
3582*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-depth-2d", TestSubcase::Create<OffsetsGatherDepth2D>));
3583*35238bceSAndroid Build Coastguard Worker addChild(
3584*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "offsets-gather-float-2darray", TestSubcase::Create<OffsetsGatherFloat2DArray>));
3585*35238bceSAndroid Build Coastguard Worker addChild(
3586*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "offsets-gather-unorm-2darray", TestSubcase::Create<OffsetsGatherUnorm2DArray>));
3587*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-int-2darray", TestSubcase::Create<OffsetsGatherInt2DArray>));
3588*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-uint-2darray", TestSubcase::Create<OffsetsGatherUint2DArray>));
3589*35238bceSAndroid Build Coastguard Worker addChild(
3590*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "offsets-gather-depth-2darray", TestSubcase::Create<OffsetsGatherDepth2DArray>));
3591*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-float-2drect", TestSubcase::Create<OffsetsGatherFloat2DRect>));
3592*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-unorm-2drect", TestSubcase::Create<OffsetsGatherUnorm2DRect>));
3593*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-int-2drect", TestSubcase::Create<OffsetsGatherInt2DRect>));
3594*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-uint-2drect", TestSubcase::Create<OffsetsGatherUint2DRect>));
3595*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offsets-gather-depth-2drect", TestSubcase::Create<OffsetsGatherDepth2DRect>));
3596*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "swizzle", TestSubcase::Create<Swizzle>));
3597*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "base-level", TestSubcase::Create<BaseLevel>));
3598*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "incomplete-texture", TestSubcase::Create<IncompleteTexture>));
3599*35238bceSAndroid Build Coastguard Worker addChild(
3600*35238bceSAndroid Build Coastguard Worker new TestSubcase(m_context, "incomplete-texture-last-comp", TestSubcase::Create<IncompleteTextureLastComp>));
3601*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "triangle-draw", TestSubcase::Create<TriangleDraw>));
3602*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-srgb", TestSubcase::Create<PlainGatherFloat2DSrgb>));
3603*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-srgb-alpha",
3604*35238bceSAndroid Build Coastguard Worker TestSubcase::Create<PlainGatherFloat2DSrgbAlpha>));
3605*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "gather-geometry-shader", TestSubcase::Create<GatherGeometryShader>));
3606*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "gather-tesselation-shader", TestSubcase::Create<GatherTesselationShader>));
3607*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-rgb", TestSubcase::Create<PlainGatherFloat2DRgb>));
3608*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "plain-gather-float-2d-r", TestSubcase::Create<PlainGatherFloat2DR>));
3609*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2d-rgb", TestSubcase::Create<OffsetGatherFloat2DRgb>));
3610*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2d-rg", TestSubcase::Create<OffsetGatherFloat2DRg>));
3611*35238bceSAndroid Build Coastguard Worker addChild(new TestSubcase(m_context, "offset-gather-float-2d-r", TestSubcase::Create<OffsetGatherFloat2DR>));
3612*35238bceSAndroid Build Coastguard Worker }
3613*35238bceSAndroid Build Coastguard Worker
3614*35238bceSAndroid Build Coastguard Worker } // namespace gl4cts
3615