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