xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fTextureLevelStateQueryTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
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 Texture level state query tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fTextureLevelStateQueryTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsStateQueryUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluContextInfo.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuFormatUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deUniquePtr.hpp"
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker namespace deqp
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace gles31
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker namespace Functional
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker namespace
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker using namespace gls::StateQueryUtil;
49*35238bceSAndroid Build Coastguard Worker 
textureTypeHasDepth(glw::GLenum textureBindTarget)50*35238bceSAndroid Build Coastguard Worker static bool textureTypeHasDepth(glw::GLenum textureBindTarget)
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker     switch (textureBindTarget)
53*35238bceSAndroid Build Coastguard Worker     {
54*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
55*35238bceSAndroid Build Coastguard Worker         return false;
56*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
57*35238bceSAndroid Build Coastguard Worker         return true;
58*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
59*35238bceSAndroid Build Coastguard Worker         return true;
60*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
61*35238bceSAndroid Build Coastguard Worker         return false;
62*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE:
63*35238bceSAndroid Build Coastguard Worker         return false;
64*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
65*35238bceSAndroid Build Coastguard Worker         return true;
66*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BUFFER:
67*35238bceSAndroid Build Coastguard Worker         return false;
68*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP_ARRAY:
69*35238bceSAndroid Build Coastguard Worker         return true;
70*35238bceSAndroid Build Coastguard Worker     default:
71*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
72*35238bceSAndroid Build Coastguard Worker         return false;
73*35238bceSAndroid Build Coastguard Worker     }
74*35238bceSAndroid Build Coastguard Worker }
75*35238bceSAndroid Build Coastguard Worker 
textureTypeHasHeight(glw::GLenum textureBindTarget)76*35238bceSAndroid Build Coastguard Worker static bool textureTypeHasHeight(glw::GLenum textureBindTarget)
77*35238bceSAndroid Build Coastguard Worker {
78*35238bceSAndroid Build Coastguard Worker     switch (textureBindTarget)
79*35238bceSAndroid Build Coastguard Worker     {
80*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
81*35238bceSAndroid Build Coastguard Worker         return true;
82*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
83*35238bceSAndroid Build Coastguard Worker         return true;
84*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
85*35238bceSAndroid Build Coastguard Worker         return true;
86*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
87*35238bceSAndroid Build Coastguard Worker         return true;
88*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE:
89*35238bceSAndroid Build Coastguard Worker         return true;
90*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
91*35238bceSAndroid Build Coastguard Worker         return true;
92*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BUFFER:
93*35238bceSAndroid Build Coastguard Worker         return false;
94*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP_ARRAY:
95*35238bceSAndroid Build Coastguard Worker         return true;
96*35238bceSAndroid Build Coastguard Worker     default:
97*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
98*35238bceSAndroid Build Coastguard Worker         return false;
99*35238bceSAndroid Build Coastguard Worker     }
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker 
getTextureTargetExtension(glw::GLenum target)102*35238bceSAndroid Build Coastguard Worker static const char *getTextureTargetExtension(glw::GLenum target)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker     switch (target)
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
107*35238bceSAndroid Build Coastguard Worker         return "GL_OES_texture_storage_multisample_2d_array";
108*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BUFFER:
109*35238bceSAndroid Build Coastguard Worker         return "GL_EXT_texture_buffer";
110*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP_ARRAY:
111*35238bceSAndroid Build Coastguard Worker         return "GL_EXT_texture_cube_map_array";
112*35238bceSAndroid Build Coastguard Worker     default:
113*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
114*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
115*35238bceSAndroid Build Coastguard Worker     }
116*35238bceSAndroid Build Coastguard Worker }
117*35238bceSAndroid Build Coastguard Worker 
isCoreTextureTarget(glw::GLenum target,const glu::ContextType & contextType)118*35238bceSAndroid Build Coastguard Worker static bool isCoreTextureTarget(glw::GLenum target, const glu::ContextType &contextType)
119*35238bceSAndroid Build Coastguard Worker {
120*35238bceSAndroid Build Coastguard Worker     switch (target)
121*35238bceSAndroid Build Coastguard Worker     {
122*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D:
123*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_3D:
124*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_ARRAY:
125*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP:
126*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE:
127*35238bceSAndroid Build Coastguard Worker         return true;
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
130*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BUFFER:
131*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_CUBE_MAP_ARRAY:
132*35238bceSAndroid Build Coastguard Worker         return glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
133*35238bceSAndroid Build Coastguard Worker                glu::contextSupports(contextType, glu::ApiType::core(4, 5));
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     default:
136*35238bceSAndroid Build Coastguard Worker         return false;
137*35238bceSAndroid Build Coastguard Worker     }
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker struct TextureGenerationSpec
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker     struct TextureLevelSpec
143*35238bceSAndroid Build Coastguard Worker     {
144*35238bceSAndroid Build Coastguard Worker         int width;
145*35238bceSAndroid Build Coastguard Worker         int height;
146*35238bceSAndroid Build Coastguard Worker         int depth;
147*35238bceSAndroid Build Coastguard Worker         int level;
148*35238bceSAndroid Build Coastguard Worker         glw::GLenum internalFormat;
149*35238bceSAndroid Build Coastguard Worker         bool compressed;
150*35238bceSAndroid Build Coastguard Worker 
TextureLevelSpecdeqp::gles31::Functional::__anone157aa4e0111::TextureGenerationSpec::TextureLevelSpec151*35238bceSAndroid Build Coastguard Worker         TextureLevelSpec(void) : width(0), height(0), depth(0), level(0), internalFormat(GL_RGBA), compressed(false)
152*35238bceSAndroid Build Coastguard Worker         {
153*35238bceSAndroid Build Coastguard Worker         }
154*35238bceSAndroid Build Coastguard Worker     };
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker     glw::GLenum bindTarget;
157*35238bceSAndroid Build Coastguard Worker     glw::GLenum queryTarget;
158*35238bceSAndroid Build Coastguard Worker     bool immutable;
159*35238bceSAndroid Build Coastguard Worker     bool fixedSamplePos; // !< fixed sample pos argument for multisample textures
160*35238bceSAndroid Build Coastguard Worker     int sampleCount;
161*35238bceSAndroid Build Coastguard Worker     int texBufferDataOffset;
162*35238bceSAndroid Build Coastguard Worker     int texBufferDataSize;
163*35238bceSAndroid Build Coastguard Worker     bool bindWholeArray;
164*35238bceSAndroid Build Coastguard Worker     std::vector<TextureLevelSpec> levels;
165*35238bceSAndroid Build Coastguard Worker     std::string description;
166*35238bceSAndroid Build Coastguard Worker 
TextureGenerationSpecdeqp::gles31::Functional::__anone157aa4e0111::TextureGenerationSpec167*35238bceSAndroid Build Coastguard Worker     TextureGenerationSpec(void)
168*35238bceSAndroid Build Coastguard Worker         : bindTarget(0)
169*35238bceSAndroid Build Coastguard Worker         , queryTarget(0)
170*35238bceSAndroid Build Coastguard Worker         , immutable(true)
171*35238bceSAndroid Build Coastguard Worker         , fixedSamplePos(true)
172*35238bceSAndroid Build Coastguard Worker         , sampleCount(0)
173*35238bceSAndroid Build Coastguard Worker         , texBufferDataOffset(0)
174*35238bceSAndroid Build Coastguard Worker         , texBufferDataSize(256)
175*35238bceSAndroid Build Coastguard Worker         , bindWholeArray(false)
176*35238bceSAndroid Build Coastguard Worker     {
177*35238bceSAndroid Build Coastguard Worker     }
178*35238bceSAndroid Build Coastguard Worker };
179*35238bceSAndroid Build Coastguard Worker struct IntegerPrinter
180*35238bceSAndroid Build Coastguard Worker {
getIntegerNamedeqp::gles31::Functional::__anone157aa4e0111::IntegerPrinter181*35238bceSAndroid Build Coastguard Worker     static std::string getIntegerName(int v)
182*35238bceSAndroid Build Coastguard Worker     {
183*35238bceSAndroid Build Coastguard Worker         return de::toString(v);
184*35238bceSAndroid Build Coastguard Worker     }
getFloatNamedeqp::gles31::Functional::__anone157aa4e0111::IntegerPrinter185*35238bceSAndroid Build Coastguard Worker     static std::string getFloatName(float v)
186*35238bceSAndroid Build Coastguard Worker     {
187*35238bceSAndroid Build Coastguard Worker         return de::toString(v);
188*35238bceSAndroid Build Coastguard Worker     }
189*35238bceSAndroid Build Coastguard Worker };
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker struct PixelFormatPrinter
192*35238bceSAndroid Build Coastguard Worker {
getIntegerNamedeqp::gles31::Functional::__anone157aa4e0111::PixelFormatPrinter193*35238bceSAndroid Build Coastguard Worker     static std::string getIntegerName(int v)
194*35238bceSAndroid Build Coastguard Worker     {
195*35238bceSAndroid Build Coastguard Worker         return de::toString(glu::getTextureFormatStr(v));
196*35238bceSAndroid Build Coastguard Worker     }
getFloatNamedeqp::gles31::Functional::__anone157aa4e0111::PixelFormatPrinter197*35238bceSAndroid Build Coastguard Worker     static std::string getFloatName(float v)
198*35238bceSAndroid Build Coastguard Worker     {
199*35238bceSAndroid Build Coastguard Worker         return de::toString(glu::getTextureFormatStr((int)v));
200*35238bceSAndroid Build Coastguard Worker     }
201*35238bceSAndroid Build Coastguard Worker };
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker template <typename Printer>
verifyTextureLevelParameterEqualWithPrinter(glu::CallLogWrapper & gl,glw::GLenum target,int level,glw::GLenum pname,int refValue,QueryType type)204*35238bceSAndroid Build Coastguard Worker static bool verifyTextureLevelParameterEqualWithPrinter(glu::CallLogWrapper &gl, glw::GLenum target, int level,
205*35238bceSAndroid Build Coastguard Worker                                                         glw::GLenum pname, int refValue, QueryType type)
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker     QueriedState state;
208*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector result(gl.getLog(), " // ERROR: ");
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker     gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting "
211*35238bceSAndroid Build Coastguard Worker                 << Printer::getIntegerName(refValue) << tcu::TestLog::EndMessage;
212*35238bceSAndroid Build Coastguard Worker     queryTextureLevelState(result, gl, type, target, level, pname, state);
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker     if (state.isUndefined())
215*35238bceSAndroid Build Coastguard Worker         return false;
216*35238bceSAndroid Build Coastguard Worker 
217*35238bceSAndroid Build Coastguard Worker     verifyInteger(result, state, refValue);
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker     return result.getResult() == QP_TEST_RESULT_PASS;
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker 
verifyTextureLevelParameterEqual(glu::CallLogWrapper & gl,glw::GLenum target,int level,glw::GLenum pname,int refValue,QueryType type)222*35238bceSAndroid Build Coastguard Worker static bool verifyTextureLevelParameterEqual(glu::CallLogWrapper &gl, glw::GLenum target, int level, glw::GLenum pname,
223*35238bceSAndroid Build Coastguard Worker                                              int refValue, QueryType type)
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker     return verifyTextureLevelParameterEqualWithPrinter<IntegerPrinter>(gl, target, level, pname, refValue, type);
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker 
verifyTextureLevelParameterInternalFormatEqual(glu::CallLogWrapper & gl,glw::GLenum target,int level,glw::GLenum pname,int refValue,QueryType type)228*35238bceSAndroid Build Coastguard Worker static bool verifyTextureLevelParameterInternalFormatEqual(glu::CallLogWrapper &gl, glw::GLenum target, int level,
229*35238bceSAndroid Build Coastguard Worker                                                            glw::GLenum pname, int refValue, QueryType type)
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker     return verifyTextureLevelParameterEqualWithPrinter<PixelFormatPrinter>(gl, target, level, pname, refValue, type);
232*35238bceSAndroid Build Coastguard Worker }
233*35238bceSAndroid Build Coastguard Worker 
verifyTextureLevelParameterGreaterOrEqual(glu::CallLogWrapper & gl,glw::GLenum target,int level,glw::GLenum pname,int refValue,QueryType type)234*35238bceSAndroid Build Coastguard Worker static bool verifyTextureLevelParameterGreaterOrEqual(glu::CallLogWrapper &gl, glw::GLenum target, int level,
235*35238bceSAndroid Build Coastguard Worker                                                       glw::GLenum pname, int refValue, QueryType type)
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker     QueriedState state;
238*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector result(gl.getLog(), " // ERROR: ");
239*35238bceSAndroid Build Coastguard Worker 
240*35238bceSAndroid Build Coastguard Worker     gl.getLog() << tcu::TestLog::Message << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting "
241*35238bceSAndroid Build Coastguard Worker                 << refValue << " or greater" << tcu::TestLog::EndMessage;
242*35238bceSAndroid Build Coastguard Worker     queryTextureLevelState(result, gl, type, target, level, pname, state);
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker     if (state.isUndefined())
245*35238bceSAndroid Build Coastguard Worker         return false;
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker     verifyIntegerMin(result, state, refValue);
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker     return result.getResult() == QP_TEST_RESULT_PASS;
250*35238bceSAndroid Build Coastguard Worker }
251*35238bceSAndroid Build Coastguard Worker 
verifyTextureLevelParameterInternalFormatAnyOf(glu::CallLogWrapper & gl,glw::GLenum target,int level,glw::GLenum pname,const int * refValues,int numRefValues,QueryType type)252*35238bceSAndroid Build Coastguard Worker static bool verifyTextureLevelParameterInternalFormatAnyOf(glu::CallLogWrapper &gl, glw::GLenum target, int level,
253*35238bceSAndroid Build Coastguard Worker                                                            glw::GLenum pname, const int *refValues, int numRefValues,
254*35238bceSAndroid Build Coastguard Worker                                                            QueryType type)
255*35238bceSAndroid Build Coastguard Worker {
256*35238bceSAndroid Build Coastguard Worker     QueriedState state;
257*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector result(gl.getLog(), " // ERROR: ");
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker     // Log what we try to do
260*35238bceSAndroid Build Coastguard Worker     {
261*35238bceSAndroid Build Coastguard Worker         tcu::MessageBuilder msg(&gl.getLog());
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker         msg << "Verifying " << glu::getTextureLevelParameterStr(pname) << ", expecting any of {";
264*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < numRefValues; ++ndx)
265*35238bceSAndroid Build Coastguard Worker         {
266*35238bceSAndroid Build Coastguard Worker             if (ndx != 0)
267*35238bceSAndroid Build Coastguard Worker                 msg << ", ";
268*35238bceSAndroid Build Coastguard Worker             msg << glu::getTextureFormatStr(refValues[ndx]);
269*35238bceSAndroid Build Coastguard Worker         }
270*35238bceSAndroid Build Coastguard Worker         msg << "}";
271*35238bceSAndroid Build Coastguard Worker         msg << tcu::TestLog::EndMessage;
272*35238bceSAndroid Build Coastguard Worker     }
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker     queryTextureLevelState(result, gl, type, target, level, pname, state);
275*35238bceSAndroid Build Coastguard Worker     if (state.isUndefined())
276*35238bceSAndroid Build Coastguard Worker         return false;
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker     // verify
279*35238bceSAndroid Build Coastguard Worker     switch (state.getType())
280*35238bceSAndroid Build Coastguard Worker     {
281*35238bceSAndroid Build Coastguard Worker     case DATATYPE_INTEGER:
282*35238bceSAndroid Build Coastguard Worker     {
283*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < numRefValues; ++ndx)
284*35238bceSAndroid Build Coastguard Worker             if (state.getIntAccess() == refValues[ndx])
285*35238bceSAndroid Build Coastguard Worker                 return true;
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker         gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getIntAccess() << ", ("
288*35238bceSAndroid Build Coastguard Worker                     << glu::getTextureFormatStr(state.getIntAccess()) << ")" << tcu::TestLog::EndMessage;
289*35238bceSAndroid Build Coastguard Worker         return false;
290*35238bceSAndroid Build Coastguard Worker     }
291*35238bceSAndroid Build Coastguard Worker     case DATATYPE_FLOAT:
292*35238bceSAndroid Build Coastguard Worker     {
293*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < numRefValues; ++ndx)
294*35238bceSAndroid Build Coastguard Worker             if (state.getFloatAccess() == (float)refValues[ndx])
295*35238bceSAndroid Build Coastguard Worker                 return true;
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker         gl.getLog() << tcu::TestLog::Message << "Error: got " << state.getFloatAccess() << ", ("
298*35238bceSAndroid Build Coastguard Worker                     << glu::getTextureFormatStr((int)state.getFloatAccess()) << ")" << tcu::TestLog::EndMessage;
299*35238bceSAndroid Build Coastguard Worker         return false;
300*35238bceSAndroid Build Coastguard Worker     }
301*35238bceSAndroid Build Coastguard Worker     default:
302*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
303*35238bceSAndroid Build Coastguard Worker         return false;
304*35238bceSAndroid Build Coastguard Worker     }
305*35238bceSAndroid Build Coastguard Worker }
306*35238bceSAndroid Build Coastguard Worker 
isDepthFormat(const tcu::TextureFormat & fmt)307*35238bceSAndroid Build Coastguard Worker static bool isDepthFormat(const tcu::TextureFormat &fmt)
308*35238bceSAndroid Build Coastguard Worker {
309*35238bceSAndroid Build Coastguard Worker     return fmt.order == tcu::TextureFormat::D || fmt.order == tcu::TextureFormat::DS;
310*35238bceSAndroid Build Coastguard Worker }
311*35238bceSAndroid Build Coastguard Worker 
isColorRenderableFormat(glw::GLenum internalFormat)312*35238bceSAndroid Build Coastguard Worker static bool isColorRenderableFormat(glw::GLenum internalFormat)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker     return internalFormat == GL_RGB565 || internalFormat == GL_RGBA4 || internalFormat == GL_RGB5_A1 ||
315*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGB10_A2 || internalFormat == GL_RGB10_A2UI || internalFormat == GL_SRGB8_ALPHA8 ||
316*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_R8 || internalFormat == GL_RG8 || internalFormat == GL_RGB8 ||
317*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8 || internalFormat == GL_R8I || internalFormat == GL_RG8I ||
318*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8I || internalFormat == GL_R8UI || internalFormat == GL_RG8UI ||
319*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8UI || internalFormat == GL_R16I || internalFormat == GL_RG16I ||
320*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA16I || internalFormat == GL_R16UI || internalFormat == GL_RG16UI ||
321*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA16UI || internalFormat == GL_R32I || internalFormat == GL_RG32I ||
322*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA32I || internalFormat == GL_R32UI || internalFormat == GL_RG32UI ||
323*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA32UI;
324*35238bceSAndroid Build Coastguard Worker }
325*35238bceSAndroid Build Coastguard Worker 
isRenderableFormat(glw::GLenum internalFormat)326*35238bceSAndroid Build Coastguard Worker static bool isRenderableFormat(glw::GLenum internalFormat)
327*35238bceSAndroid Build Coastguard Worker {
328*35238bceSAndroid Build Coastguard Worker     return isColorRenderableFormat(internalFormat) || internalFormat == GL_DEPTH_COMPONENT16 ||
329*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_DEPTH_COMPONENT24 || internalFormat == GL_DEPTH_COMPONENT32F ||
330*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_DEPTH24_STENCIL8 || internalFormat == GL_DEPTH32F_STENCIL8;
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker 
isTextureBufferFormat(glw::GLenum internalFormat)333*35238bceSAndroid Build Coastguard Worker static bool isTextureBufferFormat(glw::GLenum internalFormat)
334*35238bceSAndroid Build Coastguard Worker {
335*35238bceSAndroid Build Coastguard Worker     return internalFormat == GL_R8 || internalFormat == GL_R16F || internalFormat == GL_R32F ||
336*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_R8I || internalFormat == GL_R16I || internalFormat == GL_R32I ||
337*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_R8UI || internalFormat == GL_R16UI || internalFormat == GL_R32UI ||
338*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RG8 || internalFormat == GL_RG16F || internalFormat == GL_RG32F ||
339*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RG8I || internalFormat == GL_RG16I || internalFormat == GL_RG32I ||
340*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RG8UI || internalFormat == GL_RG16UI || internalFormat == GL_RG32UI ||
341*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGB32F || internalFormat == GL_RGB32I || internalFormat == GL_RGB32UI ||
342*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8 || internalFormat == GL_RGBA16F || internalFormat == GL_RGBA32F ||
343*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8I || internalFormat == GL_RGBA16I || internalFormat == GL_RGBA32I ||
344*35238bceSAndroid Build Coastguard Worker            internalFormat == GL_RGBA8UI || internalFormat == GL_RGBA16UI || internalFormat == GL_RGBA32UI;
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker 
isLegalFormatForTarget(glw::GLenum target,glw::GLenum format)347*35238bceSAndroid Build Coastguard Worker static bool isLegalFormatForTarget(glw::GLenum target, glw::GLenum format)
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat fmt = glu::mapGLInternalFormat(format);
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker     if (target == GL_TEXTURE_3D && isDepthFormat(fmt))
352*35238bceSAndroid Build Coastguard Worker         return false;
353*35238bceSAndroid Build Coastguard Worker     if ((target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) &&
354*35238bceSAndroid Build Coastguard Worker         !isRenderableFormat(format))
355*35238bceSAndroid Build Coastguard Worker         return false;
356*35238bceSAndroid Build Coastguard Worker     if (target == GL_TEXTURE_BUFFER || !isTextureBufferFormat(format))
357*35238bceSAndroid Build Coastguard Worker         return false;
358*35238bceSAndroid Build Coastguard Worker     return true;
359*35238bceSAndroid Build Coastguard Worker }
360*35238bceSAndroid Build Coastguard Worker 
isCompressionSupportedForTarget(glw::GLenum target)361*35238bceSAndroid Build Coastguard Worker static bool isCompressionSupportedForTarget(glw::GLenum target)
362*35238bceSAndroid Build Coastguard Worker {
363*35238bceSAndroid Build Coastguard Worker     return target == GL_TEXTURE_2D || target == GL_TEXTURE_2D_ARRAY;
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker 
isMultisampleTarget(glw::GLenum target)366*35238bceSAndroid Build Coastguard Worker static bool isMultisampleTarget(glw::GLenum target)
367*35238bceSAndroid Build Coastguard Worker {
368*35238bceSAndroid Build Coastguard Worker     return target == GL_TEXTURE_2D_MULTISAMPLE || target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
369*35238bceSAndroid Build Coastguard Worker }
370*35238bceSAndroid Build Coastguard Worker 
targetSupportsMipLevels(glw::GLenum target)371*35238bceSAndroid Build Coastguard Worker static bool targetSupportsMipLevels(glw::GLenum target)
372*35238bceSAndroid Build Coastguard Worker {
373*35238bceSAndroid Build Coastguard Worker     return target != GL_TEXTURE_2D_MULTISAMPLE && target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY &&
374*35238bceSAndroid Build Coastguard Worker            target != GL_TEXTURE_BUFFER;
375*35238bceSAndroid Build Coastguard Worker }
376*35238bceSAndroid Build Coastguard Worker 
getPixelSize(glw::GLenum internalFormat)377*35238bceSAndroid Build Coastguard Worker static int getPixelSize(glw::GLenum internalFormat)
378*35238bceSAndroid Build Coastguard Worker {
379*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat fmt = glu::mapGLInternalFormat(internalFormat);
380*35238bceSAndroid Build Coastguard Worker     return fmt.getPixelSize();
381*35238bceSAndroid Build Coastguard Worker }
382*35238bceSAndroid Build Coastguard Worker 
generateColorTextureGenerationGroup(std::vector<TextureGenerationSpec> & group,glw::GLenum target,int maxSamples,glw::GLenum internalFormat)383*35238bceSAndroid Build Coastguard Worker static void generateColorTextureGenerationGroup(std::vector<TextureGenerationSpec> &group, glw::GLenum target,
384*35238bceSAndroid Build Coastguard Worker                                                 int maxSamples, glw::GLenum internalFormat)
385*35238bceSAndroid Build Coastguard Worker {
386*35238bceSAndroid Build Coastguard Worker     const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker     // initial
389*35238bceSAndroid Build Coastguard Worker     {
390*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
391*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
392*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
393*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = true;
394*35238bceSAndroid Build Coastguard Worker         texGen.sampleCount = 0;
395*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", initial values";
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
398*35238bceSAndroid Build Coastguard Worker     }
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker     // ms targets
401*35238bceSAndroid Build Coastguard Worker     if (isMultisampleTarget(target))
402*35238bceSAndroid Build Coastguard Worker     {
403*35238bceSAndroid Build Coastguard Worker         {
404*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
405*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
406*35238bceSAndroid Build Coastguard Worker 
407*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget     = target;
408*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget    = queryTarget;
409*35238bceSAndroid Build Coastguard Worker             texGen.immutable      = true;
410*35238bceSAndroid Build Coastguard Worker             texGen.sampleCount    = 1;
411*35238bceSAndroid Build Coastguard Worker             texGen.fixedSamplePos = false;
412*35238bceSAndroid Build Coastguard Worker             texGen.description    = glu::getTextureTargetStr(target).toString() + ", low sample count";
413*35238bceSAndroid Build Coastguard Worker 
414*35238bceSAndroid Build Coastguard Worker             level.width          = 16;
415*35238bceSAndroid Build Coastguard Worker             level.height         = 16;
416*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
417*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
418*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
419*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
420*35238bceSAndroid Build Coastguard Worker 
421*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
422*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
423*35238bceSAndroid Build Coastguard Worker         }
424*35238bceSAndroid Build Coastguard Worker         {
425*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
426*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
427*35238bceSAndroid Build Coastguard Worker 
428*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget     = target;
429*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget    = queryTarget;
430*35238bceSAndroid Build Coastguard Worker             texGen.immutable      = true;
431*35238bceSAndroid Build Coastguard Worker             texGen.sampleCount    = maxSamples;
432*35238bceSAndroid Build Coastguard Worker             texGen.fixedSamplePos = false;
433*35238bceSAndroid Build Coastguard Worker             texGen.description    = glu::getTextureTargetStr(target).toString() + ", high sample count";
434*35238bceSAndroid Build Coastguard Worker 
435*35238bceSAndroid Build Coastguard Worker             level.width          = 32;
436*35238bceSAndroid Build Coastguard Worker             level.height         = 32;
437*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
438*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
439*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
440*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
443*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
444*35238bceSAndroid Build Coastguard Worker         }
445*35238bceSAndroid Build Coastguard Worker         {
446*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
447*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
448*35238bceSAndroid Build Coastguard Worker 
449*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget     = target;
450*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget    = queryTarget;
451*35238bceSAndroid Build Coastguard Worker             texGen.immutable      = true;
452*35238bceSAndroid Build Coastguard Worker             texGen.sampleCount    = maxSamples;
453*35238bceSAndroid Build Coastguard Worker             texGen.fixedSamplePos = true;
454*35238bceSAndroid Build Coastguard Worker             texGen.description    = glu::getTextureTargetStr(target).toString() + ", fixed sample positions";
455*35238bceSAndroid Build Coastguard Worker 
456*35238bceSAndroid Build Coastguard Worker             level.width          = 32;
457*35238bceSAndroid Build Coastguard Worker             level.height         = 32;
458*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
459*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
460*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
461*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
464*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
465*35238bceSAndroid Build Coastguard Worker         }
466*35238bceSAndroid Build Coastguard Worker     }
467*35238bceSAndroid Build Coastguard Worker     else if (target == GL_TEXTURE_BUFFER)
468*35238bceSAndroid Build Coastguard Worker     {
469*35238bceSAndroid Build Coastguard Worker         // whole buffer
470*35238bceSAndroid Build Coastguard Worker         {
471*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
472*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
473*35238bceSAndroid Build Coastguard Worker             const int baseSize = getPixelSize(internalFormat);
474*35238bceSAndroid Build Coastguard Worker 
475*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget          = target;
476*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget         = queryTarget;
477*35238bceSAndroid Build Coastguard Worker             texGen.immutable           = true;
478*35238bceSAndroid Build Coastguard Worker             texGen.description         = glu::getTextureTargetStr(target).toString() + ", whole buffer";
479*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataOffset = 0;
480*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataSize   = 32 * baseSize + (baseSize - 1);
481*35238bceSAndroid Build Coastguard Worker             texGen.bindWholeArray      = true;
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker             level.width          = 32;
484*35238bceSAndroid Build Coastguard Worker             level.height         = 1;
485*35238bceSAndroid Build Coastguard Worker             level.depth          = 1;
486*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
487*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
488*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
489*35238bceSAndroid Build Coastguard Worker 
490*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
491*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
492*35238bceSAndroid Build Coastguard Worker         }
493*35238bceSAndroid Build Coastguard Worker         // partial buffer
494*35238bceSAndroid Build Coastguard Worker         {
495*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
496*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
497*35238bceSAndroid Build Coastguard Worker             const int baseSize = getPixelSize(internalFormat);
498*35238bceSAndroid Build Coastguard Worker 
499*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget          = target;
500*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget         = queryTarget;
501*35238bceSAndroid Build Coastguard Worker             texGen.immutable           = true;
502*35238bceSAndroid Build Coastguard Worker             texGen.description         = glu::getTextureTargetStr(target).toString() + ", partial buffer";
503*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataOffset = 256;
504*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataSize   = 16 * baseSize + (baseSize - 1);
505*35238bceSAndroid Build Coastguard Worker             texGen.bindWholeArray      = false;
506*35238bceSAndroid Build Coastguard Worker 
507*35238bceSAndroid Build Coastguard Worker             level.width          = 16;
508*35238bceSAndroid Build Coastguard Worker             level.height         = 1;
509*35238bceSAndroid Build Coastguard Worker             level.depth          = 1;
510*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
511*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
512*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
513*35238bceSAndroid Build Coastguard Worker 
514*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
515*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
516*35238bceSAndroid Build Coastguard Worker         }
517*35238bceSAndroid Build Coastguard Worker     }
518*35238bceSAndroid Build Coastguard Worker     else
519*35238bceSAndroid Build Coastguard Worker     {
520*35238bceSAndroid Build Coastguard Worker         // immutable
521*35238bceSAndroid Build Coastguard Worker         {
522*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
523*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
524*35238bceSAndroid Build Coastguard Worker 
525*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget  = target;
526*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget = queryTarget;
527*35238bceSAndroid Build Coastguard Worker             texGen.immutable   = true;
528*35238bceSAndroid Build Coastguard Worker             texGen.description = glu::getTextureTargetStr(target).toString() + ", immutable";
529*35238bceSAndroid Build Coastguard Worker 
530*35238bceSAndroid Build Coastguard Worker             level.width          = 32;
531*35238bceSAndroid Build Coastguard Worker             level.height         = 32;
532*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
533*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
534*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
535*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
538*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
539*35238bceSAndroid Build Coastguard Worker         }
540*35238bceSAndroid Build Coastguard Worker         // mutable
541*35238bceSAndroid Build Coastguard Worker         {
542*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
543*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
544*35238bceSAndroid Build Coastguard Worker 
545*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget  = target;
546*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget = queryTarget;
547*35238bceSAndroid Build Coastguard Worker             texGen.immutable   = false;
548*35238bceSAndroid Build Coastguard Worker             texGen.description = glu::getTextureTargetStr(target).toString() + ", mutable";
549*35238bceSAndroid Build Coastguard Worker 
550*35238bceSAndroid Build Coastguard Worker             level.width          = 16;
551*35238bceSAndroid Build Coastguard Worker             level.height         = (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (16) : (64);
552*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
553*35238bceSAndroid Build Coastguard Worker             level.level          = 0;
554*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
555*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
558*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
559*35238bceSAndroid Build Coastguard Worker         }
560*35238bceSAndroid Build Coastguard Worker         // mip3
561*35238bceSAndroid Build Coastguard Worker         {
562*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec texGen;
563*35238bceSAndroid Build Coastguard Worker             TextureGenerationSpec::TextureLevelSpec level;
564*35238bceSAndroid Build Coastguard Worker 
565*35238bceSAndroid Build Coastguard Worker             texGen.bindTarget  = target;
566*35238bceSAndroid Build Coastguard Worker             texGen.queryTarget = queryTarget;
567*35238bceSAndroid Build Coastguard Worker             texGen.immutable   = false;
568*35238bceSAndroid Build Coastguard Worker             texGen.description = glu::getTextureTargetStr(target).toString() + ", mip level 3";
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker             level.width          = 4;
571*35238bceSAndroid Build Coastguard Worker             level.height         = (target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) ? (4) : (8);
572*35238bceSAndroid Build Coastguard Worker             level.depth          = (textureTypeHasDepth(texGen.bindTarget)) ? (6) : (1);
573*35238bceSAndroid Build Coastguard Worker             level.level          = 3;
574*35238bceSAndroid Build Coastguard Worker             level.internalFormat = internalFormat;
575*35238bceSAndroid Build Coastguard Worker             level.compressed     = false;
576*35238bceSAndroid Build Coastguard Worker 
577*35238bceSAndroid Build Coastguard Worker             texGen.levels.push_back(level);
578*35238bceSAndroid Build Coastguard Worker             group.push_back(texGen);
579*35238bceSAndroid Build Coastguard Worker         }
580*35238bceSAndroid Build Coastguard Worker     }
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker 
generateInternalFormatTextureGenerationGroup(std::vector<TextureGenerationSpec> & group,glw::GLenum target)583*35238bceSAndroid Build Coastguard Worker static void generateInternalFormatTextureGenerationGroup(std::vector<TextureGenerationSpec> &group, glw::GLenum target)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker     const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
586*35238bceSAndroid Build Coastguard Worker 
587*35238bceSAndroid Build Coastguard Worker     // Internal formats
588*35238bceSAndroid Build Coastguard Worker     static const glw::GLenum internalFormats[] = {GL_R8,
589*35238bceSAndroid Build Coastguard Worker                                                   GL_R8_SNORM,
590*35238bceSAndroid Build Coastguard Worker                                                   GL_RG8,
591*35238bceSAndroid Build Coastguard Worker                                                   GL_RG8_SNORM,
592*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB8,
593*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB8_SNORM,
594*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB565,
595*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA4,
596*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB5_A1,
597*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA8,
598*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA8_SNORM,
599*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB10_A2,
600*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB10_A2UI,
601*35238bceSAndroid Build Coastguard Worker                                                   GL_SRGB8,
602*35238bceSAndroid Build Coastguard Worker                                                   GL_SRGB8_ALPHA8,
603*35238bceSAndroid Build Coastguard Worker                                                   GL_R16F,
604*35238bceSAndroid Build Coastguard Worker                                                   GL_RG16F,
605*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB16F,
606*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA16F,
607*35238bceSAndroid Build Coastguard Worker                                                   GL_R32F,
608*35238bceSAndroid Build Coastguard Worker                                                   GL_RG32F,
609*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB32F,
610*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA32F,
611*35238bceSAndroid Build Coastguard Worker                                                   GL_R11F_G11F_B10F,
612*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB9_E5,
613*35238bceSAndroid Build Coastguard Worker                                                   GL_R8I,
614*35238bceSAndroid Build Coastguard Worker                                                   GL_R8UI,
615*35238bceSAndroid Build Coastguard Worker                                                   GL_R16I,
616*35238bceSAndroid Build Coastguard Worker                                                   GL_R16UI,
617*35238bceSAndroid Build Coastguard Worker                                                   GL_R32I,
618*35238bceSAndroid Build Coastguard Worker                                                   GL_R32UI,
619*35238bceSAndroid Build Coastguard Worker                                                   GL_RG8I,
620*35238bceSAndroid Build Coastguard Worker                                                   GL_RG8UI,
621*35238bceSAndroid Build Coastguard Worker                                                   GL_RG16I,
622*35238bceSAndroid Build Coastguard Worker                                                   GL_RG16UI,
623*35238bceSAndroid Build Coastguard Worker                                                   GL_RG32I,
624*35238bceSAndroid Build Coastguard Worker                                                   GL_RG32UI,
625*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB8I,
626*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB8UI,
627*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB16I,
628*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB16UI,
629*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB32I,
630*35238bceSAndroid Build Coastguard Worker                                                   GL_RGB32UI,
631*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA8I,
632*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA8UI,
633*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA16I,
634*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA16UI,
635*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA32I,
636*35238bceSAndroid Build Coastguard Worker                                                   GL_RGBA32UI,
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker                                                   GL_DEPTH_COMPONENT32F,
639*35238bceSAndroid Build Coastguard Worker                                                   GL_DEPTH_COMPONENT24,
640*35238bceSAndroid Build Coastguard Worker                                                   GL_DEPTH_COMPONENT16,
641*35238bceSAndroid Build Coastguard Worker                                                   GL_DEPTH32F_STENCIL8,
642*35238bceSAndroid Build Coastguard Worker                                                   GL_DEPTH24_STENCIL8};
643*35238bceSAndroid Build Coastguard Worker 
644*35238bceSAndroid Build Coastguard Worker     // initial
645*35238bceSAndroid Build Coastguard Worker     {
646*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
647*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget     = target;
648*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget    = queryTarget;
649*35238bceSAndroid Build Coastguard Worker         texGen.immutable      = true;
650*35238bceSAndroid Build Coastguard Worker         texGen.sampleCount    = 0;
651*35238bceSAndroid Build Coastguard Worker         texGen.fixedSamplePos = true;
652*35238bceSAndroid Build Coastguard Worker         texGen.description    = glu::getTextureTargetStr(target).toString() + ", initial values";
653*35238bceSAndroid Build Coastguard Worker 
654*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
655*35238bceSAndroid Build Coastguard Worker     }
656*35238bceSAndroid Build Coastguard Worker 
657*35238bceSAndroid Build Coastguard Worker     // test all formats
658*35238bceSAndroid Build Coastguard Worker     for (int internalFormatNdx = 0; internalFormatNdx < DE_LENGTH_OF_ARRAY(internalFormats); ++internalFormatNdx)
659*35238bceSAndroid Build Coastguard Worker     {
660*35238bceSAndroid Build Coastguard Worker         if (!isLegalFormatForTarget(target, internalFormats[internalFormatNdx]))
661*35238bceSAndroid Build Coastguard Worker             continue;
662*35238bceSAndroid Build Coastguard Worker 
663*35238bceSAndroid Build Coastguard Worker         const int baseSize = getPixelSize(internalFormats[internalFormatNdx]);
664*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
665*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec::TextureLevelSpec level;
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
668*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
669*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = true;
670*35238bceSAndroid Build Coastguard Worker         texGen.sampleCount = (isMultisampleTarget(target) ? (1) : (0));
671*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", internal format " +
672*35238bceSAndroid Build Coastguard Worker                              glu::getTextureFormatName(internalFormats[internalFormatNdx]);
673*35238bceSAndroid Build Coastguard Worker 
674*35238bceSAndroid Build Coastguard Worker         if (target == GL_TEXTURE_BUFFER)
675*35238bceSAndroid Build Coastguard Worker         {
676*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataOffset = 0;
677*35238bceSAndroid Build Coastguard Worker             texGen.texBufferDataSize   = 32 * baseSize + (baseSize - 1);
678*35238bceSAndroid Build Coastguard Worker             texGen.bindWholeArray      = true;
679*35238bceSAndroid Build Coastguard Worker         }
680*35238bceSAndroid Build Coastguard Worker 
681*35238bceSAndroid Build Coastguard Worker         level.width          = 32;
682*35238bceSAndroid Build Coastguard Worker         level.height         = (textureTypeHasHeight(target)) ? (32) : (1);
683*35238bceSAndroid Build Coastguard Worker         level.depth          = (textureTypeHasDepth(target)) ? (6) : (1);
684*35238bceSAndroid Build Coastguard Worker         level.level          = 0;
685*35238bceSAndroid Build Coastguard Worker         level.internalFormat = internalFormats[internalFormatNdx];
686*35238bceSAndroid Build Coastguard Worker         level.compressed     = false;
687*35238bceSAndroid Build Coastguard Worker 
688*35238bceSAndroid Build Coastguard Worker         texGen.levels.push_back(level);
689*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
690*35238bceSAndroid Build Coastguard Worker     }
691*35238bceSAndroid Build Coastguard Worker 
692*35238bceSAndroid Build Coastguard Worker     // test mutable rgba8 with mip level 3
693*35238bceSAndroid Build Coastguard Worker     if (targetSupportsMipLevels(target))
694*35238bceSAndroid Build Coastguard Worker     {
695*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
696*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec::TextureLevelSpec level;
697*35238bceSAndroid Build Coastguard Worker 
698*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
699*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
700*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = false;
701*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", internal format GL_RGBA8, mip level 3";
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker         level.width          = 32;
704*35238bceSAndroid Build Coastguard Worker         level.height         = 32;
705*35238bceSAndroid Build Coastguard Worker         level.depth          = (textureTypeHasDepth(target)) ? (6) : (1);
706*35238bceSAndroid Build Coastguard Worker         level.level          = 3;
707*35238bceSAndroid Build Coastguard Worker         level.internalFormat = GL_RGBA8;
708*35238bceSAndroid Build Coastguard Worker         level.compressed     = false;
709*35238bceSAndroid Build Coastguard Worker 
710*35238bceSAndroid Build Coastguard Worker         texGen.levels.push_back(level);
711*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
712*35238bceSAndroid Build Coastguard Worker     }
713*35238bceSAndroid Build Coastguard Worker }
714*35238bceSAndroid Build Coastguard Worker 
generateCompressedTextureGenerationGroup(std::vector<TextureGenerationSpec> & group,glw::GLenum target)715*35238bceSAndroid Build Coastguard Worker static void generateCompressedTextureGenerationGroup(std::vector<TextureGenerationSpec> &group, glw::GLenum target)
716*35238bceSAndroid Build Coastguard Worker {
717*35238bceSAndroid Build Coastguard Worker     const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
718*35238bceSAndroid Build Coastguard Worker 
719*35238bceSAndroid Build Coastguard Worker     // initial
720*35238bceSAndroid Build Coastguard Worker     {
721*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
722*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
723*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
724*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = true;
725*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", initial values";
726*35238bceSAndroid Build Coastguard Worker 
727*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
728*35238bceSAndroid Build Coastguard Worker     }
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker     // compressed
731*35238bceSAndroid Build Coastguard Worker     if (isCompressionSupportedForTarget(target))
732*35238bceSAndroid Build Coastguard Worker     {
733*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
734*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec::TextureLevelSpec level;
735*35238bceSAndroid Build Coastguard Worker 
736*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
737*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
738*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = false;
739*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", compressed";
740*35238bceSAndroid Build Coastguard Worker 
741*35238bceSAndroid Build Coastguard Worker         level.width          = 32;
742*35238bceSAndroid Build Coastguard Worker         level.height         = 32;
743*35238bceSAndroid Build Coastguard Worker         level.depth          = (target == GL_TEXTURE_2D_ARRAY) ? (2) : (1);
744*35238bceSAndroid Build Coastguard Worker         level.level          = 0;
745*35238bceSAndroid Build Coastguard Worker         level.internalFormat = GL_COMPRESSED_RGB8_ETC2;
746*35238bceSAndroid Build Coastguard Worker         level.compressed     = true;
747*35238bceSAndroid Build Coastguard Worker 
748*35238bceSAndroid Build Coastguard Worker         texGen.levels.push_back(level);
749*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
750*35238bceSAndroid Build Coastguard Worker     }
751*35238bceSAndroid Build Coastguard Worker }
752*35238bceSAndroid Build Coastguard Worker 
generateTextureBufferGenerationGroup(std::vector<TextureGenerationSpec> & group,glw::GLenum target)753*35238bceSAndroid Build Coastguard Worker static void generateTextureBufferGenerationGroup(std::vector<TextureGenerationSpec> &group, glw::GLenum target)
754*35238bceSAndroid Build Coastguard Worker {
755*35238bceSAndroid Build Coastguard Worker     const glw::GLenum queryTarget = (target == GL_TEXTURE_CUBE_MAP) ? (GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) : (target);
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker     // initial
758*35238bceSAndroid Build Coastguard Worker     {
759*35238bceSAndroid Build Coastguard Worker         TextureGenerationSpec texGen;
760*35238bceSAndroid Build Coastguard Worker         texGen.bindTarget  = target;
761*35238bceSAndroid Build Coastguard Worker         texGen.queryTarget = queryTarget;
762*35238bceSAndroid Build Coastguard Worker         texGen.immutable   = true;
763*35238bceSAndroid Build Coastguard Worker         texGen.sampleCount = 0;
764*35238bceSAndroid Build Coastguard Worker         texGen.description = glu::getTextureTargetStr(target).toString() + ", initial values";
765*35238bceSAndroid Build Coastguard Worker 
766*35238bceSAndroid Build Coastguard Worker         group.push_back(texGen);
767*35238bceSAndroid Build Coastguard Worker     }
768*35238bceSAndroid Build Coastguard Worker 
769*35238bceSAndroid Build Coastguard Worker     // actual specification tests are in texture_buffer tests, no need to do them here too
770*35238bceSAndroid Build Coastguard Worker }
771*35238bceSAndroid Build Coastguard Worker 
applyTextureGenerationSpec(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec,glw::GLuint & texBuffer)772*35238bceSAndroid Build Coastguard Worker bool applyTextureGenerationSpec(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec, glw::GLuint &texBuffer)
773*35238bceSAndroid Build Coastguard Worker {
774*35238bceSAndroid Build Coastguard Worker     bool allOk = true;
775*35238bceSAndroid Build Coastguard Worker 
776*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!(spec.immutable && spec.levels.size() > 1)); // !< immutable textures have only one level
777*35238bceSAndroid Build Coastguard Worker 
778*35238bceSAndroid Build Coastguard Worker     for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
779*35238bceSAndroid Build Coastguard Worker     {
780*35238bceSAndroid Build Coastguard Worker         const glu::TransferFormat transferFormat =
781*35238bceSAndroid Build Coastguard Worker             (spec.levels[levelNdx].compressed) ?
782*35238bceSAndroid Build Coastguard Worker                 (glu::TransferFormat()) :
783*35238bceSAndroid Build Coastguard Worker                 (glu::getTransferFormat(glu::mapGLInternalFormat(spec.levels[levelNdx].internalFormat)));
784*35238bceSAndroid Build Coastguard Worker 
785*35238bceSAndroid Build Coastguard Worker         if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
786*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
787*35238bceSAndroid Build Coastguard Worker                               spec.levels[levelNdx].height);
788*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
789*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
790*35238bceSAndroid Build Coastguard Worker                               spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
791*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
792*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
793*35238bceSAndroid Build Coastguard Worker                               spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
794*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
795*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage2D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
796*35238bceSAndroid Build Coastguard Worker                               spec.levels[levelNdx].height);
797*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE)
798*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage2DMultisample(spec.bindTarget, spec.sampleCount, spec.levels[levelNdx].internalFormat,
799*35238bceSAndroid Build Coastguard Worker                                          spec.levels[levelNdx].width, spec.levels[levelNdx].height,
800*35238bceSAndroid Build Coastguard Worker                                          (spec.fixedSamplePos) ? (GL_TRUE) : (GL_FALSE));
801*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed &&
802*35238bceSAndroid Build Coastguard Worker                  spec.bindTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
803*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage3DMultisample(spec.bindTarget, spec.sampleCount, spec.levels[levelNdx].internalFormat,
804*35238bceSAndroid Build Coastguard Worker                                          spec.levels[levelNdx].width, spec.levels[levelNdx].height,
805*35238bceSAndroid Build Coastguard Worker                                          spec.levels[levelNdx].depth, (spec.fixedSamplePos) ? (GL_TRUE) : (GL_FALSE));
806*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
807*35238bceSAndroid Build Coastguard Worker             gl.glTexStorage3D(spec.bindTarget, 1, spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
808*35238bceSAndroid Build Coastguard Worker                               spec.levels[levelNdx].height, spec.levels[levelNdx].depth);
809*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
810*35238bceSAndroid Build Coastguard Worker             gl.glTexImage2D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat,
811*35238bceSAndroid Build Coastguard Worker                             spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, transferFormat.format,
812*35238bceSAndroid Build Coastguard Worker                             transferFormat.dataType, DE_NULL);
813*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_3D)
814*35238bceSAndroid Build Coastguard Worker             gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat,
815*35238bceSAndroid Build Coastguard Worker                             spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0,
816*35238bceSAndroid Build Coastguard Worker                             transferFormat.format, transferFormat.dataType, DE_NULL);
817*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
818*35238bceSAndroid Build Coastguard Worker             gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat,
819*35238bceSAndroid Build Coastguard Worker                             spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0,
820*35238bceSAndroid Build Coastguard Worker                             transferFormat.format, transferFormat.dataType, DE_NULL);
821*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP)
822*35238bceSAndroid Build Coastguard Worker             gl.glTexImage2D(spec.queryTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat,
823*35238bceSAndroid Build Coastguard Worker                             spec.levels[levelNdx].width, spec.levels[levelNdx].height, 0, transferFormat.format,
824*35238bceSAndroid Build Coastguard Worker                             transferFormat.dataType, DE_NULL);
825*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
826*35238bceSAndroid Build Coastguard Worker             gl.glTexImage3D(spec.bindTarget, spec.levels[levelNdx].level, spec.levels[levelNdx].internalFormat,
827*35238bceSAndroid Build Coastguard Worker                             spec.levels[levelNdx].width, spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0,
828*35238bceSAndroid Build Coastguard Worker                             transferFormat.format, transferFormat.dataType, DE_NULL);
829*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D)
830*35238bceSAndroid Build Coastguard Worker         {
831*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].width == 32);
832*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].height == 32);
833*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
834*35238bceSAndroid Build Coastguard Worker 
835*35238bceSAndroid Build Coastguard Worker             static const uint8_t buffer[64 * 8] = {0};
836*35238bceSAndroid Build Coastguard Worker             gl.glCompressedTexImage2D(spec.bindTarget, spec.levels[levelNdx].level,
837*35238bceSAndroid Build Coastguard Worker                                       spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
838*35238bceSAndroid Build Coastguard Worker                                       spec.levels[levelNdx].height, 0, sizeof(buffer), buffer);
839*35238bceSAndroid Build Coastguard Worker         }
840*35238bceSAndroid Build Coastguard Worker         else if (!spec.immutable && spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_2D_ARRAY)
841*35238bceSAndroid Build Coastguard Worker         {
842*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].width == 32);
843*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].height == 32);
844*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].depth == 2);
845*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(spec.levels[levelNdx].internalFormat == GL_COMPRESSED_RGB8_ETC2);
846*35238bceSAndroid Build Coastguard Worker 
847*35238bceSAndroid Build Coastguard Worker             static const uint8_t buffer[64 * 8 * 2] = {0};
848*35238bceSAndroid Build Coastguard Worker             gl.glCompressedTexImage3D(spec.bindTarget, spec.levels[levelNdx].level,
849*35238bceSAndroid Build Coastguard Worker                                       spec.levels[levelNdx].internalFormat, spec.levels[levelNdx].width,
850*35238bceSAndroid Build Coastguard Worker                                       spec.levels[levelNdx].height, spec.levels[levelNdx].depth, 0, sizeof(buffer),
851*35238bceSAndroid Build Coastguard Worker                                       buffer);
852*35238bceSAndroid Build Coastguard Worker         }
853*35238bceSAndroid Build Coastguard Worker         else if (spec.immutable && !spec.levels[levelNdx].compressed && spec.bindTarget == GL_TEXTURE_BUFFER)
854*35238bceSAndroid Build Coastguard Worker         {
855*35238bceSAndroid Build Coastguard Worker             gl.glGenBuffers(1, &texBuffer);
856*35238bceSAndroid Build Coastguard Worker             gl.glBindBuffer(GL_TEXTURE_BUFFER, texBuffer);
857*35238bceSAndroid Build Coastguard Worker 
858*35238bceSAndroid Build Coastguard Worker             if (spec.bindWholeArray)
859*35238bceSAndroid Build Coastguard Worker             {
860*35238bceSAndroid Build Coastguard Worker                 gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataSize, DE_NULL, GL_STATIC_DRAW);
861*35238bceSAndroid Build Coastguard Worker                 gl.glTexBuffer(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer);
862*35238bceSAndroid Build Coastguard Worker             }
863*35238bceSAndroid Build Coastguard Worker             else
864*35238bceSAndroid Build Coastguard Worker             {
865*35238bceSAndroid Build Coastguard Worker                 gl.glBufferData(GL_TEXTURE_BUFFER, spec.texBufferDataOffset + spec.texBufferDataSize, DE_NULL,
866*35238bceSAndroid Build Coastguard Worker                                 GL_STATIC_DRAW);
867*35238bceSAndroid Build Coastguard Worker                 gl.glTexBufferRange(GL_TEXTURE_BUFFER, spec.levels[levelNdx].internalFormat, texBuffer,
868*35238bceSAndroid Build Coastguard Worker                                     spec.texBufferDataOffset, spec.texBufferDataSize);
869*35238bceSAndroid Build Coastguard Worker             }
870*35238bceSAndroid Build Coastguard Worker         }
871*35238bceSAndroid Build Coastguard Worker         else
872*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
873*35238bceSAndroid Build Coastguard Worker 
874*35238bceSAndroid Build Coastguard Worker         {
875*35238bceSAndroid Build Coastguard Worker             const glw::GLenum err = gl.glGetError();
876*35238bceSAndroid Build Coastguard Worker             if (err != GL_NO_ERROR)
877*35238bceSAndroid Build Coastguard Worker             {
878*35238bceSAndroid Build Coastguard Worker                 gl.getLog() << tcu::TestLog::Message
879*35238bceSAndroid Build Coastguard Worker                             << "Texture specification failed, got " + glu::getErrorStr(err).toString()
880*35238bceSAndroid Build Coastguard Worker                             << tcu::TestLog::EndMessage;
881*35238bceSAndroid Build Coastguard Worker                 allOk = false;
882*35238bceSAndroid Build Coastguard Worker             }
883*35238bceSAndroid Build Coastguard Worker         }
884*35238bceSAndroid Build Coastguard Worker     }
885*35238bceSAndroid Build Coastguard Worker 
886*35238bceSAndroid Build Coastguard Worker     return allOk;
887*35238bceSAndroid Build Coastguard Worker }
888*35238bceSAndroid Build Coastguard Worker 
889*35238bceSAndroid Build Coastguard Worker class TextureLevelCase : public TestCase
890*35238bceSAndroid Build Coastguard Worker {
891*35238bceSAndroid Build Coastguard Worker public:
892*35238bceSAndroid Build Coastguard Worker     TextureLevelCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type);
893*35238bceSAndroid Build Coastguard Worker     ~TextureLevelCase(void);
894*35238bceSAndroid Build Coastguard Worker 
895*35238bceSAndroid Build Coastguard Worker     void init(void);
896*35238bceSAndroid Build Coastguard Worker     void deinit(void);
897*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
898*35238bceSAndroid Build Coastguard Worker 
899*35238bceSAndroid Build Coastguard Worker protected:
900*35238bceSAndroid Build Coastguard Worker     void getFormatSamples(glw::GLenum internalFormat, std::vector<int> &samples);
901*35238bceSAndroid Build Coastguard Worker     bool testConfig(const TextureGenerationSpec &spec);
902*35238bceSAndroid Build Coastguard Worker     virtual bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec) = 0;
903*35238bceSAndroid Build Coastguard Worker     virtual void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)        = 0;
904*35238bceSAndroid Build Coastguard Worker 
905*35238bceSAndroid Build Coastguard Worker     const QueryType m_type;
906*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_target;
907*35238bceSAndroid Build Coastguard Worker     glw::GLuint m_texture;
908*35238bceSAndroid Build Coastguard Worker     glw::GLuint m_texBuffer;
909*35238bceSAndroid Build Coastguard Worker 
910*35238bceSAndroid Build Coastguard Worker private:
911*35238bceSAndroid Build Coastguard Worker     int m_iteration;
912*35238bceSAndroid Build Coastguard Worker     std::vector<TextureGenerationSpec> m_iterations;
913*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsOk;
914*35238bceSAndroid Build Coastguard Worker     std::vector<int> m_failedIterations;
915*35238bceSAndroid Build Coastguard Worker };
916*35238bceSAndroid Build Coastguard Worker 
TextureLevelCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)917*35238bceSAndroid Build Coastguard Worker TextureLevelCase::TextureLevelCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
918*35238bceSAndroid Build Coastguard Worker     : TestCase(ctx, name, desc)
919*35238bceSAndroid Build Coastguard Worker     , m_type(type)
920*35238bceSAndroid Build Coastguard Worker     , m_target(target)
921*35238bceSAndroid Build Coastguard Worker     , m_texture(0)
922*35238bceSAndroid Build Coastguard Worker     , m_texBuffer(0)
923*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
924*35238bceSAndroid Build Coastguard Worker     , m_allIterationsOk(true)
925*35238bceSAndroid Build Coastguard Worker {
926*35238bceSAndroid Build Coastguard Worker }
927*35238bceSAndroid Build Coastguard Worker 
~TextureLevelCase(void)928*35238bceSAndroid Build Coastguard Worker TextureLevelCase::~TextureLevelCase(void)
929*35238bceSAndroid Build Coastguard Worker {
930*35238bceSAndroid Build Coastguard Worker     deinit();
931*35238bceSAndroid Build Coastguard Worker }
932*35238bceSAndroid Build Coastguard Worker 
init(void)933*35238bceSAndroid Build Coastguard Worker void TextureLevelCase::init(void)
934*35238bceSAndroid Build Coastguard Worker {
935*35238bceSAndroid Build Coastguard Worker     if (!isCoreTextureTarget(m_target, m_context.getRenderContext().getType()))
936*35238bceSAndroid Build Coastguard Worker     {
937*35238bceSAndroid Build Coastguard Worker         const char *const targetExtension = getTextureTargetExtension(m_target);
938*35238bceSAndroid Build Coastguard Worker 
939*35238bceSAndroid Build Coastguard Worker         if (!m_context.getContextInfo().isExtensionSupported(targetExtension))
940*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Test requires " + std::string(targetExtension) + " extension");
941*35238bceSAndroid Build Coastguard Worker     }
942*35238bceSAndroid Build Coastguard Worker 
943*35238bceSAndroid Build Coastguard Worker     generateTestIterations(m_iterations);
944*35238bceSAndroid Build Coastguard Worker 
945*35238bceSAndroid Build Coastguard Worker     for (int iterationNdx = 0; iterationNdx < (int)m_iterations.size(); ++iterationNdx)
946*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_iterations[iterationNdx].bindTarget == m_target);
947*35238bceSAndroid Build Coastguard Worker }
948*35238bceSAndroid Build Coastguard Worker 
deinit(void)949*35238bceSAndroid Build Coastguard Worker void TextureLevelCase::deinit(void)
950*35238bceSAndroid Build Coastguard Worker {
951*35238bceSAndroid Build Coastguard Worker     if (m_texture)
952*35238bceSAndroid Build Coastguard Worker     {
953*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texture);
954*35238bceSAndroid Build Coastguard Worker         m_texture = 0;
955*35238bceSAndroid Build Coastguard Worker     }
956*35238bceSAndroid Build Coastguard Worker     if (m_texBuffer)
957*35238bceSAndroid Build Coastguard Worker     {
958*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteTextures(1, &m_texBuffer);
959*35238bceSAndroid Build Coastguard Worker         m_texBuffer = 0;
960*35238bceSAndroid Build Coastguard Worker     }
961*35238bceSAndroid Build Coastguard Worker }
962*35238bceSAndroid Build Coastguard Worker 
getFormatSamples(glw::GLenum internalFormat,std::vector<int> & samples)963*35238bceSAndroid Build Coastguard Worker void TextureLevelCase::getFormatSamples(glw::GLenum internalFormat, std::vector<int> &samples)
964*35238bceSAndroid Build Coastguard Worker {
965*35238bceSAndroid Build Coastguard Worker     const glw::Functions gl = m_context.getRenderContext().getFunctions();
966*35238bceSAndroid Build Coastguard Worker     int sampleCount         = -1;
967*35238bceSAndroid Build Coastguard Worker 
968*35238bceSAndroid Build Coastguard Worker     if (!isMultisampleTarget(m_target))
969*35238bceSAndroid Build Coastguard Worker         return;
970*35238bceSAndroid Build Coastguard Worker 
971*35238bceSAndroid Build Coastguard Worker     gl.getInternalformativ(m_target, internalFormat, GL_NUM_SAMPLE_COUNTS, 1, &sampleCount);
972*35238bceSAndroid Build Coastguard Worker 
973*35238bceSAndroid Build Coastguard Worker     if (sampleCount < 0)
974*35238bceSAndroid Build Coastguard Worker         throw tcu::TestError("internal format query failed");
975*35238bceSAndroid Build Coastguard Worker 
976*35238bceSAndroid Build Coastguard Worker     samples.resize(sampleCount);
977*35238bceSAndroid Build Coastguard Worker 
978*35238bceSAndroid Build Coastguard Worker     if (sampleCount > 0)
979*35238bceSAndroid Build Coastguard Worker     {
980*35238bceSAndroid Build Coastguard Worker         gl.getInternalformativ(m_target, internalFormat, GL_SAMPLES, sampleCount, &samples[0]);
981*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "get max samples");
982*35238bceSAndroid Build Coastguard Worker     }
983*35238bceSAndroid Build Coastguard Worker }
984*35238bceSAndroid Build Coastguard Worker 
iterate(void)985*35238bceSAndroid Build Coastguard Worker TextureLevelCase::IterateResult TextureLevelCase::iterate(void)
986*35238bceSAndroid Build Coastguard Worker {
987*35238bceSAndroid Build Coastguard Worker     const bool result = testConfig(m_iterations[m_iteration]);
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker     if (!result)
990*35238bceSAndroid Build Coastguard Worker     {
991*35238bceSAndroid Build Coastguard Worker         m_failedIterations.push_back(m_iteration);
992*35238bceSAndroid Build Coastguard Worker         m_allIterationsOk = false;
993*35238bceSAndroid Build Coastguard Worker     }
994*35238bceSAndroid Build Coastguard Worker 
995*35238bceSAndroid Build Coastguard Worker     if (++m_iteration < (int)m_iterations.size())
996*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
997*35238bceSAndroid Build Coastguard Worker 
998*35238bceSAndroid Build Coastguard Worker     if (m_allIterationsOk)
999*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1000*35238bceSAndroid Build Coastguard Worker     else
1001*35238bceSAndroid Build Coastguard Worker     {
1002*35238bceSAndroid Build Coastguard Worker         tcu::MessageBuilder msg(&m_testCtx.getLog());
1003*35238bceSAndroid Build Coastguard Worker 
1004*35238bceSAndroid Build Coastguard Worker         msg << "Following iteration(s) failed: ";
1005*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < (int)m_failedIterations.size(); ++ndx)
1006*35238bceSAndroid Build Coastguard Worker         {
1007*35238bceSAndroid Build Coastguard Worker             if (ndx)
1008*35238bceSAndroid Build Coastguard Worker                 msg << ", ";
1009*35238bceSAndroid Build Coastguard Worker             msg << (m_failedIterations[ndx] + 1);
1010*35238bceSAndroid Build Coastguard Worker         }
1011*35238bceSAndroid Build Coastguard Worker         msg << tcu::TestLog::EndMessage;
1012*35238bceSAndroid Build Coastguard Worker 
1013*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "One or more iterations failed");
1014*35238bceSAndroid Build Coastguard Worker     }
1015*35238bceSAndroid Build Coastguard Worker     return STOP;
1016*35238bceSAndroid Build Coastguard Worker }
1017*35238bceSAndroid Build Coastguard Worker 
testConfig(const TextureGenerationSpec & spec)1018*35238bceSAndroid Build Coastguard Worker bool TextureLevelCase::testConfig(const TextureGenerationSpec &spec)
1019*35238bceSAndroid Build Coastguard Worker {
1020*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration",
1021*35238bceSAndroid Build Coastguard Worker                                         std::string() + "Iteration " + de::toString(m_iteration + 1) + "/" +
1022*35238bceSAndroid Build Coastguard Worker                                             de::toString((int)m_iterations.size()) + " - " + spec.description);
1023*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1024*35238bceSAndroid Build Coastguard Worker     bool result;
1025*35238bceSAndroid Build Coastguard Worker 
1026*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
1027*35238bceSAndroid Build Coastguard Worker 
1028*35238bceSAndroid Build Coastguard Worker     gl.glGenTextures(1, &m_texture);
1029*35238bceSAndroid Build Coastguard Worker     gl.glBindTexture(spec.bindTarget, m_texture);
1030*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
1031*35238bceSAndroid Build Coastguard Worker 
1032*35238bceSAndroid Build Coastguard Worker     // Set the state
1033*35238bceSAndroid Build Coastguard Worker     applyTextureGenerationSpec(gl, spec, m_texBuffer);
1034*35238bceSAndroid Build Coastguard Worker 
1035*35238bceSAndroid Build Coastguard Worker     // Verify the state
1036*35238bceSAndroid Build Coastguard Worker     result = checkTextureState(gl, spec);
1037*35238bceSAndroid Build Coastguard Worker 
1038*35238bceSAndroid Build Coastguard Worker     gl.glDeleteTextures(1, &m_texture);
1039*35238bceSAndroid Build Coastguard Worker     m_texture = 0;
1040*35238bceSAndroid Build Coastguard Worker 
1041*35238bceSAndroid Build Coastguard Worker     if (m_texBuffer)
1042*35238bceSAndroid Build Coastguard Worker     {
1043*35238bceSAndroid Build Coastguard Worker         gl.glDeleteBuffers(1, &m_texBuffer);
1044*35238bceSAndroid Build Coastguard Worker         m_texture = 0;
1045*35238bceSAndroid Build Coastguard Worker     }
1046*35238bceSAndroid Build Coastguard Worker 
1047*35238bceSAndroid Build Coastguard Worker     return result;
1048*35238bceSAndroid Build Coastguard Worker }
1049*35238bceSAndroid Build Coastguard Worker 
1050*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
1051*35238bceSAndroid Build Coastguard Worker  * \brief Test texture target
1052*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
1053*35238bceSAndroid Build Coastguard Worker class TextureLevelCommonCase : public TextureLevelCase
1054*35238bceSAndroid Build Coastguard Worker {
1055*35238bceSAndroid Build Coastguard Worker public:
1056*35238bceSAndroid Build Coastguard Worker     TextureLevelCommonCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type);
1057*35238bceSAndroid Build Coastguard Worker 
1058*35238bceSAndroid Build Coastguard Worker protected:
1059*35238bceSAndroid Build Coastguard Worker     virtual void generateTestIterations(std::vector<TextureGenerationSpec> &iterations);
1060*35238bceSAndroid Build Coastguard Worker };
1061*35238bceSAndroid Build Coastguard Worker 
TextureLevelCommonCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1062*35238bceSAndroid Build Coastguard Worker TextureLevelCommonCase::TextureLevelCommonCase(Context &ctx, const char *name, const char *desc, glw::GLenum target,
1063*35238bceSAndroid Build Coastguard Worker                                                QueryType type)
1064*35238bceSAndroid Build Coastguard Worker     : TextureLevelCase(ctx, name, desc, target, type)
1065*35238bceSAndroid Build Coastguard Worker {
1066*35238bceSAndroid Build Coastguard Worker }
1067*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1068*35238bceSAndroid Build Coastguard Worker void TextureLevelCommonCase::generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1069*35238bceSAndroid Build Coastguard Worker {
1070*35238bceSAndroid Build Coastguard Worker     const glw::GLenum internalFormat = GL_RGBA8;
1071*35238bceSAndroid Build Coastguard Worker     int maxSamples;
1072*35238bceSAndroid Build Coastguard Worker     std::vector<int> samples;
1073*35238bceSAndroid Build Coastguard Worker 
1074*35238bceSAndroid Build Coastguard Worker     getFormatSamples(internalFormat, samples);
1075*35238bceSAndroid Build Coastguard Worker     if (samples.empty())
1076*35238bceSAndroid Build Coastguard Worker         maxSamples = -1;
1077*35238bceSAndroid Build Coastguard Worker     else
1078*35238bceSAndroid Build Coastguard Worker         maxSamples = samples[0];
1079*35238bceSAndroid Build Coastguard Worker 
1080*35238bceSAndroid Build Coastguard Worker     generateColorTextureGenerationGroup(iterations, m_target, maxSamples, internalFormat);
1081*35238bceSAndroid Build Coastguard Worker }
1082*35238bceSAndroid Build Coastguard Worker 
1083*35238bceSAndroid Build Coastguard Worker class TextureLevelSampleCase : public TextureLevelCommonCase
1084*35238bceSAndroid Build Coastguard Worker {
1085*35238bceSAndroid Build Coastguard Worker public:
TextureLevelSampleCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1086*35238bceSAndroid Build Coastguard Worker     TextureLevelSampleCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1087*35238bceSAndroid Build Coastguard Worker         : TextureLevelCommonCase(ctx, name, desc, target, type)
1088*35238bceSAndroid Build Coastguard Worker     {
1089*35238bceSAndroid Build Coastguard Worker     }
1090*35238bceSAndroid Build Coastguard Worker 
1091*35238bceSAndroid Build Coastguard Worker private:
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1092*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1093*35238bceSAndroid Build Coastguard Worker     {
1094*35238bceSAndroid Build Coastguard Worker         const int queryLevel = (spec.levels.empty()) ? (0) : (spec.levels[0].level);
1095*35238bceSAndroid Build Coastguard Worker         const int refValue   = (spec.levels.empty()) ? (0) : (spec.sampleCount);
1096*35238bceSAndroid Build Coastguard Worker 
1097*35238bceSAndroid Build Coastguard Worker         return verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_SAMPLES, refValue,
1098*35238bceSAndroid Build Coastguard Worker                                                          m_type);
1099*35238bceSAndroid Build Coastguard Worker     }
1100*35238bceSAndroid Build Coastguard Worker };
1101*35238bceSAndroid Build Coastguard Worker 
1102*35238bceSAndroid Build Coastguard Worker class TextureLevelFixedSamplesCase : public TextureLevelCommonCase
1103*35238bceSAndroid Build Coastguard Worker {
1104*35238bceSAndroid Build Coastguard Worker public:
TextureLevelFixedSamplesCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1105*35238bceSAndroid Build Coastguard Worker     TextureLevelFixedSamplesCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1106*35238bceSAndroid Build Coastguard Worker         : TextureLevelCommonCase(ctx, name, desc, target, type)
1107*35238bceSAndroid Build Coastguard Worker     {
1108*35238bceSAndroid Build Coastguard Worker     }
1109*35238bceSAndroid Build Coastguard Worker 
1110*35238bceSAndroid Build Coastguard Worker private:
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1111*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1112*35238bceSAndroid Build Coastguard Worker     {
1113*35238bceSAndroid Build Coastguard Worker         const int queryLevel = (spec.levels.empty()) ? (0) : (spec.levels[0].level);
1114*35238bceSAndroid Build Coastguard Worker         const int refValue   = (spec.levels.empty()) ? (1) : ((spec.fixedSamplePos) ? (1) : (0));
1115*35238bceSAndroid Build Coastguard Worker 
1116*35238bceSAndroid Build Coastguard Worker         return verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_FIXED_SAMPLE_LOCATIONS,
1117*35238bceSAndroid Build Coastguard Worker                                                 refValue, m_type);
1118*35238bceSAndroid Build Coastguard Worker     }
1119*35238bceSAndroid Build Coastguard Worker };
1120*35238bceSAndroid Build Coastguard Worker 
1121*35238bceSAndroid Build Coastguard Worker class TextureLevelWidthCase : public TextureLevelCommonCase
1122*35238bceSAndroid Build Coastguard Worker {
1123*35238bceSAndroid Build Coastguard Worker public:
TextureLevelWidthCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1124*35238bceSAndroid Build Coastguard Worker     TextureLevelWidthCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1125*35238bceSAndroid Build Coastguard Worker         : TextureLevelCommonCase(ctx, name, desc, target, type)
1126*35238bceSAndroid Build Coastguard Worker     {
1127*35238bceSAndroid Build Coastguard Worker     }
1128*35238bceSAndroid Build Coastguard Worker 
1129*35238bceSAndroid Build Coastguard Worker private:
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1130*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1131*35238bceSAndroid Build Coastguard Worker     {
1132*35238bceSAndroid Build Coastguard Worker         const int initialValue = 0;
1133*35238bceSAndroid Build Coastguard Worker         bool allOk             = true;
1134*35238bceSAndroid Build Coastguard Worker 
1135*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1136*35238bceSAndroid Build Coastguard Worker         {
1137*35238bceSAndroid Build Coastguard Worker             const int queryLevel = 0;
1138*35238bceSAndroid Build Coastguard Worker             const int refValue   = initialValue;
1139*35238bceSAndroid Build Coastguard Worker 
1140*35238bceSAndroid Build Coastguard Worker             allOk &=
1141*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue, m_type);
1142*35238bceSAndroid Build Coastguard Worker         }
1143*35238bceSAndroid Build Coastguard Worker         else
1144*35238bceSAndroid Build Coastguard Worker         {
1145*35238bceSAndroid Build Coastguard Worker             for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1146*35238bceSAndroid Build Coastguard Worker             {
1147*35238bceSAndroid Build Coastguard Worker                 const int queryLevel = spec.levels[levelNdx].level;
1148*35238bceSAndroid Build Coastguard Worker                 const int refValue   = spec.levels[levelNdx].width;
1149*35238bceSAndroid Build Coastguard Worker 
1150*35238bceSAndroid Build Coastguard Worker                 allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_WIDTH, refValue,
1151*35238bceSAndroid Build Coastguard Worker                                                           m_type);
1152*35238bceSAndroid Build Coastguard Worker             }
1153*35238bceSAndroid Build Coastguard Worker         }
1154*35238bceSAndroid Build Coastguard Worker 
1155*35238bceSAndroid Build Coastguard Worker         return allOk;
1156*35238bceSAndroid Build Coastguard Worker     }
1157*35238bceSAndroid Build Coastguard Worker };
1158*35238bceSAndroid Build Coastguard Worker 
1159*35238bceSAndroid Build Coastguard Worker class TextureLevelHeightCase : public TextureLevelCommonCase
1160*35238bceSAndroid Build Coastguard Worker {
1161*35238bceSAndroid Build Coastguard Worker public:
TextureLevelHeightCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1162*35238bceSAndroid Build Coastguard Worker     TextureLevelHeightCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1163*35238bceSAndroid Build Coastguard Worker         : TextureLevelCommonCase(ctx, name, desc, target, type)
1164*35238bceSAndroid Build Coastguard Worker     {
1165*35238bceSAndroid Build Coastguard Worker     }
1166*35238bceSAndroid Build Coastguard Worker 
1167*35238bceSAndroid Build Coastguard Worker private:
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1168*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1169*35238bceSAndroid Build Coastguard Worker     {
1170*35238bceSAndroid Build Coastguard Worker         const int initialValue = 0;
1171*35238bceSAndroid Build Coastguard Worker         bool allOk             = true;
1172*35238bceSAndroid Build Coastguard Worker 
1173*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1174*35238bceSAndroid Build Coastguard Worker         {
1175*35238bceSAndroid Build Coastguard Worker             const int queryLevel = 0;
1176*35238bceSAndroid Build Coastguard Worker             const int refValue   = initialValue;
1177*35238bceSAndroid Build Coastguard Worker 
1178*35238bceSAndroid Build Coastguard Worker             allOk &=
1179*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue, m_type);
1180*35238bceSAndroid Build Coastguard Worker         }
1181*35238bceSAndroid Build Coastguard Worker         else
1182*35238bceSAndroid Build Coastguard Worker         {
1183*35238bceSAndroid Build Coastguard Worker             for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1184*35238bceSAndroid Build Coastguard Worker             {
1185*35238bceSAndroid Build Coastguard Worker                 const int queryLevel = spec.levels[levelNdx].level;
1186*35238bceSAndroid Build Coastguard Worker                 const int refValue   = spec.levels[levelNdx].height;
1187*35238bceSAndroid Build Coastguard Worker 
1188*35238bceSAndroid Build Coastguard Worker                 allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_HEIGHT, refValue,
1189*35238bceSAndroid Build Coastguard Worker                                                           m_type);
1190*35238bceSAndroid Build Coastguard Worker             }
1191*35238bceSAndroid Build Coastguard Worker         }
1192*35238bceSAndroid Build Coastguard Worker 
1193*35238bceSAndroid Build Coastguard Worker         return allOk;
1194*35238bceSAndroid Build Coastguard Worker     }
1195*35238bceSAndroid Build Coastguard Worker };
1196*35238bceSAndroid Build Coastguard Worker 
1197*35238bceSAndroid Build Coastguard Worker class TextureLevelDepthCase : public TextureLevelCommonCase
1198*35238bceSAndroid Build Coastguard Worker {
1199*35238bceSAndroid Build Coastguard Worker public:
TextureLevelDepthCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1200*35238bceSAndroid Build Coastguard Worker     TextureLevelDepthCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1201*35238bceSAndroid Build Coastguard Worker         : TextureLevelCommonCase(ctx, name, desc, target, type)
1202*35238bceSAndroid Build Coastguard Worker     {
1203*35238bceSAndroid Build Coastguard Worker     }
1204*35238bceSAndroid Build Coastguard Worker 
1205*35238bceSAndroid Build Coastguard Worker private:
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1206*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1207*35238bceSAndroid Build Coastguard Worker     {
1208*35238bceSAndroid Build Coastguard Worker         const int initialValue = 0;
1209*35238bceSAndroid Build Coastguard Worker         bool allOk             = true;
1210*35238bceSAndroid Build Coastguard Worker 
1211*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1212*35238bceSAndroid Build Coastguard Worker         {
1213*35238bceSAndroid Build Coastguard Worker             const int queryLevel = 0;
1214*35238bceSAndroid Build Coastguard Worker             const int refValue   = initialValue;
1215*35238bceSAndroid Build Coastguard Worker 
1216*35238bceSAndroid Build Coastguard Worker             allOk &=
1217*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue, m_type);
1218*35238bceSAndroid Build Coastguard Worker         }
1219*35238bceSAndroid Build Coastguard Worker         else
1220*35238bceSAndroid Build Coastguard Worker         {
1221*35238bceSAndroid Build Coastguard Worker             for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1222*35238bceSAndroid Build Coastguard Worker             {
1223*35238bceSAndroid Build Coastguard Worker                 const int queryLevel = spec.levels[levelNdx].level;
1224*35238bceSAndroid Build Coastguard Worker                 const int refValue   = spec.levels[levelNdx].depth;
1225*35238bceSAndroid Build Coastguard Worker 
1226*35238bceSAndroid Build Coastguard Worker                 allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_DEPTH, refValue,
1227*35238bceSAndroid Build Coastguard Worker                                                           m_type);
1228*35238bceSAndroid Build Coastguard Worker             }
1229*35238bceSAndroid Build Coastguard Worker         }
1230*35238bceSAndroid Build Coastguard Worker 
1231*35238bceSAndroid Build Coastguard Worker         return allOk;
1232*35238bceSAndroid Build Coastguard Worker     }
1233*35238bceSAndroid Build Coastguard Worker };
1234*35238bceSAndroid Build Coastguard Worker 
1235*35238bceSAndroid Build Coastguard Worker class TextureLevelInternalFormatCase : public TextureLevelCase
1236*35238bceSAndroid Build Coastguard Worker {
1237*35238bceSAndroid Build Coastguard Worker public:
TextureLevelInternalFormatCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1238*35238bceSAndroid Build Coastguard Worker     TextureLevelInternalFormatCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1239*35238bceSAndroid Build Coastguard Worker         : TextureLevelCase(ctx, name, desc, target, type)
1240*35238bceSAndroid Build Coastguard Worker     {
1241*35238bceSAndroid Build Coastguard Worker     }
1242*35238bceSAndroid Build Coastguard Worker 
1243*35238bceSAndroid Build Coastguard Worker private:
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1244*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1245*35238bceSAndroid Build Coastguard Worker     {
1246*35238bceSAndroid Build Coastguard Worker         generateInternalFormatTextureGenerationGroup(iterations, m_target);
1247*35238bceSAndroid Build Coastguard Worker     }
1248*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1249*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1250*35238bceSAndroid Build Coastguard Worker     {
1251*35238bceSAndroid Build Coastguard Worker         bool allOk = true;
1252*35238bceSAndroid Build Coastguard Worker 
1253*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1254*35238bceSAndroid Build Coastguard Worker         {
1255*35238bceSAndroid Build Coastguard Worker             const int queryLevel       = 0;
1256*35238bceSAndroid Build Coastguard Worker             const int initialValues[2] = {GL_RGBA, GL_R8};
1257*35238bceSAndroid Build Coastguard Worker 
1258*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterInternalFormatAnyOf(gl, spec.queryTarget, queryLevel,
1259*35238bceSAndroid Build Coastguard Worker                                                                     GL_TEXTURE_INTERNAL_FORMAT, initialValues,
1260*35238bceSAndroid Build Coastguard Worker                                                                     DE_LENGTH_OF_ARRAY(initialValues), m_type);
1261*35238bceSAndroid Build Coastguard Worker         }
1262*35238bceSAndroid Build Coastguard Worker         else
1263*35238bceSAndroid Build Coastguard Worker         {
1264*35238bceSAndroid Build Coastguard Worker             for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1265*35238bceSAndroid Build Coastguard Worker             {
1266*35238bceSAndroid Build Coastguard Worker                 const int queryLevel = spec.levels[levelNdx].level;
1267*35238bceSAndroid Build Coastguard Worker                 const int refValue   = spec.levels[levelNdx].internalFormat;
1268*35238bceSAndroid Build Coastguard Worker 
1269*35238bceSAndroid Build Coastguard Worker                 allOk &= verifyTextureLevelParameterInternalFormatEqual(gl, spec.queryTarget, queryLevel,
1270*35238bceSAndroid Build Coastguard Worker                                                                         GL_TEXTURE_INTERNAL_FORMAT, refValue, m_type);
1271*35238bceSAndroid Build Coastguard Worker             }
1272*35238bceSAndroid Build Coastguard Worker         }
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker         return allOk;
1275*35238bceSAndroid Build Coastguard Worker     }
1276*35238bceSAndroid Build Coastguard Worker };
1277*35238bceSAndroid Build Coastguard Worker 
1278*35238bceSAndroid Build Coastguard Worker class TextureLevelSizeCase : public TextureLevelCase
1279*35238bceSAndroid Build Coastguard Worker {
1280*35238bceSAndroid Build Coastguard Worker public:
1281*35238bceSAndroid Build Coastguard Worker     TextureLevelSizeCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type,
1282*35238bceSAndroid Build Coastguard Worker                          glw::GLenum pname);
1283*35238bceSAndroid Build Coastguard Worker 
1284*35238bceSAndroid Build Coastguard Worker private:
1285*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations);
1286*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec);
1287*35238bceSAndroid Build Coastguard Worker     int getMinimumComponentResolution(glw::GLenum internalFormat);
1288*35238bceSAndroid Build Coastguard Worker 
1289*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_pname;
1290*35238bceSAndroid Build Coastguard Worker };
1291*35238bceSAndroid Build Coastguard Worker 
TextureLevelSizeCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type,glw::GLenum pname)1292*35238bceSAndroid Build Coastguard Worker TextureLevelSizeCase::TextureLevelSizeCase(Context &ctx, const char *name, const char *desc, glw::GLenum target,
1293*35238bceSAndroid Build Coastguard Worker                                            QueryType type, glw::GLenum pname)
1294*35238bceSAndroid Build Coastguard Worker     : TextureLevelCase(ctx, name, desc, target, type)
1295*35238bceSAndroid Build Coastguard Worker     , m_pname(pname)
1296*35238bceSAndroid Build Coastguard Worker {
1297*35238bceSAndroid Build Coastguard Worker }
1298*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1299*35238bceSAndroid Build Coastguard Worker void TextureLevelSizeCase::generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1300*35238bceSAndroid Build Coastguard Worker {
1301*35238bceSAndroid Build Coastguard Worker     generateInternalFormatTextureGenerationGroup(iterations, m_target);
1302*35238bceSAndroid Build Coastguard Worker }
1303*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1304*35238bceSAndroid Build Coastguard Worker bool TextureLevelSizeCase::checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1305*35238bceSAndroid Build Coastguard Worker {
1306*35238bceSAndroid Build Coastguard Worker     bool allOk = true;
1307*35238bceSAndroid Build Coastguard Worker 
1308*35238bceSAndroid Build Coastguard Worker     if (spec.levels.empty())
1309*35238bceSAndroid Build Coastguard Worker     {
1310*35238bceSAndroid Build Coastguard Worker         allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, 0, m_type);
1311*35238bceSAndroid Build Coastguard Worker     }
1312*35238bceSAndroid Build Coastguard Worker     else
1313*35238bceSAndroid Build Coastguard Worker     {
1314*35238bceSAndroid Build Coastguard Worker         for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1315*35238bceSAndroid Build Coastguard Worker         {
1316*35238bceSAndroid Build Coastguard Worker             const int queryLevel = spec.levels[levelNdx].level;
1317*35238bceSAndroid Build Coastguard Worker             const int refValue   = getMinimumComponentResolution(spec.levels[levelNdx].internalFormat);
1318*35238bceSAndroid Build Coastguard Worker 
1319*35238bceSAndroid Build Coastguard Worker             allOk &=
1320*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterGreaterOrEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
1321*35238bceSAndroid Build Coastguard Worker         }
1322*35238bceSAndroid Build Coastguard Worker     }
1323*35238bceSAndroid Build Coastguard Worker 
1324*35238bceSAndroid Build Coastguard Worker     return allOk;
1325*35238bceSAndroid Build Coastguard Worker }
1326*35238bceSAndroid Build Coastguard Worker 
getMinimumComponentResolution(glw::GLenum internalFormat)1327*35238bceSAndroid Build Coastguard Worker int TextureLevelSizeCase::getMinimumComponentResolution(glw::GLenum internalFormat)
1328*35238bceSAndroid Build Coastguard Worker {
1329*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format  = glu::mapGLInternalFormat(internalFormat);
1330*35238bceSAndroid Build Coastguard Worker     const tcu::IVec4 channelBitDepth = tcu::getTextureFormatBitDepth(format);
1331*35238bceSAndroid Build Coastguard Worker 
1332*35238bceSAndroid Build Coastguard Worker     switch (m_pname)
1333*35238bceSAndroid Build Coastguard Worker     {
1334*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_RED_SIZE:
1335*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::R || format.order == tcu::TextureFormat::RG ||
1336*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::RGB || format.order == tcu::TextureFormat::RGBA ||
1337*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::BGRA || format.order == tcu::TextureFormat::ARGB ||
1338*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGB || format.order == tcu::TextureFormat::sRGBA)
1339*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[0];
1340*35238bceSAndroid Build Coastguard Worker         else
1341*35238bceSAndroid Build Coastguard Worker             return 0;
1342*35238bceSAndroid Build Coastguard Worker 
1343*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_GREEN_SIZE:
1344*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RG || format.order == tcu::TextureFormat::RGB ||
1345*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::RGBA || format.order == tcu::TextureFormat::BGRA ||
1346*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::ARGB || format.order == tcu::TextureFormat::sRGB ||
1347*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGBA)
1348*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[1];
1349*35238bceSAndroid Build Coastguard Worker         else
1350*35238bceSAndroid Build Coastguard Worker             return 0;
1351*35238bceSAndroid Build Coastguard Worker 
1352*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BLUE_SIZE:
1353*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RGB || format.order == tcu::TextureFormat::RGBA ||
1354*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::BGRA || format.order == tcu::TextureFormat::ARGB ||
1355*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGB || format.order == tcu::TextureFormat::sRGBA)
1356*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[2];
1357*35238bceSAndroid Build Coastguard Worker         else
1358*35238bceSAndroid Build Coastguard Worker             return 0;
1359*35238bceSAndroid Build Coastguard Worker 
1360*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_ALPHA_SIZE:
1361*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RGBA || format.order == tcu::TextureFormat::BGRA ||
1362*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::ARGB || format.order == tcu::TextureFormat::sRGBA)
1363*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[3];
1364*35238bceSAndroid Build Coastguard Worker         else
1365*35238bceSAndroid Build Coastguard Worker             return 0;
1366*35238bceSAndroid Build Coastguard Worker 
1367*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_DEPTH_SIZE:
1368*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::D || format.order == tcu::TextureFormat::DS)
1369*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[0];
1370*35238bceSAndroid Build Coastguard Worker         else
1371*35238bceSAndroid Build Coastguard Worker             return 0;
1372*35238bceSAndroid Build Coastguard Worker 
1373*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_STENCIL_SIZE:
1374*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::DS)
1375*35238bceSAndroid Build Coastguard Worker             return channelBitDepth[3];
1376*35238bceSAndroid Build Coastguard Worker         else
1377*35238bceSAndroid Build Coastguard Worker             return 0;
1378*35238bceSAndroid Build Coastguard Worker 
1379*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_SHARED_SIZE:
1380*35238bceSAndroid Build Coastguard Worker         if (internalFormat == GL_RGB9_E5)
1381*35238bceSAndroid Build Coastguard Worker             return 5;
1382*35238bceSAndroid Build Coastguard Worker         else
1383*35238bceSAndroid Build Coastguard Worker             return 0;
1384*35238bceSAndroid Build Coastguard Worker     default:
1385*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1386*35238bceSAndroid Build Coastguard Worker         return 0;
1387*35238bceSAndroid Build Coastguard Worker     }
1388*35238bceSAndroid Build Coastguard Worker }
1389*35238bceSAndroid Build Coastguard Worker 
1390*35238bceSAndroid Build Coastguard Worker class TextureLevelTypeCase : public TextureLevelCase
1391*35238bceSAndroid Build Coastguard Worker {
1392*35238bceSAndroid Build Coastguard Worker public:
1393*35238bceSAndroid Build Coastguard Worker     TextureLevelTypeCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type,
1394*35238bceSAndroid Build Coastguard Worker                          glw::GLenum pname);
1395*35238bceSAndroid Build Coastguard Worker 
1396*35238bceSAndroid Build Coastguard Worker private:
1397*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations);
1398*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec);
1399*35238bceSAndroid Build Coastguard Worker     int getComponentType(glw::GLenum internalFormat);
1400*35238bceSAndroid Build Coastguard Worker 
1401*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_pname;
1402*35238bceSAndroid Build Coastguard Worker };
1403*35238bceSAndroid Build Coastguard Worker 
TextureLevelTypeCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type,glw::GLenum pname)1404*35238bceSAndroid Build Coastguard Worker TextureLevelTypeCase::TextureLevelTypeCase(Context &ctx, const char *name, const char *desc, glw::GLenum target,
1405*35238bceSAndroid Build Coastguard Worker                                            QueryType type, glw::GLenum pname)
1406*35238bceSAndroid Build Coastguard Worker     : TextureLevelCase(ctx, name, desc, target, type)
1407*35238bceSAndroid Build Coastguard Worker     , m_pname(pname)
1408*35238bceSAndroid Build Coastguard Worker {
1409*35238bceSAndroid Build Coastguard Worker }
1410*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1411*35238bceSAndroid Build Coastguard Worker void TextureLevelTypeCase::generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1412*35238bceSAndroid Build Coastguard Worker {
1413*35238bceSAndroid Build Coastguard Worker     generateInternalFormatTextureGenerationGroup(iterations, m_target);
1414*35238bceSAndroid Build Coastguard Worker }
1415*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1416*35238bceSAndroid Build Coastguard Worker bool TextureLevelTypeCase::checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1417*35238bceSAndroid Build Coastguard Worker {
1418*35238bceSAndroid Build Coastguard Worker     bool allOk = true;
1419*35238bceSAndroid Build Coastguard Worker 
1420*35238bceSAndroid Build Coastguard Worker     if (spec.levels.empty())
1421*35238bceSAndroid Build Coastguard Worker     {
1422*35238bceSAndroid Build Coastguard Worker         allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, m_pname, GL_NONE, m_type);
1423*35238bceSAndroid Build Coastguard Worker     }
1424*35238bceSAndroid Build Coastguard Worker     else
1425*35238bceSAndroid Build Coastguard Worker     {
1426*35238bceSAndroid Build Coastguard Worker         for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1427*35238bceSAndroid Build Coastguard Worker         {
1428*35238bceSAndroid Build Coastguard Worker             const int queryLevel = spec.levels[levelNdx].level;
1429*35238bceSAndroid Build Coastguard Worker             const int refValue   = getComponentType(spec.levels[levelNdx].internalFormat);
1430*35238bceSAndroid Build Coastguard Worker 
1431*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, m_pname, refValue, m_type);
1432*35238bceSAndroid Build Coastguard Worker         }
1433*35238bceSAndroid Build Coastguard Worker     }
1434*35238bceSAndroid Build Coastguard Worker 
1435*35238bceSAndroid Build Coastguard Worker     return allOk;
1436*35238bceSAndroid Build Coastguard Worker }
1437*35238bceSAndroid Build Coastguard Worker 
getComponentType(glw::GLenum internalFormat)1438*35238bceSAndroid Build Coastguard Worker int TextureLevelTypeCase::getComponentType(glw::GLenum internalFormat)
1439*35238bceSAndroid Build Coastguard Worker {
1440*35238bceSAndroid Build Coastguard Worker     const tcu::TextureFormat format             = glu::mapGLInternalFormat(internalFormat);
1441*35238bceSAndroid Build Coastguard Worker     const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type);
1442*35238bceSAndroid Build Coastguard Worker     glw::GLenum channelType                     = GL_NONE;
1443*35238bceSAndroid Build Coastguard Worker 
1444*35238bceSAndroid Build Coastguard Worker     // depth-stencil special cases
1445*35238bceSAndroid Build Coastguard Worker     if (format.type == tcu::TextureFormat::UNSIGNED_INT_24_8)
1446*35238bceSAndroid Build Coastguard Worker     {
1447*35238bceSAndroid Build Coastguard Worker         if (m_pname == GL_TEXTURE_DEPTH_TYPE)
1448*35238bceSAndroid Build Coastguard Worker             return GL_UNSIGNED_NORMALIZED;
1449*35238bceSAndroid Build Coastguard Worker         else
1450*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1451*35238bceSAndroid Build Coastguard Worker     }
1452*35238bceSAndroid Build Coastguard Worker     else if (format.type == tcu::TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV)
1453*35238bceSAndroid Build Coastguard Worker     {
1454*35238bceSAndroid Build Coastguard Worker         if (m_pname == GL_TEXTURE_DEPTH_TYPE)
1455*35238bceSAndroid Build Coastguard Worker             return GL_FLOAT;
1456*35238bceSAndroid Build Coastguard Worker         else
1457*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1458*35238bceSAndroid Build Coastguard Worker     }
1459*35238bceSAndroid Build Coastguard Worker     else
1460*35238bceSAndroid Build Coastguard Worker     {
1461*35238bceSAndroid Build Coastguard Worker         switch (channelClass)
1462*35238bceSAndroid Build Coastguard Worker         {
1463*35238bceSAndroid Build Coastguard Worker         case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT:
1464*35238bceSAndroid Build Coastguard Worker             channelType = GL_SIGNED_NORMALIZED;
1465*35238bceSAndroid Build Coastguard Worker             break;
1466*35238bceSAndroid Build Coastguard Worker         case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
1467*35238bceSAndroid Build Coastguard Worker             channelType = GL_UNSIGNED_NORMALIZED;
1468*35238bceSAndroid Build Coastguard Worker             break;
1469*35238bceSAndroid Build Coastguard Worker         case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
1470*35238bceSAndroid Build Coastguard Worker             channelType = GL_INT;
1471*35238bceSAndroid Build Coastguard Worker             break;
1472*35238bceSAndroid Build Coastguard Worker         case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
1473*35238bceSAndroid Build Coastguard Worker             channelType = GL_UNSIGNED_INT;
1474*35238bceSAndroid Build Coastguard Worker             break;
1475*35238bceSAndroid Build Coastguard Worker         case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
1476*35238bceSAndroid Build Coastguard Worker             channelType = GL_FLOAT;
1477*35238bceSAndroid Build Coastguard Worker             break;
1478*35238bceSAndroid Build Coastguard Worker         default:
1479*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1480*35238bceSAndroid Build Coastguard Worker         }
1481*35238bceSAndroid Build Coastguard Worker     }
1482*35238bceSAndroid Build Coastguard Worker 
1483*35238bceSAndroid Build Coastguard Worker     switch (m_pname)
1484*35238bceSAndroid Build Coastguard Worker     {
1485*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_RED_TYPE:
1486*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::R || format.order == tcu::TextureFormat::RG ||
1487*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::RGB || format.order == tcu::TextureFormat::RGBA ||
1488*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::BGRA || format.order == tcu::TextureFormat::ARGB ||
1489*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGB || format.order == tcu::TextureFormat::sRGBA)
1490*35238bceSAndroid Build Coastguard Worker             return channelType;
1491*35238bceSAndroid Build Coastguard Worker         else
1492*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1493*35238bceSAndroid Build Coastguard Worker 
1494*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_GREEN_TYPE:
1495*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RG || format.order == tcu::TextureFormat::RGB ||
1496*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::RGBA || format.order == tcu::TextureFormat::BGRA ||
1497*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::ARGB || format.order == tcu::TextureFormat::sRGB ||
1498*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGBA)
1499*35238bceSAndroid Build Coastguard Worker             return channelType;
1500*35238bceSAndroid Build Coastguard Worker         else
1501*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1502*35238bceSAndroid Build Coastguard Worker 
1503*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_BLUE_TYPE:
1504*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RGB || format.order == tcu::TextureFormat::RGBA ||
1505*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::BGRA || format.order == tcu::TextureFormat::ARGB ||
1506*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::sRGB || format.order == tcu::TextureFormat::sRGBA)
1507*35238bceSAndroid Build Coastguard Worker             return channelType;
1508*35238bceSAndroid Build Coastguard Worker         else
1509*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1510*35238bceSAndroid Build Coastguard Worker 
1511*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_ALPHA_TYPE:
1512*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::RGBA || format.order == tcu::TextureFormat::BGRA ||
1513*35238bceSAndroid Build Coastguard Worker             format.order == tcu::TextureFormat::ARGB || format.order == tcu::TextureFormat::sRGBA)
1514*35238bceSAndroid Build Coastguard Worker             return channelType;
1515*35238bceSAndroid Build Coastguard Worker         else
1516*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1517*35238bceSAndroid Build Coastguard Worker 
1518*35238bceSAndroid Build Coastguard Worker     case GL_TEXTURE_DEPTH_TYPE:
1519*35238bceSAndroid Build Coastguard Worker         if (format.order == tcu::TextureFormat::D || format.order == tcu::TextureFormat::DS)
1520*35238bceSAndroid Build Coastguard Worker             return channelType;
1521*35238bceSAndroid Build Coastguard Worker         else
1522*35238bceSAndroid Build Coastguard Worker             return GL_NONE;
1523*35238bceSAndroid Build Coastguard Worker 
1524*35238bceSAndroid Build Coastguard Worker     default:
1525*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1526*35238bceSAndroid Build Coastguard Worker         return 0;
1527*35238bceSAndroid Build Coastguard Worker     }
1528*35238bceSAndroid Build Coastguard Worker }
1529*35238bceSAndroid Build Coastguard Worker 
1530*35238bceSAndroid Build Coastguard Worker class TextureLevelCompressedCase : public TextureLevelCase
1531*35238bceSAndroid Build Coastguard Worker {
1532*35238bceSAndroid Build Coastguard Worker public:
TextureLevelCompressedCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1533*35238bceSAndroid Build Coastguard Worker     TextureLevelCompressedCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1534*35238bceSAndroid Build Coastguard Worker         : TextureLevelCase(ctx, name, desc, target, type)
1535*35238bceSAndroid Build Coastguard Worker     {
1536*35238bceSAndroid Build Coastguard Worker     }
1537*35238bceSAndroid Build Coastguard Worker 
1538*35238bceSAndroid Build Coastguard Worker private:
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1539*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1540*35238bceSAndroid Build Coastguard Worker     {
1541*35238bceSAndroid Build Coastguard Worker         generateCompressedTextureGenerationGroup(iterations, m_target);
1542*35238bceSAndroid Build Coastguard Worker     }
1543*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1544*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1545*35238bceSAndroid Build Coastguard Worker     {
1546*35238bceSAndroid Build Coastguard Worker         bool allOk = true;
1547*35238bceSAndroid Build Coastguard Worker 
1548*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1549*35238bceSAndroid Build Coastguard Worker         {
1550*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_COMPRESSED, 0, m_type);
1551*35238bceSAndroid Build Coastguard Worker         }
1552*35238bceSAndroid Build Coastguard Worker         else
1553*35238bceSAndroid Build Coastguard Worker         {
1554*35238bceSAndroid Build Coastguard Worker             for (int levelNdx = 0; levelNdx < (int)spec.levels.size(); ++levelNdx)
1555*35238bceSAndroid Build Coastguard Worker             {
1556*35238bceSAndroid Build Coastguard Worker                 const int queryLevel = spec.levels[levelNdx].level;
1557*35238bceSAndroid Build Coastguard Worker                 const int refValue   = (spec.levels[levelNdx].compressed) ? (1) : (0);
1558*35238bceSAndroid Build Coastguard Worker 
1559*35238bceSAndroid Build Coastguard Worker                 allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, queryLevel, GL_TEXTURE_COMPRESSED,
1560*35238bceSAndroid Build Coastguard Worker                                                           refValue, m_type);
1561*35238bceSAndroid Build Coastguard Worker             }
1562*35238bceSAndroid Build Coastguard Worker         }
1563*35238bceSAndroid Build Coastguard Worker 
1564*35238bceSAndroid Build Coastguard Worker         return allOk;
1565*35238bceSAndroid Build Coastguard Worker     }
1566*35238bceSAndroid Build Coastguard Worker };
1567*35238bceSAndroid Build Coastguard Worker 
checkSupport(Context & ctx)1568*35238bceSAndroid Build Coastguard Worker static bool checkSupport(Context &ctx)
1569*35238bceSAndroid Build Coastguard Worker {
1570*35238bceSAndroid Build Coastguard Worker     auto ctxType = ctx.getRenderContext().getType();
1571*35238bceSAndroid Build Coastguard Worker     return contextSupports(ctxType, glu::ApiType::es(3, 2)) || contextSupports(ctxType, glu::ApiType::core(4, 5)) ||
1572*35238bceSAndroid Build Coastguard Worker            ctx.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer");
1573*35238bceSAndroid Build Coastguard Worker }
1574*35238bceSAndroid Build Coastguard Worker 
1575*35238bceSAndroid Build Coastguard Worker class TextureLevelBufferDataStoreCase : public TextureLevelCase
1576*35238bceSAndroid Build Coastguard Worker {
1577*35238bceSAndroid Build Coastguard Worker public:
TextureLevelBufferDataStoreCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1578*35238bceSAndroid Build Coastguard Worker     TextureLevelBufferDataStoreCase(Context &ctx, const char *name, const char *desc, glw::GLenum target,
1579*35238bceSAndroid Build Coastguard Worker                                     QueryType type)
1580*35238bceSAndroid Build Coastguard Worker         : TextureLevelCase(ctx, name, desc, target, type)
1581*35238bceSAndroid Build Coastguard Worker     {
1582*35238bceSAndroid Build Coastguard Worker     }
1583*35238bceSAndroid Build Coastguard Worker 
1584*35238bceSAndroid Build Coastguard Worker private:
init(void)1585*35238bceSAndroid Build Coastguard Worker     void init(void)
1586*35238bceSAndroid Build Coastguard Worker     {
1587*35238bceSAndroid Build Coastguard Worker         if (!checkSupport(m_context))
1588*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1589*35238bceSAndroid Build Coastguard Worker         TextureLevelCase::init();
1590*35238bceSAndroid Build Coastguard Worker     }
1591*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1592*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1593*35238bceSAndroid Build Coastguard Worker     {
1594*35238bceSAndroid Build Coastguard Worker         generateTextureBufferGenerationGroup(iterations, m_target);
1595*35238bceSAndroid Build Coastguard Worker     }
1596*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1597*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1598*35238bceSAndroid Build Coastguard Worker     {
1599*35238bceSAndroid Build Coastguard Worker         bool allOk = true;
1600*35238bceSAndroid Build Coastguard Worker 
1601*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1602*35238bceSAndroid Build Coastguard Worker         {
1603*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING, 0,
1604*35238bceSAndroid Build Coastguard Worker                                                       m_type);
1605*35238bceSAndroid Build Coastguard Worker         }
1606*35238bceSAndroid Build Coastguard Worker         else
1607*35238bceSAndroid Build Coastguard Worker         {
1608*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_DATA_STORE_BINDING,
1609*35238bceSAndroid Build Coastguard Worker                                                       m_texBuffer, m_type);
1610*35238bceSAndroid Build Coastguard Worker         }
1611*35238bceSAndroid Build Coastguard Worker 
1612*35238bceSAndroid Build Coastguard Worker         return allOk;
1613*35238bceSAndroid Build Coastguard Worker     }
1614*35238bceSAndroid Build Coastguard Worker };
1615*35238bceSAndroid Build Coastguard Worker 
1616*35238bceSAndroid Build Coastguard Worker class TextureLevelBufferDataOffsetCase : public TextureLevelCase
1617*35238bceSAndroid Build Coastguard Worker {
1618*35238bceSAndroid Build Coastguard Worker public:
TextureLevelBufferDataOffsetCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1619*35238bceSAndroid Build Coastguard Worker     TextureLevelBufferDataOffsetCase(Context &ctx, const char *name, const char *desc, glw::GLenum target,
1620*35238bceSAndroid Build Coastguard Worker                                      QueryType type)
1621*35238bceSAndroid Build Coastguard Worker         : TextureLevelCase(ctx, name, desc, target, type)
1622*35238bceSAndroid Build Coastguard Worker     {
1623*35238bceSAndroid Build Coastguard Worker     }
1624*35238bceSAndroid Build Coastguard Worker 
1625*35238bceSAndroid Build Coastguard Worker private:
init(void)1626*35238bceSAndroid Build Coastguard Worker     void init(void)
1627*35238bceSAndroid Build Coastguard Worker     {
1628*35238bceSAndroid Build Coastguard Worker         if (!checkSupport(m_context))
1629*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1630*35238bceSAndroid Build Coastguard Worker         TextureLevelCase::init();
1631*35238bceSAndroid Build Coastguard Worker     }
1632*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1633*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1634*35238bceSAndroid Build Coastguard Worker     {
1635*35238bceSAndroid Build Coastguard Worker         generateTextureBufferGenerationGroup(iterations, m_target);
1636*35238bceSAndroid Build Coastguard Worker     }
1637*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1638*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1639*35238bceSAndroid Build Coastguard Worker     {
1640*35238bceSAndroid Build Coastguard Worker         bool allOk = true;
1641*35238bceSAndroid Build Coastguard Worker 
1642*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1643*35238bceSAndroid Build Coastguard Worker         {
1644*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, 0, m_type);
1645*35238bceSAndroid Build Coastguard Worker         }
1646*35238bceSAndroid Build Coastguard Worker         else
1647*35238bceSAndroid Build Coastguard Worker         {
1648*35238bceSAndroid Build Coastguard Worker             const int refValue = spec.texBufferDataOffset;
1649*35238bceSAndroid Build Coastguard Worker 
1650*35238bceSAndroid Build Coastguard Worker             allOk &=
1651*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_OFFSET, refValue, m_type);
1652*35238bceSAndroid Build Coastguard Worker         }
1653*35238bceSAndroid Build Coastguard Worker 
1654*35238bceSAndroid Build Coastguard Worker         return allOk;
1655*35238bceSAndroid Build Coastguard Worker     }
1656*35238bceSAndroid Build Coastguard Worker };
1657*35238bceSAndroid Build Coastguard Worker 
1658*35238bceSAndroid Build Coastguard Worker class TextureLevelBufferDataSizeCase : public TextureLevelCase
1659*35238bceSAndroid Build Coastguard Worker {
1660*35238bceSAndroid Build Coastguard Worker public:
TextureLevelBufferDataSizeCase(Context & ctx,const char * name,const char * desc,glw::GLenum target,QueryType type)1661*35238bceSAndroid Build Coastguard Worker     TextureLevelBufferDataSizeCase(Context &ctx, const char *name, const char *desc, glw::GLenum target, QueryType type)
1662*35238bceSAndroid Build Coastguard Worker         : TextureLevelCase(ctx, name, desc, target, type)
1663*35238bceSAndroid Build Coastguard Worker     {
1664*35238bceSAndroid Build Coastguard Worker     }
1665*35238bceSAndroid Build Coastguard Worker 
1666*35238bceSAndroid Build Coastguard Worker private:
init(void)1667*35238bceSAndroid Build Coastguard Worker     void init(void)
1668*35238bceSAndroid Build Coastguard Worker     {
1669*35238bceSAndroid Build Coastguard Worker         if (!checkSupport(m_context))
1670*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
1671*35238bceSAndroid Build Coastguard Worker         TextureLevelCase::init();
1672*35238bceSAndroid Build Coastguard Worker     }
1673*35238bceSAndroid Build Coastguard Worker 
generateTestIterations(std::vector<TextureGenerationSpec> & iterations)1674*35238bceSAndroid Build Coastguard Worker     void generateTestIterations(std::vector<TextureGenerationSpec> &iterations)
1675*35238bceSAndroid Build Coastguard Worker     {
1676*35238bceSAndroid Build Coastguard Worker         generateTextureBufferGenerationGroup(iterations, m_target);
1677*35238bceSAndroid Build Coastguard Worker     }
1678*35238bceSAndroid Build Coastguard Worker 
checkTextureState(glu::CallLogWrapper & gl,const TextureGenerationSpec & spec)1679*35238bceSAndroid Build Coastguard Worker     bool checkTextureState(glu::CallLogWrapper &gl, const TextureGenerationSpec &spec)
1680*35238bceSAndroid Build Coastguard Worker     {
1681*35238bceSAndroid Build Coastguard Worker         bool allOk = true;
1682*35238bceSAndroid Build Coastguard Worker 
1683*35238bceSAndroid Build Coastguard Worker         if (spec.levels.empty())
1684*35238bceSAndroid Build Coastguard Worker         {
1685*35238bceSAndroid Build Coastguard Worker             allOk &= verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, 0, m_type);
1686*35238bceSAndroid Build Coastguard Worker         }
1687*35238bceSAndroid Build Coastguard Worker         else
1688*35238bceSAndroid Build Coastguard Worker         {
1689*35238bceSAndroid Build Coastguard Worker             const int refValue = spec.texBufferDataSize;
1690*35238bceSAndroid Build Coastguard Worker 
1691*35238bceSAndroid Build Coastguard Worker             allOk &=
1692*35238bceSAndroid Build Coastguard Worker                 verifyTextureLevelParameterEqual(gl, spec.queryTarget, 0, GL_TEXTURE_BUFFER_SIZE, refValue, m_type);
1693*35238bceSAndroid Build Coastguard Worker         }
1694*35238bceSAndroid Build Coastguard Worker 
1695*35238bceSAndroid Build Coastguard Worker         return allOk;
1696*35238bceSAndroid Build Coastguard Worker     }
1697*35238bceSAndroid Build Coastguard Worker };
1698*35238bceSAndroid Build Coastguard Worker 
1699*35238bceSAndroid Build Coastguard Worker } // namespace
1700*35238bceSAndroid Build Coastguard Worker 
getVerifierSuffix(QueryType type)1701*35238bceSAndroid Build Coastguard Worker static const char *getVerifierSuffix(QueryType type)
1702*35238bceSAndroid Build Coastguard Worker {
1703*35238bceSAndroid Build Coastguard Worker     switch (type)
1704*35238bceSAndroid Build Coastguard Worker     {
1705*35238bceSAndroid Build Coastguard Worker     case QUERY_TEXTURE_LEVEL_FLOAT:
1706*35238bceSAndroid Build Coastguard Worker         return "_float";
1707*35238bceSAndroid Build Coastguard Worker     case QUERY_TEXTURE_LEVEL_INTEGER:
1708*35238bceSAndroid Build Coastguard Worker         return "_integer";
1709*35238bceSAndroid Build Coastguard Worker     default:
1710*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1711*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
1712*35238bceSAndroid Build Coastguard Worker     }
1713*35238bceSAndroid Build Coastguard Worker }
1714*35238bceSAndroid Build Coastguard Worker 
TextureLevelStateQueryTests(Context & context)1715*35238bceSAndroid Build Coastguard Worker TextureLevelStateQueryTests::TextureLevelStateQueryTests(Context &context)
1716*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "texture_level", "GetTexLevelParameter tests")
1717*35238bceSAndroid Build Coastguard Worker {
1718*35238bceSAndroid Build Coastguard Worker }
1719*35238bceSAndroid Build Coastguard Worker 
~TextureLevelStateQueryTests(void)1720*35238bceSAndroid Build Coastguard Worker TextureLevelStateQueryTests::~TextureLevelStateQueryTests(void)
1721*35238bceSAndroid Build Coastguard Worker {
1722*35238bceSAndroid Build Coastguard Worker }
1723*35238bceSAndroid Build Coastguard Worker 
init(void)1724*35238bceSAndroid Build Coastguard Worker void TextureLevelStateQueryTests::init(void)
1725*35238bceSAndroid Build Coastguard Worker {
1726*35238bceSAndroid Build Coastguard Worker     static const QueryType verifiers[] = {
1727*35238bceSAndroid Build Coastguard Worker         QUERY_TEXTURE_LEVEL_INTEGER,
1728*35238bceSAndroid Build Coastguard Worker         QUERY_TEXTURE_LEVEL_FLOAT,
1729*35238bceSAndroid Build Coastguard Worker     };
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker #define FOR_EACH_VERIFIER(X)                                                                  \
1732*35238bceSAndroid Build Coastguard Worker     do                                                                                        \
1733*35238bceSAndroid Build Coastguard Worker     {                                                                                         \
1734*35238bceSAndroid Build Coastguard Worker         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx) \
1735*35238bceSAndroid Build Coastguard Worker         {                                                                                     \
1736*35238bceSAndroid Build Coastguard Worker             const std::string verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]);     \
1737*35238bceSAndroid Build Coastguard Worker             const QueryType verifier         = verifiers[verifierNdx];                        \
1738*35238bceSAndroid Build Coastguard Worker             targetGroup->addChild(X);                                                         \
1739*35238bceSAndroid Build Coastguard Worker         }                                                                                     \
1740*35238bceSAndroid Build Coastguard Worker     } while (0)
1741*35238bceSAndroid Build Coastguard Worker 
1742*35238bceSAndroid Build Coastguard Worker     static const struct
1743*35238bceSAndroid Build Coastguard Worker     {
1744*35238bceSAndroid Build Coastguard Worker         const char *name;
1745*35238bceSAndroid Build Coastguard Worker         glw::GLenum target;
1746*35238bceSAndroid Build Coastguard Worker     } textureTargets[] = {
1747*35238bceSAndroid Build Coastguard Worker         {
1748*35238bceSAndroid Build Coastguard Worker             "texture_2d",
1749*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_2D,
1750*35238bceSAndroid Build Coastguard Worker         },
1751*35238bceSAndroid Build Coastguard Worker         {
1752*35238bceSAndroid Build Coastguard Worker             "texture_3d",
1753*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_3D,
1754*35238bceSAndroid Build Coastguard Worker         },
1755*35238bceSAndroid Build Coastguard Worker         {
1756*35238bceSAndroid Build Coastguard Worker             "texture_2d_array",
1757*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_2D_ARRAY,
1758*35238bceSAndroid Build Coastguard Worker         },
1759*35238bceSAndroid Build Coastguard Worker         {
1760*35238bceSAndroid Build Coastguard Worker             "texture_cube_map",
1761*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_CUBE_MAP,
1762*35238bceSAndroid Build Coastguard Worker         },
1763*35238bceSAndroid Build Coastguard Worker         {
1764*35238bceSAndroid Build Coastguard Worker             "texture_2d_multisample",
1765*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_2D_MULTISAMPLE,
1766*35238bceSAndroid Build Coastguard Worker         },
1767*35238bceSAndroid Build Coastguard Worker         {
1768*35238bceSAndroid Build Coastguard Worker             "texture_2d_multisample_array",
1769*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
1770*35238bceSAndroid Build Coastguard Worker         }, // GL_OES_texture_storage_multisample_2d_array
1771*35238bceSAndroid Build Coastguard Worker         {
1772*35238bceSAndroid Build Coastguard Worker             "texture_buffer",
1773*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_BUFFER,
1774*35238bceSAndroid Build Coastguard Worker         }, // GL_EXT_texture_buffer
1775*35238bceSAndroid Build Coastguard Worker         {
1776*35238bceSAndroid Build Coastguard Worker             "texture_cube_array",
1777*35238bceSAndroid Build Coastguard Worker             GL_TEXTURE_CUBE_MAP_ARRAY,
1778*35238bceSAndroid Build Coastguard Worker         }, // GL_EXT_texture_cube_map_array
1779*35238bceSAndroid Build Coastguard Worker     };
1780*35238bceSAndroid Build Coastguard Worker 
1781*35238bceSAndroid Build Coastguard Worker     for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(textureTargets); ++targetNdx)
1782*35238bceSAndroid Build Coastguard Worker     {
1783*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const targetGroup =
1784*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, textureTargets[targetNdx].name, textureTargets[targetNdx].name);
1785*35238bceSAndroid Build Coastguard Worker         addChild(targetGroup);
1786*35238bceSAndroid Build Coastguard Worker 
1787*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSampleCase(m_context, ("samples" + verifierSuffix).c_str(),
1788*35238bceSAndroid Build Coastguard Worker                                                      "Verify TEXTURE_SAMPLES", textureTargets[targetNdx].target,
1789*35238bceSAndroid Build Coastguard Worker                                                      verifier));
1790*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelFixedSamplesCase(
1791*35238bceSAndroid Build Coastguard Worker             m_context, ("fixed_sample_locations" + verifierSuffix).c_str(), "Verify TEXTURE_FIXED_SAMPLE_LOCATIONS",
1792*35238bceSAndroid Build Coastguard Worker             textureTargets[targetNdx].target, verifier));
1793*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelWidthCase(m_context, ("width" + verifierSuffix).c_str(),
1794*35238bceSAndroid Build Coastguard Worker                                                     "Verify TEXTURE_WIDTH", textureTargets[targetNdx].target,
1795*35238bceSAndroid Build Coastguard Worker                                                     verifier));
1796*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelHeightCase(m_context, ("height" + verifierSuffix).c_str(),
1797*35238bceSAndroid Build Coastguard Worker                                                      "Verify TEXTURE_HEIGHT", textureTargets[targetNdx].target,
1798*35238bceSAndroid Build Coastguard Worker                                                      verifier));
1799*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelDepthCase(m_context, ("depth" + verifierSuffix).c_str(),
1800*35238bceSAndroid Build Coastguard Worker                                                     "Verify TEXTURE_DEPTH", textureTargets[targetNdx].target,
1801*35238bceSAndroid Build Coastguard Worker                                                     verifier));
1802*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelInternalFormatCase(m_context, ("internal_format" + verifierSuffix).c_str(),
1803*35238bceSAndroid Build Coastguard Worker                                                              "Verify TEXTURE_INTERNAL_FORMAT",
1804*35238bceSAndroid Build Coastguard Worker                                                              textureTargets[targetNdx].target, verifier));
1805*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("red_size" + verifierSuffix).c_str(),
1806*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_RED_SIZE", textureTargets[targetNdx].target,
1807*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_RED_SIZE));
1808*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("green_size" + verifierSuffix).c_str(),
1809*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_GREEN_SIZE", textureTargets[targetNdx].target,
1810*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_GREEN_SIZE));
1811*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("blue_size" + verifierSuffix).c_str(),
1812*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_BLUE_SIZE", textureTargets[targetNdx].target,
1813*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_BLUE_SIZE));
1814*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("alpha_size" + verifierSuffix).c_str(),
1815*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_ALPHA_SIZE", textureTargets[targetNdx].target,
1816*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_ALPHA_SIZE));
1817*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("depth_size" + verifierSuffix).c_str(),
1818*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_DEPTH_SIZE", textureTargets[targetNdx].target,
1819*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_DEPTH_SIZE));
1820*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("stencil_size" + verifierSuffix).c_str(),
1821*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_STENCIL_SIZE", textureTargets[targetNdx].target,
1822*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_STENCIL_SIZE));
1823*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelSizeCase(m_context, ("shared_size" + verifierSuffix).c_str(),
1824*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_SHARED_SIZE", textureTargets[targetNdx].target,
1825*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_SHARED_SIZE));
1826*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelTypeCase(m_context, ("red_type" + verifierSuffix).c_str(),
1827*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_RED_TYPE", textureTargets[targetNdx].target,
1828*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_RED_TYPE));
1829*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelTypeCase(m_context, ("green_type" + verifierSuffix).c_str(),
1830*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_GREEN_TYPE", textureTargets[targetNdx].target,
1831*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_GREEN_TYPE));
1832*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelTypeCase(m_context, ("blue_type" + verifierSuffix).c_str(),
1833*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_BLUE_TYPE", textureTargets[targetNdx].target,
1834*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_BLUE_TYPE));
1835*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelTypeCase(m_context, ("alpha_type" + verifierSuffix).c_str(),
1836*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_ALPHA_TYPE", textureTargets[targetNdx].target,
1837*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_ALPHA_TYPE));
1838*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelTypeCase(m_context, ("depth_type" + verifierSuffix).c_str(),
1839*35238bceSAndroid Build Coastguard Worker                                                    "Verify TEXTURE_DEPTH_TYPE", textureTargets[targetNdx].target,
1840*35238bceSAndroid Build Coastguard Worker                                                    verifier, GL_TEXTURE_DEPTH_TYPE));
1841*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelCompressedCase(m_context, ("compressed" + verifierSuffix).c_str(),
1842*35238bceSAndroid Build Coastguard Worker                                                          "Verify TEXTURE_COMPRESSED", textureTargets[targetNdx].target,
1843*35238bceSAndroid Build Coastguard Worker                                                          verifier));
1844*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelBufferDataStoreCase(
1845*35238bceSAndroid Build Coastguard Worker             m_context, ("buffer_data_store_binding" + verifierSuffix).c_str(),
1846*35238bceSAndroid Build Coastguard Worker             "Verify TEXTURE_BUFFER_DATA_STORE_BINDING", textureTargets[targetNdx].target, verifier));
1847*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelBufferDataOffsetCase(m_context, ("buffer_offset" + verifierSuffix).c_str(),
1848*35238bceSAndroid Build Coastguard Worker                                                                "Verify TEXTURE_BUFFER_OFFSET",
1849*35238bceSAndroid Build Coastguard Worker                                                                textureTargets[targetNdx].target, verifier));
1850*35238bceSAndroid Build Coastguard Worker         FOR_EACH_VERIFIER(new TextureLevelBufferDataSizeCase(m_context, ("buffer_size" + verifierSuffix).c_str(),
1851*35238bceSAndroid Build Coastguard Worker                                                              "Verify TEXTURE_BUFFER_SIZE",
1852*35238bceSAndroid Build Coastguard Worker                                                              textureTargets[targetNdx].target, verifier));
1853*35238bceSAndroid Build Coastguard Worker     }
1854*35238bceSAndroid Build Coastguard Worker 
1855*35238bceSAndroid Build Coastguard Worker #undef FOR_EACH_VERIFIER
1856*35238bceSAndroid Build Coastguard Worker }
1857*35238bceSAndroid Build Coastguard Worker 
1858*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1859*35238bceSAndroid Build Coastguard Worker } // namespace gles31
1860*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1861