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