xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fTextureSpecificationTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 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 specification tests.
22*35238bceSAndroid Build Coastguard Worker  *
23*35238bceSAndroid Build Coastguard Worker  * \todo [pyry] Following tests are missing:
24*35238bceSAndroid Build Coastguard Worker  *  - Specify mipmap incomplete texture, use without mipmaps, re-specify
25*35238bceSAndroid Build Coastguard Worker  *    as complete and render.
26*35238bceSAndroid Build Coastguard Worker  *  - Randomly re-specify levels to eventually reach mipmap-complete texture.
27*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "es31fTextureSpecificationTests.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "sglrContextUtil.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "sglrContextWrapper.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "sglrGLContext.hpp"
40*35238bceSAndroid Build Coastguard Worker #include "sglrReferenceContext.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "glsTextureTestUtil.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
43*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker // \todo [2012-04-29 pyry] Should be named SglrUtil
46*35238bceSAndroid Build Coastguard Worker #include "es31fFboTestUtil.hpp"
47*35238bceSAndroid Build Coastguard Worker 
48*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker namespace deqp
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker namespace gles31
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker namespace Functional
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker using std::pair;
58*35238bceSAndroid Build Coastguard Worker using std::string;
59*35238bceSAndroid Build Coastguard Worker using std::vector;
60*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
61*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
62*35238bceSAndroid Build Coastguard Worker using tcu::UVec4;
63*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
64*35238bceSAndroid Build Coastguard Worker using namespace FboTestUtil;
65*35238bceSAndroid Build Coastguard Worker 
66*35238bceSAndroid Build Coastguard Worker enum
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker     VIEWPORT_WIDTH  = 256,
69*35238bceSAndroid Build Coastguard Worker     VIEWPORT_HEIGHT = 256
70*35238bceSAndroid Build Coastguard Worker };
71*35238bceSAndroid Build Coastguard Worker 
maxLevelCount(int size)72*35238bceSAndroid Build Coastguard Worker static inline int maxLevelCount(int size)
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     return (int)deLog2Floor32(size) + 1;
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker template <int Size>
78*35238bceSAndroid Build Coastguard Worker static tcu::Vector<float, Size> randomVector(de::Random &rnd,
79*35238bceSAndroid Build Coastguard Worker                                              const tcu::Vector<float, Size> &minVal = tcu::Vector<float, Size>(0.0f),
80*35238bceSAndroid Build Coastguard Worker                                              const tcu::Vector<float, Size> &maxVal = tcu::Vector<float, Size>(1.0f))
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     tcu::Vector<float, Size> res;
83*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < Size; ndx++)
84*35238bceSAndroid Build Coastguard Worker         res[ndx] = rnd.getFloat(minVal[ndx], maxVal[ndx]);
85*35238bceSAndroid Build Coastguard Worker     return res;
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker 
getCubeFaceFromNdx(int ndx)88*35238bceSAndroid Build Coastguard Worker static tcu::CubeFace getCubeFaceFromNdx(int ndx)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker     switch (ndx)
91*35238bceSAndroid Build Coastguard Worker     {
92*35238bceSAndroid Build Coastguard Worker     case 0:
93*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_POSITIVE_X;
94*35238bceSAndroid Build Coastguard Worker     case 1:
95*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_NEGATIVE_X;
96*35238bceSAndroid Build Coastguard Worker     case 2:
97*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_POSITIVE_Y;
98*35238bceSAndroid Build Coastguard Worker     case 3:
99*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_NEGATIVE_Y;
100*35238bceSAndroid Build Coastguard Worker     case 4:
101*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_POSITIVE_Z;
102*35238bceSAndroid Build Coastguard Worker     case 5:
103*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_NEGATIVE_Z;
104*35238bceSAndroid Build Coastguard Worker     default:
105*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
106*35238bceSAndroid Build Coastguard Worker         return tcu::CUBEFACE_LAST;
107*35238bceSAndroid Build Coastguard Worker     }
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker class TextureSpecCase : public TestCase, public sglr::ContextWrapper
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker public:
113*35238bceSAndroid Build Coastguard Worker     TextureSpecCase(Context &context, const char *name, const char *desc);
114*35238bceSAndroid Build Coastguard Worker     ~TextureSpecCase(void);
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker protected:
checkExtensionSupport(void)119*35238bceSAndroid Build Coastguard Worker     virtual bool checkExtensionSupport(void)
120*35238bceSAndroid Build Coastguard Worker     {
121*35238bceSAndroid Build Coastguard Worker         return true;
122*35238bceSAndroid Build Coastguard Worker     }
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker     virtual void createTexture(void)                                                              = DE_NULL;
125*35238bceSAndroid Build Coastguard Worker     virtual void verifyTexture(sglr::GLContext &gles3Context, sglr::ReferenceContext &refContext) = DE_NULL;
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker     // Utilities.
128*35238bceSAndroid Build Coastguard Worker     void renderTex(tcu::Surface &dst, uint32_t program, int width, int height);
129*35238bceSAndroid Build Coastguard Worker     void readPixels(tcu::Surface &dst, int x, int y, int width, int height);
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker private:
132*35238bceSAndroid Build Coastguard Worker     TextureSpecCase(const TextureSpecCase &other);
133*35238bceSAndroid Build Coastguard Worker     TextureSpecCase &operator=(const TextureSpecCase &other);
134*35238bceSAndroid Build Coastguard Worker };
135*35238bceSAndroid Build Coastguard Worker 
TextureSpecCase(Context & context,const char * name,const char * desc)136*35238bceSAndroid Build Coastguard Worker TextureSpecCase::TextureSpecCase(Context &context, const char *name, const char *desc) : TestCase(context, name, desc)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker 
~TextureSpecCase(void)140*35238bceSAndroid Build Coastguard Worker TextureSpecCase::~TextureSpecCase(void)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker }
143*35238bceSAndroid Build Coastguard Worker 
iterate(void)144*35238bceSAndroid Build Coastguard Worker TextureSpecCase::IterateResult TextureSpecCase::iterate(void)
145*35238bceSAndroid Build Coastguard Worker {
146*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &renderCtx         = TestCase::m_context.getRenderContext();
147*35238bceSAndroid Build Coastguard Worker     const tcu::RenderTarget &renderTarget = renderCtx.getRenderTarget();
148*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log                     = m_testCtx.getLog();
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     if (renderTarget.getWidth() < VIEWPORT_WIDTH || renderTarget.getHeight() < VIEWPORT_HEIGHT)
151*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Too small viewport", "", __FILE__, __LINE__);
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     if (!checkExtensionSupport())
154*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Extension not supported", "", __FILE__, __LINE__);
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker     // Context size, and viewport for GLES3.1
157*35238bceSAndroid Build Coastguard Worker     de::Random rnd(deStringHash(getName()));
158*35238bceSAndroid Build Coastguard Worker     int width  = deMin32(renderTarget.getWidth(), VIEWPORT_WIDTH);
159*35238bceSAndroid Build Coastguard Worker     int height = deMin32(renderTarget.getHeight(), VIEWPORT_HEIGHT);
160*35238bceSAndroid Build Coastguard Worker     int x      = rnd.getInt(0, renderTarget.getWidth() - width);
161*35238bceSAndroid Build Coastguard Worker     int y      = rnd.getInt(0, renderTarget.getHeight() - height);
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     // Contexts.
164*35238bceSAndroid Build Coastguard Worker     sglr::GLContext gles31Context(renderCtx, log, sglr::GLCONTEXT_LOG_CALLS, tcu::IVec4(x, y, width, height));
165*35238bceSAndroid Build Coastguard Worker     sglr::ReferenceContextBuffers refBuffers(tcu::PixelFormat(8, 8, 8, renderTarget.getPixelFormat().alphaBits ? 8 : 0),
166*35238bceSAndroid Build Coastguard Worker                                              0 /* depth */, 0 /* stencil */, width, height);
167*35238bceSAndroid Build Coastguard Worker     sglr::ReferenceContext refContext(sglr::ReferenceContextLimits(renderCtx), refBuffers.getColorbuffer(),
168*35238bceSAndroid Build Coastguard Worker                                       refBuffers.getDepthbuffer(), refBuffers.getStencilbuffer());
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker     // Clear color buffer.
171*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < 2; ndx++)
172*35238bceSAndroid Build Coastguard Worker     {
173*35238bceSAndroid Build Coastguard Worker         setContext(ndx ? (sglr::Context *)&refContext : (sglr::Context *)&gles31Context);
174*35238bceSAndroid Build Coastguard Worker         glClearColor(0.125f, 0.25f, 0.5f, 1.0f);
175*35238bceSAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
176*35238bceSAndroid Build Coastguard Worker     }
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker     // Construct texture using both GLES3.1 and reference contexts.
179*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < 2; ndx++)
180*35238bceSAndroid Build Coastguard Worker     {
181*35238bceSAndroid Build Coastguard Worker         setContext(ndx ? (sglr::Context *)&refContext : (sglr::Context *)&gles31Context);
182*35238bceSAndroid Build Coastguard Worker         createTexture();
183*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(glGetError() == GL_NO_ERROR);
184*35238bceSAndroid Build Coastguard Worker     }
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     // Initialize case result to pass.
187*35238bceSAndroid Build Coastguard Worker     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker     // Disable logging.
190*35238bceSAndroid Build Coastguard Worker     gles31Context.enableLogging(0);
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker     // Verify results.
193*35238bceSAndroid Build Coastguard Worker     verifyTexture(gles31Context, refContext);
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker     return STOP;
196*35238bceSAndroid Build Coastguard Worker }
197*35238bceSAndroid Build Coastguard Worker 
renderTex(tcu::Surface & dst,uint32_t program,int width,int height)198*35238bceSAndroid Build Coastguard Worker void TextureSpecCase::renderTex(tcu::Surface &dst, uint32_t program, int width, int height)
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker     int targetW = getWidth();
201*35238bceSAndroid Build Coastguard Worker     int targetH = getHeight();
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker     float w = (float)width / (float)targetW;
204*35238bceSAndroid Build Coastguard Worker     float h = (float)height / (float)targetH;
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker     sglr::drawQuad(*getCurrentContext(), program, tcu::Vec3(-1.0f, -1.0f, 0.0f),
207*35238bceSAndroid Build Coastguard Worker                    tcu::Vec3(-1.0f + w * 2.0f, -1.0f + h * 2.0f, 0.0f));
208*35238bceSAndroid Build Coastguard Worker 
209*35238bceSAndroid Build Coastguard Worker     // Read pixels back.
210*35238bceSAndroid Build Coastguard Worker     readPixels(dst, 0, 0, width, height);
211*35238bceSAndroid Build Coastguard Worker }
212*35238bceSAndroid Build Coastguard Worker 
readPixels(tcu::Surface & dst,int x,int y,int width,int height)213*35238bceSAndroid Build Coastguard Worker void TextureSpecCase::readPixels(tcu::Surface &dst, int x, int y, int width, int height)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker     dst.setSize(width, height);
216*35238bceSAndroid Build Coastguard Worker     glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, dst.getAccess().getDataPtr());
217*35238bceSAndroid Build Coastguard Worker }
218*35238bceSAndroid Build Coastguard Worker 
219*35238bceSAndroid Build Coastguard Worker class TextureCubeArraySpecCase : public TextureSpecCase
220*35238bceSAndroid Build Coastguard Worker {
221*35238bceSAndroid Build Coastguard Worker public:
222*35238bceSAndroid Build Coastguard Worker     TextureCubeArraySpecCase(Context &context, const char *name, const char *desc, const tcu::TextureFormat &format,
223*35238bceSAndroid Build Coastguard Worker                              int size, int depth, int numLevels);
224*35238bceSAndroid Build Coastguard Worker     ~TextureCubeArraySpecCase(void);
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker protected:
227*35238bceSAndroid Build Coastguard Worker     virtual bool checkExtensionSupport(void);
228*35238bceSAndroid Build Coastguard Worker     virtual void verifyTexture(sglr::GLContext &gles3Context, sglr::ReferenceContext &refContext);
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormat m_texFormat;
231*35238bceSAndroid Build Coastguard Worker     tcu::TextureFormatInfo m_texFormatInfo;
232*35238bceSAndroid Build Coastguard Worker     int m_size;
233*35238bceSAndroid Build Coastguard Worker     int m_depth;
234*35238bceSAndroid Build Coastguard Worker     int m_numLevels;
235*35238bceSAndroid Build Coastguard Worker };
236*35238bceSAndroid Build Coastguard Worker 
TextureCubeArraySpecCase(Context & context,const char * name,const char * desc,const tcu::TextureFormat & format,int size,int depth,int numLevels)237*35238bceSAndroid Build Coastguard Worker TextureCubeArraySpecCase::TextureCubeArraySpecCase(Context &context, const char *name, const char *desc,
238*35238bceSAndroid Build Coastguard Worker                                                    const tcu::TextureFormat &format, int size, int depth, int numLevels)
239*35238bceSAndroid Build Coastguard Worker     : TextureSpecCase(context, name, desc)
240*35238bceSAndroid Build Coastguard Worker     , m_texFormat(format)
241*35238bceSAndroid Build Coastguard Worker     , m_texFormatInfo(tcu::getTextureFormatInfo(format))
242*35238bceSAndroid Build Coastguard Worker     , m_size(size)
243*35238bceSAndroid Build Coastguard Worker     , m_depth(depth)
244*35238bceSAndroid Build Coastguard Worker     , m_numLevels(numLevels)
245*35238bceSAndroid Build Coastguard Worker {
246*35238bceSAndroid Build Coastguard Worker }
247*35238bceSAndroid Build Coastguard Worker 
~TextureCubeArraySpecCase(void)248*35238bceSAndroid Build Coastguard Worker TextureCubeArraySpecCase::~TextureCubeArraySpecCase(void)
249*35238bceSAndroid Build Coastguard Worker {
250*35238bceSAndroid Build Coastguard Worker }
251*35238bceSAndroid Build Coastguard Worker 
checkExtensionSupport(void)252*35238bceSAndroid Build Coastguard Worker bool TextureCubeArraySpecCase::checkExtensionSupport(void)
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker     glu::ContextType contextType  = m_context.getRenderContext().getType();
255*35238bceSAndroid Build Coastguard Worker     const bool supportsES32orGL45 = glu::contextSupports(contextType, glu::ApiType::es(3, 2)) ||
256*35238bceSAndroid Build Coastguard Worker                                     glu::contextSupports(contextType, glu::ApiType::core(4, 5));
257*35238bceSAndroid Build Coastguard Worker     return supportsES32orGL45 || m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array");
258*35238bceSAndroid Build Coastguard Worker }
259*35238bceSAndroid Build Coastguard Worker 
verifyTexture(sglr::GLContext & gles3Context,sglr::ReferenceContext & refContext)260*35238bceSAndroid Build Coastguard Worker void TextureCubeArraySpecCase::verifyTexture(sglr::GLContext &gles3Context, sglr::ReferenceContext &refContext)
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion glslVersion = glu::getContextTypeGLSLVersion(m_context.getRenderContext().getType());
263*35238bceSAndroid Build Coastguard Worker     TextureCubeArrayShader shader(glu::getSamplerCubeArrayType(m_texFormat), glu::TYPE_FLOAT_VEC4, glslVersion);
264*35238bceSAndroid Build Coastguard Worker     uint32_t shaderIDgles = gles3Context.createProgram(&shader);
265*35238bceSAndroid Build Coastguard Worker     uint32_t shaderIDRef  = refContext.createProgram(&shader);
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker     shader.setTexScaleBias(m_texFormatInfo.lookupScale, m_texFormatInfo.lookupBias);
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     // Set state.
270*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < 2; ndx++)
271*35238bceSAndroid Build Coastguard Worker     {
272*35238bceSAndroid Build Coastguard Worker         sglr::Context *ctx =
273*35238bceSAndroid Build Coastguard Worker             ndx ? static_cast<sglr::Context *>(&refContext) : static_cast<sglr::Context *>(&gles3Context);
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker         setContext(ctx);
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
278*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
279*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
280*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
281*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
282*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAX_LEVEL, m_numLevels - 1);
283*35238bceSAndroid Build Coastguard Worker     }
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker     for (int layerFaceNdx = 0; layerFaceNdx < m_depth; layerFaceNdx++)
286*35238bceSAndroid Build Coastguard Worker     {
287*35238bceSAndroid Build Coastguard Worker         const int layerNdx       = layerFaceNdx / 6;
288*35238bceSAndroid Build Coastguard Worker         const tcu::CubeFace face = getCubeFaceFromNdx(layerFaceNdx % 6);
289*35238bceSAndroid Build Coastguard Worker         bool layerOk             = true;
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker         shader.setLayer(layerNdx);
292*35238bceSAndroid Build Coastguard Worker         shader.setFace(face);
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker         for (int levelNdx = 0; levelNdx < m_numLevels; levelNdx++)
295*35238bceSAndroid Build Coastguard Worker         {
296*35238bceSAndroid Build Coastguard Worker             int levelSize = de::max(1, m_size >> levelNdx);
297*35238bceSAndroid Build Coastguard Worker             tcu::Surface reference;
298*35238bceSAndroid Build Coastguard Worker             tcu::Surface result;
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker             if (levelSize <= 2)
301*35238bceSAndroid Build Coastguard Worker                 continue; // Fuzzy compare doesn't work for images this small.
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker             for (int ndx = 0; ndx < 2; ndx++)
304*35238bceSAndroid Build Coastguard Worker             {
305*35238bceSAndroid Build Coastguard Worker                 tcu::Surface &dst = ndx ? reference : result;
306*35238bceSAndroid Build Coastguard Worker                 sglr::Context *ctx =
307*35238bceSAndroid Build Coastguard Worker                     ndx ? static_cast<sglr::Context *>(&refContext) : static_cast<sglr::Context *>(&gles3Context);
308*35238bceSAndroid Build Coastguard Worker                 uint32_t shaderID = ndx ? shaderIDRef : shaderIDgles;
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker                 setContext(ctx);
311*35238bceSAndroid Build Coastguard Worker                 shader.setUniforms(*ctx, shaderID);
312*35238bceSAndroid Build Coastguard Worker                 renderTex(dst, shaderID, levelSize, levelSize);
313*35238bceSAndroid Build Coastguard Worker             }
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker             const float threshold = 0.02f;
316*35238bceSAndroid Build Coastguard Worker             string levelStr       = de::toString(levelNdx);
317*35238bceSAndroid Build Coastguard Worker             string layerFaceStr   = de::toString(layerFaceNdx);
318*35238bceSAndroid Build Coastguard Worker             string name           = string("LayerFace") + layerFaceStr + "Level" + levelStr;
319*35238bceSAndroid Build Coastguard Worker             string desc           = string("Layer-face ") + layerFaceStr + ", Level " + levelStr;
320*35238bceSAndroid Build Coastguard Worker             bool isFaceOk         = tcu::fuzzyCompare(
321*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog(), name.c_str(), desc.c_str(), reference, result, threshold,
322*35238bceSAndroid Build Coastguard Worker                 (levelNdx == 0 && layerFaceNdx == 0) == 0 ? tcu::COMPARE_LOG_RESULT : tcu::COMPARE_LOG_ON_ERROR);
323*35238bceSAndroid Build Coastguard Worker 
324*35238bceSAndroid Build Coastguard Worker             if (!isFaceOk)
325*35238bceSAndroid Build Coastguard Worker             {
326*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
327*35238bceSAndroid Build Coastguard Worker                 layerOk = false;
328*35238bceSAndroid Build Coastguard Worker                 break;
329*35238bceSAndroid Build Coastguard Worker             }
330*35238bceSAndroid Build Coastguard Worker         }
331*35238bceSAndroid Build Coastguard Worker 
332*35238bceSAndroid Build Coastguard Worker         if (!layerOk)
333*35238bceSAndroid Build Coastguard Worker             break;
334*35238bceSAndroid Build Coastguard Worker     }
335*35238bceSAndroid Build Coastguard Worker }
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker // Basic TexImage3D() with cube map array texture usage
338*35238bceSAndroid Build Coastguard Worker class BasicTexImageCubeArrayCase : public TextureCubeArraySpecCase
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker public:
BasicTexImageCubeArrayCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int size,int numLayers)341*35238bceSAndroid Build Coastguard Worker     BasicTexImageCubeArrayCase(Context &context, const char *name, const char *desc, uint32_t internalFormat, int size,
342*35238bceSAndroid Build Coastguard Worker                                int numLayers)
343*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), size, numLayers,
344*35238bceSAndroid Build Coastguard Worker                                    maxLevelCount(size))
345*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
346*35238bceSAndroid Build Coastguard Worker     {
347*35238bceSAndroid Build Coastguard Worker     }
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker protected:
createTexture(void)350*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
351*35238bceSAndroid Build Coastguard Worker     {
352*35238bceSAndroid Build Coastguard Worker         uint32_t tex = 0;
353*35238bceSAndroid Build Coastguard Worker         de::Random rnd(deStringHash(getName()));
354*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(m_texFormat);
355*35238bceSAndroid Build Coastguard Worker         tcu::TextureLevel levelData(glu::mapGLTransferFormat(transferFmt.format, transferFmt.dataType));
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
358*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
359*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < m_numLevels; ndx++)
362*35238bceSAndroid Build Coastguard Worker         {
363*35238bceSAndroid Build Coastguard Worker             int levelW = de::max(1, m_size >> ndx);
364*35238bceSAndroid Build Coastguard Worker             Vec4 gMin  = randomVector<4>(rnd, m_texFormatInfo.valueMin, m_texFormatInfo.valueMax);
365*35238bceSAndroid Build Coastguard Worker             Vec4 gMax  = randomVector<4>(rnd, m_texFormatInfo.valueMin, m_texFormatInfo.valueMax);
366*35238bceSAndroid Build Coastguard Worker 
367*35238bceSAndroid Build Coastguard Worker             levelData.setSize(levelW, levelW, m_depth);
368*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(levelData.getAccess(), gMin, gMax);
369*35238bceSAndroid Build Coastguard Worker 
370*35238bceSAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, ndx, m_internalFormat, levelW, levelW, m_depth, 0,
371*35238bceSAndroid Build Coastguard Worker                          transferFmt.format, transferFmt.dataType, levelData.getAccess().getDataPtr());
372*35238bceSAndroid Build Coastguard Worker         }
373*35238bceSAndroid Build Coastguard Worker     }
374*35238bceSAndroid Build Coastguard Worker 
375*35238bceSAndroid Build Coastguard Worker     uint32_t m_internalFormat;
376*35238bceSAndroid Build Coastguard Worker };
377*35238bceSAndroid Build Coastguard Worker 
378*35238bceSAndroid Build Coastguard Worker // Basic glTexStorage3D() with cube map array texture usage
379*35238bceSAndroid Build Coastguard Worker class BasicTexStorageCubeArrayCase : public TextureCubeArraySpecCase
380*35238bceSAndroid Build Coastguard Worker {
381*35238bceSAndroid Build Coastguard Worker public:
BasicTexStorageCubeArrayCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int size,int numLayers,int numLevels)382*35238bceSAndroid Build Coastguard Worker     BasicTexStorageCubeArrayCase(Context &context, const char *name, const char *desc, uint32_t internalFormat,
383*35238bceSAndroid Build Coastguard Worker                                  int size, int numLayers, int numLevels)
384*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), size, numLayers,
385*35238bceSAndroid Build Coastguard Worker                                    numLevels)
386*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
387*35238bceSAndroid Build Coastguard Worker     {
388*35238bceSAndroid Build Coastguard Worker     }
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker protected:
createTexture(void)391*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
392*35238bceSAndroid Build Coastguard Worker     {
393*35238bceSAndroid Build Coastguard Worker         uint32_t tex = 0;
394*35238bceSAndroid Build Coastguard Worker         de::Random rnd(deStringHash(getName()));
395*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(m_texFormat);
396*35238bceSAndroid Build Coastguard Worker         tcu::TextureLevel levelData(glu::mapGLTransferFormat(transferFmt.format, transferFmt.dataType));
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
399*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
400*35238bceSAndroid Build Coastguard Worker         glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, m_numLevels, m_internalFormat, m_size, m_size, m_depth);
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
403*35238bceSAndroid Build Coastguard Worker 
404*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < m_numLevels; ndx++)
405*35238bceSAndroid Build Coastguard Worker         {
406*35238bceSAndroid Build Coastguard Worker             int levelW = de::max(1, m_size >> ndx);
407*35238bceSAndroid Build Coastguard Worker             Vec4 gMin  = randomVector<4>(rnd, m_texFormatInfo.valueMin, m_texFormatInfo.valueMax);
408*35238bceSAndroid Build Coastguard Worker             Vec4 gMax  = randomVector<4>(rnd, m_texFormatInfo.valueMin, m_texFormatInfo.valueMax);
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker             levelData.setSize(levelW, levelW, m_depth);
411*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(levelData.getAccess(), gMin, gMax);
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, ndx, 0, 0, 0, levelW, levelW, m_depth, transferFmt.format,
414*35238bceSAndroid Build Coastguard Worker                             transferFmt.dataType, levelData.getAccess().getDataPtr());
415*35238bceSAndroid Build Coastguard Worker         }
416*35238bceSAndroid Build Coastguard Worker     }
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker     uint32_t m_internalFormat;
419*35238bceSAndroid Build Coastguard Worker };
420*35238bceSAndroid Build Coastguard Worker 
421*35238bceSAndroid Build Coastguard Worker // Pixel buffer object cases.
422*35238bceSAndroid Build Coastguard Worker 
423*35238bceSAndroid Build Coastguard Worker // TexImage3D() cube map array from pixel buffer object.
424*35238bceSAndroid Build Coastguard Worker class TexImageCubeArrayBufferCase : public TextureCubeArraySpecCase
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker public:
TexImageCubeArrayBufferCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int size,int depth,int imageHeight,int rowLength,int skipImages,int skipRows,int skipPixels,int alignment,int offset)427*35238bceSAndroid Build Coastguard Worker     TexImageCubeArrayBufferCase(Context &context, const char *name, const char *desc, uint32_t internalFormat, int size,
428*35238bceSAndroid Build Coastguard Worker                                 int depth, int imageHeight, int rowLength, int skipImages, int skipRows, int skipPixels,
429*35238bceSAndroid Build Coastguard Worker                                 int alignment, int offset)
430*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), size, depth, 1)
431*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
432*35238bceSAndroid Build Coastguard Worker         , m_imageHeight(imageHeight)
433*35238bceSAndroid Build Coastguard Worker         , m_rowLength(rowLength)
434*35238bceSAndroid Build Coastguard Worker         , m_skipImages(skipImages)
435*35238bceSAndroid Build Coastguard Worker         , m_skipRows(skipRows)
436*35238bceSAndroid Build Coastguard Worker         , m_skipPixels(skipPixels)
437*35238bceSAndroid Build Coastguard Worker         , m_alignment(alignment)
438*35238bceSAndroid Build Coastguard Worker         , m_offset(offset)
439*35238bceSAndroid Build Coastguard Worker     {
440*35238bceSAndroid Build Coastguard Worker     }
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker protected:
createTexture(void)443*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
444*35238bceSAndroid Build Coastguard Worker     {
445*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(m_texFormat);
446*35238bceSAndroid Build Coastguard Worker         int pixelSize                   = m_texFormat.getPixelSize();
447*35238bceSAndroid Build Coastguard Worker         int rowLength                   = m_rowLength > 0 ? m_rowLength : m_size;
448*35238bceSAndroid Build Coastguard Worker         int rowPitch                    = deAlign32(rowLength * pixelSize, m_alignment);
449*35238bceSAndroid Build Coastguard Worker         int imageHeight                 = m_imageHeight > 0 ? m_imageHeight : m_size;
450*35238bceSAndroid Build Coastguard Worker         int slicePitch                  = imageHeight * rowPitch;
451*35238bceSAndroid Build Coastguard Worker         uint32_t tex                    = 0;
452*35238bceSAndroid Build Coastguard Worker         uint32_t buf                    = 0;
453*35238bceSAndroid Build Coastguard Worker         vector<uint8_t> data;
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_numLevels == 1);
456*35238bceSAndroid Build Coastguard Worker 
457*35238bceSAndroid Build Coastguard Worker         // Fill data with grid.
458*35238bceSAndroid Build Coastguard Worker         data.resize(slicePitch * (m_depth + m_skipImages) + m_offset);
459*35238bceSAndroid Build Coastguard Worker         {
460*35238bceSAndroid Build Coastguard Worker             Vec4 cScale = m_texFormatInfo.valueMax - m_texFormatInfo.valueMin;
461*35238bceSAndroid Build Coastguard Worker             Vec4 cBias  = m_texFormatInfo.valueMin;
462*35238bceSAndroid Build Coastguard Worker             Vec4 colorA = Vec4(1.0f, 0.0f, 0.0f, 1.0f) * cScale + cBias;
463*35238bceSAndroid Build Coastguard Worker             Vec4 colorB = Vec4(0.0f, 1.0f, 0.0f, 1.0f) * cScale + cBias;
464*35238bceSAndroid Build Coastguard Worker 
465*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(tcu::PixelBufferAccess(m_texFormat, m_size, m_size, m_depth, rowPitch, slicePitch,
466*35238bceSAndroid Build Coastguard Worker                                                      &data[0] + m_skipImages * slicePitch + m_skipRows * rowPitch +
467*35238bceSAndroid Build Coastguard Worker                                                          m_skipPixels * pixelSize + m_offset),
468*35238bceSAndroid Build Coastguard Worker                               4, colorA, colorB);
469*35238bceSAndroid Build Coastguard Worker         }
470*35238bceSAndroid Build Coastguard Worker 
471*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
472*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
473*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, (int)data.size(), &data[0], GL_STATIC_DRAW);
474*35238bceSAndroid Build Coastguard Worker 
475*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, m_imageHeight);
476*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ROW_LENGTH, m_rowLength);
477*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_IMAGES, m_skipImages);
478*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_ROWS, m_skipRows);
479*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_skipPixels);
480*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, m_alignment);
481*35238bceSAndroid Build Coastguard Worker 
482*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
483*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
484*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_internalFormat, m_size, m_size, m_depth, 0, transferFmt.format,
485*35238bceSAndroid Build Coastguard Worker                      transferFmt.dataType, (const void *)(uintptr_t)m_offset);
486*35238bceSAndroid Build Coastguard Worker     }
487*35238bceSAndroid Build Coastguard Worker 
488*35238bceSAndroid Build Coastguard Worker     uint32_t m_internalFormat;
489*35238bceSAndroid Build Coastguard Worker     int m_imageHeight;
490*35238bceSAndroid Build Coastguard Worker     int m_rowLength;
491*35238bceSAndroid Build Coastguard Worker     int m_skipImages;
492*35238bceSAndroid Build Coastguard Worker     int m_skipRows;
493*35238bceSAndroid Build Coastguard Worker     int m_skipPixels;
494*35238bceSAndroid Build Coastguard Worker     int m_alignment;
495*35238bceSAndroid Build Coastguard Worker     int m_offset;
496*35238bceSAndroid Build Coastguard Worker };
497*35238bceSAndroid Build Coastguard Worker 
498*35238bceSAndroid Build Coastguard Worker // TexSubImage3D() cube map array PBO case.
499*35238bceSAndroid Build Coastguard Worker class TexSubImageCubeArrayBufferCase : public TextureCubeArraySpecCase
500*35238bceSAndroid Build Coastguard Worker {
501*35238bceSAndroid Build Coastguard Worker public:
TexSubImageCubeArrayBufferCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int size,int depth,int subX,int subY,int subZ,int subW,int subH,int subD,int imageHeight,int rowLength,int skipImages,int skipRows,int skipPixels,int alignment,int offset)502*35238bceSAndroid Build Coastguard Worker     TexSubImageCubeArrayBufferCase(Context &context, const char *name, const char *desc, uint32_t internalFormat,
503*35238bceSAndroid Build Coastguard Worker                                    int size, int depth, int subX, int subY, int subZ, int subW, int subH, int subD,
504*35238bceSAndroid Build Coastguard Worker                                    int imageHeight, int rowLength, int skipImages, int skipRows, int skipPixels,
505*35238bceSAndroid Build Coastguard Worker                                    int alignment, int offset)
506*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), size, depth, 1)
507*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
508*35238bceSAndroid Build Coastguard Worker         , m_subX(subX)
509*35238bceSAndroid Build Coastguard Worker         , m_subY(subY)
510*35238bceSAndroid Build Coastguard Worker         , m_subZ(subZ)
511*35238bceSAndroid Build Coastguard Worker         , m_subW(subW)
512*35238bceSAndroid Build Coastguard Worker         , m_subH(subH)
513*35238bceSAndroid Build Coastguard Worker         , m_subD(subD)
514*35238bceSAndroid Build Coastguard Worker         , m_imageHeight(imageHeight)
515*35238bceSAndroid Build Coastguard Worker         , m_rowLength(rowLength)
516*35238bceSAndroid Build Coastguard Worker         , m_skipImages(skipImages)
517*35238bceSAndroid Build Coastguard Worker         , m_skipRows(skipRows)
518*35238bceSAndroid Build Coastguard Worker         , m_skipPixels(skipPixels)
519*35238bceSAndroid Build Coastguard Worker         , m_alignment(alignment)
520*35238bceSAndroid Build Coastguard Worker         , m_offset(offset)
521*35238bceSAndroid Build Coastguard Worker     {
522*35238bceSAndroid Build Coastguard Worker     }
523*35238bceSAndroid Build Coastguard Worker 
524*35238bceSAndroid Build Coastguard Worker protected:
createTexture(void)525*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
526*35238bceSAndroid Build Coastguard Worker     {
527*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(m_texFormat);
528*35238bceSAndroid Build Coastguard Worker         int pixelSize                   = m_texFormat.getPixelSize();
529*35238bceSAndroid Build Coastguard Worker         uint32_t tex                    = 0;
530*35238bceSAndroid Build Coastguard Worker         uint32_t buf                    = 0;
531*35238bceSAndroid Build Coastguard Worker         vector<uint8_t> data;
532*35238bceSAndroid Build Coastguard Worker 
533*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_numLevels == 1);
534*35238bceSAndroid Build Coastguard Worker 
535*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
536*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
537*35238bceSAndroid Build Coastguard Worker 
538*35238bceSAndroid Build Coastguard Worker         // Fill with gradient.
539*35238bceSAndroid Build Coastguard Worker         {
540*35238bceSAndroid Build Coastguard Worker             int rowPitch   = deAlign32(pixelSize * m_size, 4);
541*35238bceSAndroid Build Coastguard Worker             int slicePitch = rowPitch * m_size;
542*35238bceSAndroid Build Coastguard Worker 
543*35238bceSAndroid Build Coastguard Worker             data.resize(slicePitch * m_depth);
544*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(
545*35238bceSAndroid Build Coastguard Worker                 tcu::PixelBufferAccess(m_texFormat, m_size, m_size, m_depth, rowPitch, slicePitch, &data[0]),
546*35238bceSAndroid Build Coastguard Worker                 m_texFormatInfo.valueMin, m_texFormatInfo.valueMax);
547*35238bceSAndroid Build Coastguard Worker         }
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_internalFormat, m_size, m_size, m_depth, 0, transferFmt.format,
550*35238bceSAndroid Build Coastguard Worker                      transferFmt.dataType, &data[0]);
551*35238bceSAndroid Build Coastguard Worker 
552*35238bceSAndroid Build Coastguard Worker         // Fill data with grid.
553*35238bceSAndroid Build Coastguard Worker         {
554*35238bceSAndroid Build Coastguard Worker             int rowLength   = m_rowLength > 0 ? m_rowLength : m_subW;
555*35238bceSAndroid Build Coastguard Worker             int rowPitch    = deAlign32(rowLength * pixelSize, m_alignment);
556*35238bceSAndroid Build Coastguard Worker             int imageHeight = m_imageHeight > 0 ? m_imageHeight : m_subH;
557*35238bceSAndroid Build Coastguard Worker             int slicePitch  = imageHeight * rowPitch;
558*35238bceSAndroid Build Coastguard Worker             Vec4 cScale     = m_texFormatInfo.valueMax - m_texFormatInfo.valueMin;
559*35238bceSAndroid Build Coastguard Worker             Vec4 cBias      = m_texFormatInfo.valueMin;
560*35238bceSAndroid Build Coastguard Worker             Vec4 colorA     = Vec4(1.0f, 0.0f, 0.0f, 1.0f) * cScale + cBias;
561*35238bceSAndroid Build Coastguard Worker             Vec4 colorB     = Vec4(0.0f, 1.0f, 0.0f, 1.0f) * cScale + cBias;
562*35238bceSAndroid Build Coastguard Worker 
563*35238bceSAndroid Build Coastguard Worker             data.resize(slicePitch * (m_depth + m_skipImages) + m_offset);
564*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(tcu::PixelBufferAccess(m_texFormat, m_subW, m_subH, m_subD, rowPitch, slicePitch,
565*35238bceSAndroid Build Coastguard Worker                                                      &data[0] + m_skipImages * slicePitch + m_skipRows * rowPitch +
566*35238bceSAndroid Build Coastguard Worker                                                          m_skipPixels * pixelSize + m_offset),
567*35238bceSAndroid Build Coastguard Worker                               4, colorA, colorB);
568*35238bceSAndroid Build Coastguard Worker         }
569*35238bceSAndroid Build Coastguard Worker 
570*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
571*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
572*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, (int)data.size(), &data[0], GL_STATIC_DRAW);
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, m_imageHeight);
575*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ROW_LENGTH, m_rowLength);
576*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_IMAGES, m_skipImages);
577*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_ROWS, m_skipRows);
578*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_PIXELS, m_skipPixels);
579*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, m_alignment);
580*35238bceSAndroid Build Coastguard Worker         glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_subX, m_subY, m_subZ, m_subW, m_subH, m_subD,
581*35238bceSAndroid Build Coastguard Worker                         transferFmt.format, transferFmt.dataType, (const void *)(intptr_t)m_offset);
582*35238bceSAndroid Build Coastguard Worker     }
583*35238bceSAndroid Build Coastguard Worker 
584*35238bceSAndroid Build Coastguard Worker     uint32_t m_internalFormat;
585*35238bceSAndroid Build Coastguard Worker     int m_subX;
586*35238bceSAndroid Build Coastguard Worker     int m_subY;
587*35238bceSAndroid Build Coastguard Worker     int m_subZ;
588*35238bceSAndroid Build Coastguard Worker     int m_subW;
589*35238bceSAndroid Build Coastguard Worker     int m_subH;
590*35238bceSAndroid Build Coastguard Worker     int m_subD;
591*35238bceSAndroid Build Coastguard Worker     int m_imageHeight;
592*35238bceSAndroid Build Coastguard Worker     int m_rowLength;
593*35238bceSAndroid Build Coastguard Worker     int m_skipImages;
594*35238bceSAndroid Build Coastguard Worker     int m_skipRows;
595*35238bceSAndroid Build Coastguard Worker     int m_skipPixels;
596*35238bceSAndroid Build Coastguard Worker     int m_alignment;
597*35238bceSAndroid Build Coastguard Worker     int m_offset;
598*35238bceSAndroid Build Coastguard Worker };
599*35238bceSAndroid Build Coastguard Worker 
600*35238bceSAndroid Build Coastguard Worker // TexImage3D() depth case.
601*35238bceSAndroid Build Coastguard Worker class TexImageCubeArrayDepthCase : public TextureCubeArraySpecCase
602*35238bceSAndroid Build Coastguard Worker {
603*35238bceSAndroid Build Coastguard Worker public:
TexImageCubeArrayDepthCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int imageSize,int numLayers)604*35238bceSAndroid Build Coastguard Worker     TexImageCubeArrayDepthCase(Context &context, const char *name, const char *desc, uint32_t internalFormat,
605*35238bceSAndroid Build Coastguard Worker                                int imageSize, int numLayers)
606*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), imageSize, numLayers,
607*35238bceSAndroid Build Coastguard Worker                                    maxLevelCount(imageSize))
608*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
609*35238bceSAndroid Build Coastguard Worker     {
610*35238bceSAndroid Build Coastguard Worker         // we are interested in the behavior near [-2, 2], map it to visible range [0, 1]
611*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupBias  = Vec4(0.25f, 0.0f, 0.0f, 1.0f);
612*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupScale = Vec4(0.5f, 1.0f, 1.0f, 0.0f);
613*35238bceSAndroid Build Coastguard Worker     }
614*35238bceSAndroid Build Coastguard Worker 
createTexture(void)615*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
616*35238bceSAndroid Build Coastguard Worker     {
617*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat fmt = glu::getTransferFormat(m_texFormat);
618*35238bceSAndroid Build Coastguard Worker         uint32_t tex            = 0;
619*35238bceSAndroid Build Coastguard Worker         tcu::TextureLevel levelData(glu::mapGLTransferFormat(fmt.format, fmt.dataType));
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
622*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
623*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
624*35238bceSAndroid Build Coastguard Worker         GLU_CHECK();
625*35238bceSAndroid Build Coastguard Worker 
626*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < m_numLevels; ndx++)
627*35238bceSAndroid Build Coastguard Worker         {
628*35238bceSAndroid Build Coastguard Worker             const int levelW = de::max(1, m_size >> ndx);
629*35238bceSAndroid Build Coastguard Worker             const Vec4 gMin  = Vec4(-1.5f, -2.0f, 1.7f, -1.5f);
630*35238bceSAndroid Build Coastguard Worker             const Vec4 gMax  = Vec4(2.0f, 1.5f, -1.0f, 2.0f);
631*35238bceSAndroid Build Coastguard Worker 
632*35238bceSAndroid Build Coastguard Worker             levelData.setSize(levelW, levelW, m_depth);
633*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(levelData.getAccess(), gMin, gMax);
634*35238bceSAndroid Build Coastguard Worker 
635*35238bceSAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, ndx, m_internalFormat, levelW, levelW, m_depth, 0, fmt.format,
636*35238bceSAndroid Build Coastguard Worker                          fmt.dataType, levelData.getAccess().getDataPtr());
637*35238bceSAndroid Build Coastguard Worker         }
638*35238bceSAndroid Build Coastguard Worker     }
639*35238bceSAndroid Build Coastguard Worker 
640*35238bceSAndroid Build Coastguard Worker     const uint32_t m_internalFormat;
641*35238bceSAndroid Build Coastguard Worker };
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker // TexSubImage3D() depth case.
644*35238bceSAndroid Build Coastguard Worker class TexSubImageCubeArrayDepthCase : public TextureCubeArraySpecCase
645*35238bceSAndroid Build Coastguard Worker {
646*35238bceSAndroid Build Coastguard Worker public:
TexSubImageCubeArrayDepthCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int imageSize,int numLayers)647*35238bceSAndroid Build Coastguard Worker     TexSubImageCubeArrayDepthCase(Context &context, const char *name, const char *desc, uint32_t internalFormat,
648*35238bceSAndroid Build Coastguard Worker                                   int imageSize, int numLayers)
649*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), imageSize, numLayers,
650*35238bceSAndroid Build Coastguard Worker                                    maxLevelCount(imageSize))
651*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
652*35238bceSAndroid Build Coastguard Worker     {
653*35238bceSAndroid Build Coastguard Worker         // we are interested in the behavior near [-2, 2], map it to visible range [0, 1]
654*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupBias  = Vec4(0.25f, 0.0f, 0.0f, 1.0f);
655*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupScale = Vec4(0.5f, 1.0f, 1.0f, 0.0f);
656*35238bceSAndroid Build Coastguard Worker     }
657*35238bceSAndroid Build Coastguard Worker 
createTexture(void)658*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
659*35238bceSAndroid Build Coastguard Worker     {
660*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat fmt = glu::getTransferFormat(m_texFormat);
661*35238bceSAndroid Build Coastguard Worker         de::Random rnd(deStringHash(getName()));
662*35238bceSAndroid Build Coastguard Worker         uint32_t tex = 0;
663*35238bceSAndroid Build Coastguard Worker         tcu::TextureLevel levelData(glu::mapGLTransferFormat(fmt.format, fmt.dataType));
664*35238bceSAndroid Build Coastguard Worker 
665*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
666*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
667*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
668*35238bceSAndroid Build Coastguard Worker         GLU_CHECK();
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker         // First specify full texture.
671*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < m_numLevels; ndx++)
672*35238bceSAndroid Build Coastguard Worker         {
673*35238bceSAndroid Build Coastguard Worker             const int levelW = de::max(1, m_size >> ndx);
674*35238bceSAndroid Build Coastguard Worker             const Vec4 gMin  = Vec4(-1.5f, -2.0f, 1.7f, -1.5f);
675*35238bceSAndroid Build Coastguard Worker             const Vec4 gMax  = Vec4(2.0f, 1.5f, -1.0f, 2.0f);
676*35238bceSAndroid Build Coastguard Worker 
677*35238bceSAndroid Build Coastguard Worker             levelData.setSize(levelW, levelW, m_depth);
678*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(levelData.getAccess(), gMin, gMax);
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker             glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, ndx, m_internalFormat, levelW, levelW, m_depth, 0, fmt.format,
681*35238bceSAndroid Build Coastguard Worker                          fmt.dataType, levelData.getAccess().getDataPtr());
682*35238bceSAndroid Build Coastguard Worker         }
683*35238bceSAndroid Build Coastguard Worker 
684*35238bceSAndroid Build Coastguard Worker         // Re-specify parts of each level.
685*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < m_numLevels; ndx++)
686*35238bceSAndroid Build Coastguard Worker         {
687*35238bceSAndroid Build Coastguard Worker             const int levelW = de::max(1, m_size >> ndx);
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker             const int w = rnd.getInt(1, levelW);
690*35238bceSAndroid Build Coastguard Worker             const int h = rnd.getInt(1, levelW);
691*35238bceSAndroid Build Coastguard Worker             const int d = rnd.getInt(1, m_depth);
692*35238bceSAndroid Build Coastguard Worker             const int x = rnd.getInt(0, levelW - w);
693*35238bceSAndroid Build Coastguard Worker             const int y = rnd.getInt(0, levelW - h);
694*35238bceSAndroid Build Coastguard Worker             const int z = rnd.getInt(0, m_depth - d);
695*35238bceSAndroid Build Coastguard Worker 
696*35238bceSAndroid Build Coastguard Worker             const Vec4 colorA  = Vec4(2.0f, 1.5f, -1.0f, 2.0f);
697*35238bceSAndroid Build Coastguard Worker             const Vec4 colorB  = Vec4(-1.5f, -2.0f, 1.7f, -1.5f);
698*35238bceSAndroid Build Coastguard Worker             const int cellSize = rnd.getInt(2, 16);
699*35238bceSAndroid Build Coastguard Worker 
700*35238bceSAndroid Build Coastguard Worker             levelData.setSize(w, h, d);
701*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(levelData.getAccess(), cellSize, colorA, colorB);
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker             glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, ndx, x, y, z, w, h, d, fmt.format, fmt.dataType,
704*35238bceSAndroid Build Coastguard Worker                             levelData.getAccess().getDataPtr());
705*35238bceSAndroid Build Coastguard Worker         }
706*35238bceSAndroid Build Coastguard Worker     }
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker     const uint32_t m_internalFormat;
709*35238bceSAndroid Build Coastguard Worker };
710*35238bceSAndroid Build Coastguard Worker 
711*35238bceSAndroid Build Coastguard Worker // TexImage3D() depth case with pbo.
712*35238bceSAndroid Build Coastguard Worker class TexImageCubeArrayDepthBufferCase : public TextureCubeArraySpecCase
713*35238bceSAndroid Build Coastguard Worker {
714*35238bceSAndroid Build Coastguard Worker public:
TexImageCubeArrayDepthBufferCase(Context & context,const char * name,const char * desc,uint32_t internalFormat,int imageSize,int numLayers)715*35238bceSAndroid Build Coastguard Worker     TexImageCubeArrayDepthBufferCase(Context &context, const char *name, const char *desc, uint32_t internalFormat,
716*35238bceSAndroid Build Coastguard Worker                                      int imageSize, int numLayers)
717*35238bceSAndroid Build Coastguard Worker         : TextureCubeArraySpecCase(context, name, desc, glu::mapGLInternalFormat(internalFormat), imageSize, numLayers,
718*35238bceSAndroid Build Coastguard Worker                                    1)
719*35238bceSAndroid Build Coastguard Worker         , m_internalFormat(internalFormat)
720*35238bceSAndroid Build Coastguard Worker     {
721*35238bceSAndroid Build Coastguard Worker         // we are interested in the behavior near [-2, 2], map it to visible range [0, 1]
722*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupBias  = Vec4(0.25f, 0.0f, 0.0f, 1.0f);
723*35238bceSAndroid Build Coastguard Worker         m_texFormatInfo.lookupScale = Vec4(0.5f, 1.0f, 1.0f, 0.0f);
724*35238bceSAndroid Build Coastguard Worker     }
725*35238bceSAndroid Build Coastguard Worker 
createTexture(void)726*35238bceSAndroid Build Coastguard Worker     void createTexture(void)
727*35238bceSAndroid Build Coastguard Worker     {
728*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(m_texFormat);
729*35238bceSAndroid Build Coastguard Worker         int pixelSize                   = m_texFormat.getPixelSize();
730*35238bceSAndroid Build Coastguard Worker         int rowLength                   = m_size;
731*35238bceSAndroid Build Coastguard Worker         int alignment                   = 4;
732*35238bceSAndroid Build Coastguard Worker         int rowPitch                    = deAlign32(rowLength * pixelSize, alignment);
733*35238bceSAndroid Build Coastguard Worker         int imageHeight                 = m_size;
734*35238bceSAndroid Build Coastguard Worker         int slicePitch                  = imageHeight * rowPitch;
735*35238bceSAndroid Build Coastguard Worker         uint32_t tex                    = 0;
736*35238bceSAndroid Build Coastguard Worker         uint32_t buf                    = 0;
737*35238bceSAndroid Build Coastguard Worker         vector<uint8_t> data;
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(m_numLevels == 1);
740*35238bceSAndroid Build Coastguard Worker 
741*35238bceSAndroid Build Coastguard Worker         // Fill data with grid.
742*35238bceSAndroid Build Coastguard Worker         data.resize(slicePitch * m_depth);
743*35238bceSAndroid Build Coastguard Worker         {
744*35238bceSAndroid Build Coastguard Worker             const Vec4 gMin = Vec4(-1.5f, -2.0f, 1.7f, -1.5f);
745*35238bceSAndroid Build Coastguard Worker             const Vec4 gMax = Vec4(2.0f, 1.5f, -1.0f, 2.0f);
746*35238bceSAndroid Build Coastguard Worker 
747*35238bceSAndroid Build Coastguard Worker             tcu::fillWithComponentGradients(
748*35238bceSAndroid Build Coastguard Worker                 tcu::PixelBufferAccess(m_texFormat, m_size, m_size, m_depth, rowPitch, slicePitch, &data[0]), gMin,
749*35238bceSAndroid Build Coastguard Worker                 gMax);
750*35238bceSAndroid Build Coastguard Worker         }
751*35238bceSAndroid Build Coastguard Worker 
752*35238bceSAndroid Build Coastguard Worker         glGenBuffers(1, &buf);
753*35238bceSAndroid Build Coastguard Worker         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buf);
754*35238bceSAndroid Build Coastguard Worker         glBufferData(GL_PIXEL_UNPACK_BUFFER, (int)data.size(), &data[0], GL_STATIC_DRAW);
755*35238bceSAndroid Build Coastguard Worker 
756*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_IMAGE_HEIGHT, imageHeight);
757*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ROW_LENGTH, rowLength);
758*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
759*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
760*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
761*35238bceSAndroid Build Coastguard Worker         glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
762*35238bceSAndroid Build Coastguard Worker 
763*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &tex);
764*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
765*35238bceSAndroid Build Coastguard Worker         glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, m_internalFormat, m_size, m_size, m_depth, 0, transferFmt.format,
766*35238bceSAndroid Build Coastguard Worker                      transferFmt.dataType, DE_NULL);
767*35238bceSAndroid Build Coastguard Worker         glDeleteBuffers(1, &buf);
768*35238bceSAndroid Build Coastguard Worker     }
769*35238bceSAndroid Build Coastguard Worker 
770*35238bceSAndroid Build Coastguard Worker     const uint32_t m_internalFormat;
771*35238bceSAndroid Build Coastguard Worker };
772*35238bceSAndroid Build Coastguard Worker 
TextureSpecificationTests(Context & context)773*35238bceSAndroid Build Coastguard Worker TextureSpecificationTests::TextureSpecificationTests(Context &context)
774*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "specification", "Texture Specification Tests")
775*35238bceSAndroid Build Coastguard Worker {
776*35238bceSAndroid Build Coastguard Worker }
777*35238bceSAndroid Build Coastguard Worker 
~TextureSpecificationTests(void)778*35238bceSAndroid Build Coastguard Worker TextureSpecificationTests::~TextureSpecificationTests(void)
779*35238bceSAndroid Build Coastguard Worker {
780*35238bceSAndroid Build Coastguard Worker }
781*35238bceSAndroid Build Coastguard Worker 
init(void)782*35238bceSAndroid Build Coastguard Worker void TextureSpecificationTests::init(void)
783*35238bceSAndroid Build Coastguard Worker {
784*35238bceSAndroid Build Coastguard Worker     struct
785*35238bceSAndroid Build Coastguard Worker     {
786*35238bceSAndroid Build Coastguard Worker         const char *name;
787*35238bceSAndroid Build Coastguard Worker         uint32_t internalFormat;
788*35238bceSAndroid Build Coastguard Worker     } colorFormats[] = {{
789*35238bceSAndroid Build Coastguard Worker                             "rgba32f",
790*35238bceSAndroid Build Coastguard Worker                             GL_RGBA32F,
791*35238bceSAndroid Build Coastguard Worker                         },
792*35238bceSAndroid Build Coastguard Worker                         {
793*35238bceSAndroid Build Coastguard Worker                             "rgba32i",
794*35238bceSAndroid Build Coastguard Worker                             GL_RGBA32I,
795*35238bceSAndroid Build Coastguard Worker                         },
796*35238bceSAndroid Build Coastguard Worker                         {
797*35238bceSAndroid Build Coastguard Worker                             "rgba32ui",
798*35238bceSAndroid Build Coastguard Worker                             GL_RGBA32UI,
799*35238bceSAndroid Build Coastguard Worker                         },
800*35238bceSAndroid Build Coastguard Worker                         {
801*35238bceSAndroid Build Coastguard Worker                             "rgba16f",
802*35238bceSAndroid Build Coastguard Worker                             GL_RGBA16F,
803*35238bceSAndroid Build Coastguard Worker                         },
804*35238bceSAndroid Build Coastguard Worker                         {
805*35238bceSAndroid Build Coastguard Worker                             "rgba16i",
806*35238bceSAndroid Build Coastguard Worker                             GL_RGBA16I,
807*35238bceSAndroid Build Coastguard Worker                         },
808*35238bceSAndroid Build Coastguard Worker                         {
809*35238bceSAndroid Build Coastguard Worker                             "rgba16ui",
810*35238bceSAndroid Build Coastguard Worker                             GL_RGBA16UI,
811*35238bceSAndroid Build Coastguard Worker                         },
812*35238bceSAndroid Build Coastguard Worker                         {
813*35238bceSAndroid Build Coastguard Worker                             "rgba8",
814*35238bceSAndroid Build Coastguard Worker                             GL_RGBA8,
815*35238bceSAndroid Build Coastguard Worker                         },
816*35238bceSAndroid Build Coastguard Worker                         {
817*35238bceSAndroid Build Coastguard Worker                             "rgba8i",
818*35238bceSAndroid Build Coastguard Worker                             GL_RGBA8I,
819*35238bceSAndroid Build Coastguard Worker                         },
820*35238bceSAndroid Build Coastguard Worker                         {
821*35238bceSAndroid Build Coastguard Worker                             "rgba8ui",
822*35238bceSAndroid Build Coastguard Worker                             GL_RGBA8UI,
823*35238bceSAndroid Build Coastguard Worker                         },
824*35238bceSAndroid Build Coastguard Worker                         {
825*35238bceSAndroid Build Coastguard Worker                             "srgb8_alpha8",
826*35238bceSAndroid Build Coastguard Worker                             GL_SRGB8_ALPHA8,
827*35238bceSAndroid Build Coastguard Worker                         },
828*35238bceSAndroid Build Coastguard Worker                         {
829*35238bceSAndroid Build Coastguard Worker                             "rgb10_a2",
830*35238bceSAndroid Build Coastguard Worker                             GL_RGB10_A2,
831*35238bceSAndroid Build Coastguard Worker                         },
832*35238bceSAndroid Build Coastguard Worker                         {
833*35238bceSAndroid Build Coastguard Worker                             "rgb10_a2ui",
834*35238bceSAndroid Build Coastguard Worker                             GL_RGB10_A2UI,
835*35238bceSAndroid Build Coastguard Worker                         },
836*35238bceSAndroid Build Coastguard Worker                         {
837*35238bceSAndroid Build Coastguard Worker                             "rgba4",
838*35238bceSAndroid Build Coastguard Worker                             GL_RGBA4,
839*35238bceSAndroid Build Coastguard Worker                         },
840*35238bceSAndroid Build Coastguard Worker                         {
841*35238bceSAndroid Build Coastguard Worker                             "rgb5_a1",
842*35238bceSAndroid Build Coastguard Worker                             GL_RGB5_A1,
843*35238bceSAndroid Build Coastguard Worker                         },
844*35238bceSAndroid Build Coastguard Worker                         {
845*35238bceSAndroid Build Coastguard Worker                             "rgba8_snorm",
846*35238bceSAndroid Build Coastguard Worker                             GL_RGBA8_SNORM,
847*35238bceSAndroid Build Coastguard Worker                         },
848*35238bceSAndroid Build Coastguard Worker                         {
849*35238bceSAndroid Build Coastguard Worker                             "rgb8",
850*35238bceSAndroid Build Coastguard Worker                             GL_RGB8,
851*35238bceSAndroid Build Coastguard Worker                         },
852*35238bceSAndroid Build Coastguard Worker                         {
853*35238bceSAndroid Build Coastguard Worker                             "rgb565",
854*35238bceSAndroid Build Coastguard Worker                             GL_RGB565,
855*35238bceSAndroid Build Coastguard Worker                         },
856*35238bceSAndroid Build Coastguard Worker                         {
857*35238bceSAndroid Build Coastguard Worker                             "r11f_g11f_b10f",
858*35238bceSAndroid Build Coastguard Worker                             GL_R11F_G11F_B10F,
859*35238bceSAndroid Build Coastguard Worker                         },
860*35238bceSAndroid Build Coastguard Worker                         {
861*35238bceSAndroid Build Coastguard Worker                             "rgb32f",
862*35238bceSAndroid Build Coastguard Worker                             GL_RGB32F,
863*35238bceSAndroid Build Coastguard Worker                         },
864*35238bceSAndroid Build Coastguard Worker                         {
865*35238bceSAndroid Build Coastguard Worker                             "rgb32i",
866*35238bceSAndroid Build Coastguard Worker                             GL_RGB32I,
867*35238bceSAndroid Build Coastguard Worker                         },
868*35238bceSAndroid Build Coastguard Worker                         {
869*35238bceSAndroid Build Coastguard Worker                             "rgb32ui",
870*35238bceSAndroid Build Coastguard Worker                             GL_RGB32UI,
871*35238bceSAndroid Build Coastguard Worker                         },
872*35238bceSAndroid Build Coastguard Worker                         {
873*35238bceSAndroid Build Coastguard Worker                             "rgb16f",
874*35238bceSAndroid Build Coastguard Worker                             GL_RGB16F,
875*35238bceSAndroid Build Coastguard Worker                         },
876*35238bceSAndroid Build Coastguard Worker                         {
877*35238bceSAndroid Build Coastguard Worker                             "rgb16i",
878*35238bceSAndroid Build Coastguard Worker                             GL_RGB16I,
879*35238bceSAndroid Build Coastguard Worker                         },
880*35238bceSAndroid Build Coastguard Worker                         {
881*35238bceSAndroid Build Coastguard Worker                             "rgb16ui",
882*35238bceSAndroid Build Coastguard Worker                             GL_RGB16UI,
883*35238bceSAndroid Build Coastguard Worker                         },
884*35238bceSAndroid Build Coastguard Worker                         {
885*35238bceSAndroid Build Coastguard Worker                             "rgb8_snorm",
886*35238bceSAndroid Build Coastguard Worker                             GL_RGB8_SNORM,
887*35238bceSAndroid Build Coastguard Worker                         },
888*35238bceSAndroid Build Coastguard Worker                         {
889*35238bceSAndroid Build Coastguard Worker                             "rgb8i",
890*35238bceSAndroid Build Coastguard Worker                             GL_RGB8I,
891*35238bceSAndroid Build Coastguard Worker                         },
892*35238bceSAndroid Build Coastguard Worker                         {
893*35238bceSAndroid Build Coastguard Worker                             "rgb8ui",
894*35238bceSAndroid Build Coastguard Worker                             GL_RGB8UI,
895*35238bceSAndroid Build Coastguard Worker                         },
896*35238bceSAndroid Build Coastguard Worker                         {
897*35238bceSAndroid Build Coastguard Worker                             "srgb8",
898*35238bceSAndroid Build Coastguard Worker                             GL_SRGB8,
899*35238bceSAndroid Build Coastguard Worker                         },
900*35238bceSAndroid Build Coastguard Worker                         {
901*35238bceSAndroid Build Coastguard Worker                             "rgb9_e5",
902*35238bceSAndroid Build Coastguard Worker                             GL_RGB9_E5,
903*35238bceSAndroid Build Coastguard Worker                         },
904*35238bceSAndroid Build Coastguard Worker                         {
905*35238bceSAndroid Build Coastguard Worker                             "rg32f",
906*35238bceSAndroid Build Coastguard Worker                             GL_RG32F,
907*35238bceSAndroid Build Coastguard Worker                         },
908*35238bceSAndroid Build Coastguard Worker                         {
909*35238bceSAndroid Build Coastguard Worker                             "rg32i",
910*35238bceSAndroid Build Coastguard Worker                             GL_RG32I,
911*35238bceSAndroid Build Coastguard Worker                         },
912*35238bceSAndroid Build Coastguard Worker                         {
913*35238bceSAndroid Build Coastguard Worker                             "rg32ui",
914*35238bceSAndroid Build Coastguard Worker                             GL_RG32UI,
915*35238bceSAndroid Build Coastguard Worker                         },
916*35238bceSAndroid Build Coastguard Worker                         {
917*35238bceSAndroid Build Coastguard Worker                             "rg16f",
918*35238bceSAndroid Build Coastguard Worker                             GL_RG16F,
919*35238bceSAndroid Build Coastguard Worker                         },
920*35238bceSAndroid Build Coastguard Worker                         {
921*35238bceSAndroid Build Coastguard Worker                             "rg16i",
922*35238bceSAndroid Build Coastguard Worker                             GL_RG16I,
923*35238bceSAndroid Build Coastguard Worker                         },
924*35238bceSAndroid Build Coastguard Worker                         {
925*35238bceSAndroid Build Coastguard Worker                             "rg16ui",
926*35238bceSAndroid Build Coastguard Worker                             GL_RG16UI,
927*35238bceSAndroid Build Coastguard Worker                         },
928*35238bceSAndroid Build Coastguard Worker                         {
929*35238bceSAndroid Build Coastguard Worker                             "rg8",
930*35238bceSAndroid Build Coastguard Worker                             GL_RG8,
931*35238bceSAndroid Build Coastguard Worker                         },
932*35238bceSAndroid Build Coastguard Worker                         {
933*35238bceSAndroid Build Coastguard Worker                             "rg8i",
934*35238bceSAndroid Build Coastguard Worker                             GL_RG8I,
935*35238bceSAndroid Build Coastguard Worker                         },
936*35238bceSAndroid Build Coastguard Worker                         {
937*35238bceSAndroid Build Coastguard Worker                             "rg8ui",
938*35238bceSAndroid Build Coastguard Worker                             GL_RG8UI,
939*35238bceSAndroid Build Coastguard Worker                         },
940*35238bceSAndroid Build Coastguard Worker                         {
941*35238bceSAndroid Build Coastguard Worker                             "rg8_snorm",
942*35238bceSAndroid Build Coastguard Worker                             GL_RG8_SNORM,
943*35238bceSAndroid Build Coastguard Worker                         },
944*35238bceSAndroid Build Coastguard Worker                         {
945*35238bceSAndroid Build Coastguard Worker                             "r32f",
946*35238bceSAndroid Build Coastguard Worker                             GL_R32F,
947*35238bceSAndroid Build Coastguard Worker                         },
948*35238bceSAndroid Build Coastguard Worker                         {
949*35238bceSAndroid Build Coastguard Worker                             "r32i",
950*35238bceSAndroid Build Coastguard Worker                             GL_R32I,
951*35238bceSAndroid Build Coastguard Worker                         },
952*35238bceSAndroid Build Coastguard Worker                         {
953*35238bceSAndroid Build Coastguard Worker                             "r32ui",
954*35238bceSAndroid Build Coastguard Worker                             GL_R32UI,
955*35238bceSAndroid Build Coastguard Worker                         },
956*35238bceSAndroid Build Coastguard Worker                         {
957*35238bceSAndroid Build Coastguard Worker                             "r16f",
958*35238bceSAndroid Build Coastguard Worker                             GL_R16F,
959*35238bceSAndroid Build Coastguard Worker                         },
960*35238bceSAndroid Build Coastguard Worker                         {
961*35238bceSAndroid Build Coastguard Worker                             "r16i",
962*35238bceSAndroid Build Coastguard Worker                             GL_R16I,
963*35238bceSAndroid Build Coastguard Worker                         },
964*35238bceSAndroid Build Coastguard Worker                         {
965*35238bceSAndroid Build Coastguard Worker                             "r16ui",
966*35238bceSAndroid Build Coastguard Worker                             GL_R16UI,
967*35238bceSAndroid Build Coastguard Worker                         },
968*35238bceSAndroid Build Coastguard Worker                         {
969*35238bceSAndroid Build Coastguard Worker                             "r8",
970*35238bceSAndroid Build Coastguard Worker                             GL_R8,
971*35238bceSAndroid Build Coastguard Worker                         },
972*35238bceSAndroid Build Coastguard Worker                         {
973*35238bceSAndroid Build Coastguard Worker                             "r8i",
974*35238bceSAndroid Build Coastguard Worker                             GL_R8I,
975*35238bceSAndroid Build Coastguard Worker                         },
976*35238bceSAndroid Build Coastguard Worker                         {
977*35238bceSAndroid Build Coastguard Worker                             "r8ui",
978*35238bceSAndroid Build Coastguard Worker                             GL_R8UI,
979*35238bceSAndroid Build Coastguard Worker                         },
980*35238bceSAndroid Build Coastguard Worker                         {
981*35238bceSAndroid Build Coastguard Worker                             "r8_snorm",
982*35238bceSAndroid Build Coastguard Worker                             GL_R8_SNORM,
983*35238bceSAndroid Build Coastguard Worker                         }};
984*35238bceSAndroid Build Coastguard Worker 
985*35238bceSAndroid Build Coastguard Worker     static const struct
986*35238bceSAndroid Build Coastguard Worker     {
987*35238bceSAndroid Build Coastguard Worker         const char *name;
988*35238bceSAndroid Build Coastguard Worker         uint32_t internalFormat;
989*35238bceSAndroid Build Coastguard Worker     } depthStencilFormats[] = {// Depth and stencil formats
990*35238bceSAndroid Build Coastguard Worker                                {"depth_component32f", GL_DEPTH_COMPONENT32F},
991*35238bceSAndroid Build Coastguard Worker                                {"depth_component24", GL_DEPTH_COMPONENT24},
992*35238bceSAndroid Build Coastguard Worker                                {"depth_component16", GL_DEPTH_COMPONENT16},
993*35238bceSAndroid Build Coastguard Worker                                {"depth32f_stencil8", GL_DEPTH32F_STENCIL8},
994*35238bceSAndroid Build Coastguard Worker                                {"depth24_stencil8", GL_DEPTH24_STENCIL8}};
995*35238bceSAndroid Build Coastguard Worker 
996*35238bceSAndroid Build Coastguard Worker     // Basic TexImage3D usage.
997*35238bceSAndroid Build Coastguard Worker     {
998*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *basicTexImageGroup =
999*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "basic_teximage3d", "Basic glTexImage3D() usage");
1000*35238bceSAndroid Build Coastguard Worker         addChild(basicTexImageGroup);
1001*35238bceSAndroid Build Coastguard Worker         for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(colorFormats); formatNdx++)
1002*35238bceSAndroid Build Coastguard Worker         {
1003*35238bceSAndroid Build Coastguard Worker             const char *fmtName          = colorFormats[formatNdx].name;
1004*35238bceSAndroid Build Coastguard Worker             uint32_t format              = colorFormats[formatNdx].internalFormat;
1005*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize   = 64;
1006*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayLayers = 6;
1007*35238bceSAndroid Build Coastguard Worker 
1008*35238bceSAndroid Build Coastguard Worker             basicTexImageGroup->addChild(new BasicTexImageCubeArrayCase(m_context,
1009*35238bceSAndroid Build Coastguard Worker                                                                         (string(fmtName) + "_cube_array").c_str(), "",
1010*35238bceSAndroid Build Coastguard Worker                                                                         format, texCubeArraySize, texCubeArrayLayers));
1011*35238bceSAndroid Build Coastguard Worker         }
1012*35238bceSAndroid Build Coastguard Worker     }
1013*35238bceSAndroid Build Coastguard Worker 
1014*35238bceSAndroid Build Coastguard Worker     // glTexImage3D() pbo cases.
1015*35238bceSAndroid Build Coastguard Worker     {
1016*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *pboGroup = new tcu::TestCaseGroup(m_testCtx, "teximage3d_pbo", "glTexImage3D() from PBO");
1017*35238bceSAndroid Build Coastguard Worker         addChild(pboGroup);
1018*35238bceSAndroid Build Coastguard Worker 
1019*35238bceSAndroid Build Coastguard Worker         // Parameter cases
1020*35238bceSAndroid Build Coastguard Worker         static const struct
1021*35238bceSAndroid Build Coastguard Worker         {
1022*35238bceSAndroid Build Coastguard Worker             const char *name;
1023*35238bceSAndroid Build Coastguard Worker             uint32_t format;
1024*35238bceSAndroid Build Coastguard Worker             int size;
1025*35238bceSAndroid Build Coastguard Worker             int depth;
1026*35238bceSAndroid Build Coastguard Worker             int imageHeight;
1027*35238bceSAndroid Build Coastguard Worker             int rowLength;
1028*35238bceSAndroid Build Coastguard Worker             int skipImages;
1029*35238bceSAndroid Build Coastguard Worker             int skipRows;
1030*35238bceSAndroid Build Coastguard Worker             int skipPixels;
1031*35238bceSAndroid Build Coastguard Worker             int alignment;
1032*35238bceSAndroid Build Coastguard Worker             int offset;
1033*35238bceSAndroid Build Coastguard Worker         } parameterCases[] = {{"rgb8_offset", GL_RGB8, 23, 6, 0, 0, 0, 0, 0, 1, 67},
1034*35238bceSAndroid Build Coastguard Worker                               {"rgb8_alignment", GL_RGB8, 23, 6, 0, 0, 0, 0, 0, 2, 0},
1035*35238bceSAndroid Build Coastguard Worker                               {"rgb8_image_height", GL_RGB8, 23, 6, 26, 0, 0, 0, 0, 4, 0},
1036*35238bceSAndroid Build Coastguard Worker                               {"rgb8_row_length", GL_RGB8, 23, 6, 0, 27, 0, 0, 0, 4, 0},
1037*35238bceSAndroid Build Coastguard Worker                               {"rgb8_skip_images", GL_RGB8, 23, 6, 0, 0, 3, 0, 0, 4, 0},
1038*35238bceSAndroid Build Coastguard Worker                               {"rgb8_skip_rows", GL_RGB8, 23, 6, 26, 0, 0, 3, 0, 4, 0},
1039*35238bceSAndroid Build Coastguard Worker                               {"rgb8_skip_pixels", GL_RGB8, 23, 6, 0, 25, 0, 0, 2, 4, 0}};
1040*35238bceSAndroid Build Coastguard Worker 
1041*35238bceSAndroid Build Coastguard Worker         for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(colorFormats); formatNdx++)
1042*35238bceSAndroid Build Coastguard Worker         {
1043*35238bceSAndroid Build Coastguard Worker             const string fmtName       = colorFormats[formatNdx].name;
1044*35238bceSAndroid Build Coastguard Worker             const uint32_t format      = colorFormats[formatNdx].internalFormat;
1045*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize = 20;
1046*35238bceSAndroid Build Coastguard Worker             const int texCubeDepth     = 6;
1047*35238bceSAndroid Build Coastguard Worker 
1048*35238bceSAndroid Build Coastguard Worker             pboGroup->addChild(new TexImageCubeArrayBufferCase(m_context, (fmtName + "_cube_array").c_str(), "", format,
1049*35238bceSAndroid Build Coastguard Worker                                                                texCubeArraySize, texCubeDepth, 0, 0, 0, 0, 0, 4, 0));
1050*35238bceSAndroid Build Coastguard Worker         }
1051*35238bceSAndroid Build Coastguard Worker 
1052*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(parameterCases); ndx++)
1053*35238bceSAndroid Build Coastguard Worker         {
1054*35238bceSAndroid Build Coastguard Worker             pboGroup->addChild(new TexImageCubeArrayBufferCase(
1055*35238bceSAndroid Build Coastguard Worker                 m_context, (string(parameterCases[ndx].name) + "_cube_array").c_str(), "", parameterCases[ndx].format,
1056*35238bceSAndroid Build Coastguard Worker                 parameterCases[ndx].size, parameterCases[ndx].depth, parameterCases[ndx].imageHeight,
1057*35238bceSAndroid Build Coastguard Worker                 parameterCases[ndx].rowLength, parameterCases[ndx].skipImages, parameterCases[ndx].skipRows,
1058*35238bceSAndroid Build Coastguard Worker                 parameterCases[ndx].skipPixels, parameterCases[ndx].alignment, parameterCases[ndx].offset));
1059*35238bceSAndroid Build Coastguard Worker         }
1060*35238bceSAndroid Build Coastguard Worker     }
1061*35238bceSAndroid Build Coastguard Worker 
1062*35238bceSAndroid Build Coastguard Worker     // glTexImage3D() depth cases.
1063*35238bceSAndroid Build Coastguard Worker     {
1064*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *shadow3dGroup =
1065*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "teximage3d_depth", "glTexImage3D() with depth or depth/stencil format");
1066*35238bceSAndroid Build Coastguard Worker         addChild(shadow3dGroup);
1067*35238bceSAndroid Build Coastguard Worker 
1068*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthStencilFormats); ndx++)
1069*35238bceSAndroid Build Coastguard Worker         {
1070*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize  = 64;
1071*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayDepth = 6;
1072*35238bceSAndroid Build Coastguard Worker 
1073*35238bceSAndroid Build Coastguard Worker             shadow3dGroup->addChild(new TexImageCubeArrayDepthCase(
1074*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string(depthStencilFormats[ndx].name) + "_cube_array").c_str(), "",
1075*35238bceSAndroid Build Coastguard Worker                 depthStencilFormats[ndx].internalFormat, texCubeArraySize, texCubeArrayDepth));
1076*35238bceSAndroid Build Coastguard Worker         }
1077*35238bceSAndroid Build Coastguard Worker     }
1078*35238bceSAndroid Build Coastguard Worker 
1079*35238bceSAndroid Build Coastguard Worker     // glTexImage3D() depth cases with pbo.
1080*35238bceSAndroid Build Coastguard Worker     {
1081*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *shadow3dGroup = new tcu::TestCaseGroup(
1082*35238bceSAndroid Build Coastguard Worker             m_testCtx, "teximage3d_depth_pbo", "glTexImage3D() with depth or depth/stencil format with pbo");
1083*35238bceSAndroid Build Coastguard Worker         addChild(shadow3dGroup);
1084*35238bceSAndroid Build Coastguard Worker 
1085*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthStencilFormats); ndx++)
1086*35238bceSAndroid Build Coastguard Worker         {
1087*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize  = 64;
1088*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayDepth = 6;
1089*35238bceSAndroid Build Coastguard Worker 
1090*35238bceSAndroid Build Coastguard Worker             shadow3dGroup->addChild(new TexImageCubeArrayDepthBufferCase(
1091*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string(depthStencilFormats[ndx].name) + "_cube_array").c_str(), "",
1092*35238bceSAndroid Build Coastguard Worker                 depthStencilFormats[ndx].internalFormat, texCubeArraySize, texCubeArrayDepth));
1093*35238bceSAndroid Build Coastguard Worker         }
1094*35238bceSAndroid Build Coastguard Worker     }
1095*35238bceSAndroid Build Coastguard Worker 
1096*35238bceSAndroid Build Coastguard Worker     // glTexSubImage3D() PBO cases.
1097*35238bceSAndroid Build Coastguard Worker     {
1098*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *pboGroup =
1099*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "texsubimage3d_pbo", "glTexSubImage3D() pixel buffer object tests");
1100*35238bceSAndroid Build Coastguard Worker         addChild(pboGroup);
1101*35238bceSAndroid Build Coastguard Worker 
1102*35238bceSAndroid Build Coastguard Worker         static const struct
1103*35238bceSAndroid Build Coastguard Worker         {
1104*35238bceSAndroid Build Coastguard Worker             const char *name;
1105*35238bceSAndroid Build Coastguard Worker             uint32_t format;
1106*35238bceSAndroid Build Coastguard Worker             int size;
1107*35238bceSAndroid Build Coastguard Worker             int depth;
1108*35238bceSAndroid Build Coastguard Worker             int subX;
1109*35238bceSAndroid Build Coastguard Worker             int subY;
1110*35238bceSAndroid Build Coastguard Worker             int subZ;
1111*35238bceSAndroid Build Coastguard Worker             int subW;
1112*35238bceSAndroid Build Coastguard Worker             int subH;
1113*35238bceSAndroid Build Coastguard Worker             int subD;
1114*35238bceSAndroid Build Coastguard Worker             int imageHeight;
1115*35238bceSAndroid Build Coastguard Worker             int rowLength;
1116*35238bceSAndroid Build Coastguard Worker             int skipImages;
1117*35238bceSAndroid Build Coastguard Worker             int skipRows;
1118*35238bceSAndroid Build Coastguard Worker             int skipPixels;
1119*35238bceSAndroid Build Coastguard Worker             int alignment;
1120*35238bceSAndroid Build Coastguard Worker             int offset;
1121*35238bceSAndroid Build Coastguard Worker         } paramCases[] = {{"rgb8_offset", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 0, 0, 0, 0, 0, 4, 67},
1122*35238bceSAndroid Build Coastguard Worker                           {"rgb8_image_height", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 26, 0, 0, 0, 0, 4, 0},
1123*35238bceSAndroid Build Coastguard Worker                           {"rgb8_row_length", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 0, 27, 0, 0, 0, 4, 0},
1124*35238bceSAndroid Build Coastguard Worker                           {"rgb8_skip_images", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 0, 0, 3, 0, 0, 4, 0},
1125*35238bceSAndroid Build Coastguard Worker                           {"rgb8_skip_rows", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 22, 0, 0, 3, 0, 4, 0},
1126*35238bceSAndroid Build Coastguard Worker                           {"rgb8_skip_pixels", GL_RGB8, 26, 12, 1, 2, 1, 23, 19, 8, 0, 25, 0, 0, 2, 4, 0}};
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorFormats); ndx++)
1129*35238bceSAndroid Build Coastguard Worker         {
1130*35238bceSAndroid Build Coastguard Worker             pboGroup->addChild(new TexSubImageCubeArrayBufferCase(
1131*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string(colorFormats[ndx].name) + "_cube_array").c_str(), "",
1132*35238bceSAndroid Build Coastguard Worker                 colorFormats[ndx].internalFormat,
1133*35238bceSAndroid Build Coastguard Worker                 26, // Size
1134*35238bceSAndroid Build Coastguard Worker                 12, // Depth
1135*35238bceSAndroid Build Coastguard Worker                 1,  // Sub X
1136*35238bceSAndroid Build Coastguard Worker                 2,  // Sub Y
1137*35238bceSAndroid Build Coastguard Worker                 0,  // Sub Z
1138*35238bceSAndroid Build Coastguard Worker                 23, // Sub W
1139*35238bceSAndroid Build Coastguard Worker                 19, // Sub H
1140*35238bceSAndroid Build Coastguard Worker                 8,  // Sub D
1141*35238bceSAndroid Build Coastguard Worker                 0,  // Image height
1142*35238bceSAndroid Build Coastguard Worker                 0,  // Row length
1143*35238bceSAndroid Build Coastguard Worker                 0,  // Skip images
1144*35238bceSAndroid Build Coastguard Worker                 0,  // Skip rows
1145*35238bceSAndroid Build Coastguard Worker                 0,  // Skip pixels
1146*35238bceSAndroid Build Coastguard Worker                 4,  // Alignment
1147*35238bceSAndroid Build Coastguard Worker                 0 /* offset */));
1148*35238bceSAndroid Build Coastguard Worker         }
1149*35238bceSAndroid Build Coastguard Worker 
1150*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(paramCases); ndx++)
1151*35238bceSAndroid Build Coastguard Worker         {
1152*35238bceSAndroid Build Coastguard Worker             pboGroup->addChild(new TexSubImageCubeArrayBufferCase(
1153*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string(paramCases[ndx].name) + "_cube_array").c_str(), "", paramCases[ndx].format,
1154*35238bceSAndroid Build Coastguard Worker                 paramCases[ndx].size, paramCases[ndx].depth, paramCases[ndx].subX, paramCases[ndx].subY,
1155*35238bceSAndroid Build Coastguard Worker                 paramCases[ndx].subZ, paramCases[ndx].subW, paramCases[ndx].subH, paramCases[ndx].subD,
1156*35238bceSAndroid Build Coastguard Worker                 paramCases[ndx].imageHeight, paramCases[ndx].rowLength, paramCases[ndx].skipImages,
1157*35238bceSAndroid Build Coastguard Worker                 paramCases[ndx].skipRows, paramCases[ndx].skipPixels, paramCases[ndx].alignment,
1158*35238bceSAndroid Build Coastguard Worker                 paramCases[ndx].offset));
1159*35238bceSAndroid Build Coastguard Worker         }
1160*35238bceSAndroid Build Coastguard Worker     }
1161*35238bceSAndroid Build Coastguard Worker 
1162*35238bceSAndroid Build Coastguard Worker     // glTexSubImage3D() depth cases.
1163*35238bceSAndroid Build Coastguard Worker     {
1164*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *shadow3dGroup = new tcu::TestCaseGroup(
1165*35238bceSAndroid Build Coastguard Worker             m_testCtx, "texsubimage3d_depth", "glTexSubImage3D() with depth or depth/stencil format");
1166*35238bceSAndroid Build Coastguard Worker         addChild(shadow3dGroup);
1167*35238bceSAndroid Build Coastguard Worker 
1168*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthStencilFormats); ndx++)
1169*35238bceSAndroid Build Coastguard Worker         {
1170*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize   = 57;
1171*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayLayers = 6;
1172*35238bceSAndroid Build Coastguard Worker 
1173*35238bceSAndroid Build Coastguard Worker             shadow3dGroup->addChild(new TexSubImageCubeArrayDepthCase(
1174*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string(depthStencilFormats[ndx].name) + "_cube_array").c_str(), "",
1175*35238bceSAndroid Build Coastguard Worker                 depthStencilFormats[ndx].internalFormat, texCubeArraySize, texCubeArrayLayers));
1176*35238bceSAndroid Build Coastguard Worker         }
1177*35238bceSAndroid Build Coastguard Worker     }
1178*35238bceSAndroid Build Coastguard Worker 
1179*35238bceSAndroid Build Coastguard Worker     // glTexStorage3D() cases.
1180*35238bceSAndroid Build Coastguard Worker     {
1181*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *texStorageGroup =
1182*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "texstorage3d", "Basic glTexStorage3D() usage");
1183*35238bceSAndroid Build Coastguard Worker         addChild(texStorageGroup);
1184*35238bceSAndroid Build Coastguard Worker 
1185*35238bceSAndroid Build Coastguard Worker         // All formats.
1186*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *formatGroup =
1187*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "format", "glTexStorage3D() with all formats");
1188*35238bceSAndroid Build Coastguard Worker         texStorageGroup->addChild(formatGroup);
1189*35238bceSAndroid Build Coastguard Worker 
1190*35238bceSAndroid Build Coastguard Worker         // Color formats.
1191*35238bceSAndroid Build Coastguard Worker         for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(colorFormats); formatNdx++)
1192*35238bceSAndroid Build Coastguard Worker         {
1193*35238bceSAndroid Build Coastguard Worker             const char *fmtName          = colorFormats[formatNdx].name;
1194*35238bceSAndroid Build Coastguard Worker             uint32_t internalFormat      = colorFormats[formatNdx].internalFormat;
1195*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize   = 57;
1196*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayLayers = 6;
1197*35238bceSAndroid Build Coastguard Worker             int texCubeArrayLevels       = maxLevelCount(texCubeArraySize);
1198*35238bceSAndroid Build Coastguard Worker 
1199*35238bceSAndroid Build Coastguard Worker             formatGroup->addChild(new BasicTexStorageCubeArrayCase(m_context, (string(fmtName) + "_cube_array").c_str(),
1200*35238bceSAndroid Build Coastguard Worker                                                                    "", internalFormat, texCubeArraySize,
1201*35238bceSAndroid Build Coastguard Worker                                                                    texCubeArrayLayers, texCubeArrayLevels));
1202*35238bceSAndroid Build Coastguard Worker         }
1203*35238bceSAndroid Build Coastguard Worker 
1204*35238bceSAndroid Build Coastguard Worker         // Depth/stencil formats (only 2D texture array is supported).
1205*35238bceSAndroid Build Coastguard Worker         for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(depthStencilFormats); formatNdx++)
1206*35238bceSAndroid Build Coastguard Worker         {
1207*35238bceSAndroid Build Coastguard Worker             const char *fmtName          = depthStencilFormats[formatNdx].name;
1208*35238bceSAndroid Build Coastguard Worker             uint32_t internalFormat      = depthStencilFormats[formatNdx].internalFormat;
1209*35238bceSAndroid Build Coastguard Worker             const int texCubeArraySize   = 57;
1210*35238bceSAndroid Build Coastguard Worker             const int texCubeArrayLayers = 6;
1211*35238bceSAndroid Build Coastguard Worker             int texCubeArrayLevels       = maxLevelCount(texCubeArraySize);
1212*35238bceSAndroid Build Coastguard Worker 
1213*35238bceSAndroid Build Coastguard Worker             formatGroup->addChild(new BasicTexStorageCubeArrayCase(m_context, (string(fmtName) + "_cube_array").c_str(),
1214*35238bceSAndroid Build Coastguard Worker                                                                    "", internalFormat, texCubeArraySize,
1215*35238bceSAndroid Build Coastguard Worker                                                                    texCubeArrayLayers, texCubeArrayLevels));
1216*35238bceSAndroid Build Coastguard Worker         }
1217*35238bceSAndroid Build Coastguard Worker 
1218*35238bceSAndroid Build Coastguard Worker         // Sizes.
1219*35238bceSAndroid Build Coastguard Worker         static const struct
1220*35238bceSAndroid Build Coastguard Worker         {
1221*35238bceSAndroid Build Coastguard Worker             int size;
1222*35238bceSAndroid Build Coastguard Worker             int layers;
1223*35238bceSAndroid Build Coastguard Worker             int levels;
1224*35238bceSAndroid Build Coastguard Worker         } texCubeArraySizes[] = {//    Sz    La    Le
1225*35238bceSAndroid Build Coastguard Worker                                  {1, 6, 1}, {2, 6, 2}, {32, 6, 3}, {64, 6, 4}, {57, 12, 1}, {57, 12, 2}, {57, 12, 6}};
1226*35238bceSAndroid Build Coastguard Worker 
1227*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *sizeGroup =
1228*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "size", "glTexStorage3D() with various sizes");
1229*35238bceSAndroid Build Coastguard Worker         texStorageGroup->addChild(sizeGroup);
1230*35238bceSAndroid Build Coastguard Worker 
1231*35238bceSAndroid Build Coastguard Worker         for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(texCubeArraySizes); ndx++)
1232*35238bceSAndroid Build Coastguard Worker         {
1233*35238bceSAndroid Build Coastguard Worker             const uint32_t format = GL_RGBA8;
1234*35238bceSAndroid Build Coastguard Worker             int size              = texCubeArraySizes[ndx].size;
1235*35238bceSAndroid Build Coastguard Worker             int layers            = texCubeArraySizes[ndx].layers;
1236*35238bceSAndroid Build Coastguard Worker             int levels            = texCubeArraySizes[ndx].levels;
1237*35238bceSAndroid Build Coastguard Worker             string name           = string("cube_array_") + de::toString(size) + "x" + de::toString(size) + "x" +
1238*35238bceSAndroid Build Coastguard Worker                           de::toString(layers) + "_" + de::toString(levels) + "_levels";
1239*35238bceSAndroid Build Coastguard Worker 
1240*35238bceSAndroid Build Coastguard Worker             sizeGroup->addChild(
1241*35238bceSAndroid Build Coastguard Worker                 new BasicTexStorageCubeArrayCase(m_context, name.c_str(), "", format, size, layers, levels));
1242*35238bceSAndroid Build Coastguard Worker         }
1243*35238bceSAndroid Build Coastguard Worker     }
1244*35238bceSAndroid Build Coastguard Worker }
1245*35238bceSAndroid Build Coastguard Worker 
1246*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1247*35238bceSAndroid Build Coastguard Worker } // namespace gles31
1248*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1249