xref: /aosp_15_r20/external/deqp/modules/gles2/performance/es2pTextureUploadTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 2.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 upload performance tests.
22*35238bceSAndroid Build Coastguard Worker  *
23*35238bceSAndroid Build Coastguard Worker  * \todo [2012-10-01 pyry]
24*35238bceSAndroid Build Coastguard Worker  *  - Test different pixel unpack alignments
25*35238bceSAndroid Build Coastguard Worker  *  - Use multiple textures
26*35238bceSAndroid Build Coastguard Worker  *  - Trash cache prior to uploading from data ptr
27*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "es2pTextureUploadTests.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "deClock.h"
40*35238bceSAndroid Build Coastguard Worker #include "deString.h"
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker #include "glsCalibration.hpp"
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
45*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker #include <algorithm>
48*35238bceSAndroid Build Coastguard Worker #include <vector>
49*35238bceSAndroid Build Coastguard Worker 
50*35238bceSAndroid Build Coastguard Worker namespace deqp
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker namespace gles2
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker namespace Performance
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker using std::string;
58*35238bceSAndroid Build Coastguard Worker using std::vector;
59*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
60*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
61*35238bceSAndroid Build Coastguard Worker using tcu::TextureFormat;
62*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
63*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
64*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
65*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker static const int VIEWPORT_SIZE  = 64;
68*35238bceSAndroid Build Coastguard Worker static const float quadCoords[] = {-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f};
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker class TextureUploadCase : public TestCase
71*35238bceSAndroid Build Coastguard Worker {
72*35238bceSAndroid Build Coastguard Worker public:
73*35238bceSAndroid Build Coastguard Worker     TextureUploadCase(Context &context, const char *name, const char *description, UploadFunction uploadFunction,
74*35238bceSAndroid Build Coastguard Worker                       uint32_t format, uint32_t type, int texSize);
75*35238bceSAndroid Build Coastguard Worker     ~TextureUploadCase(void);
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
78*35238bceSAndroid Build Coastguard Worker     void deinit(void);
79*35238bceSAndroid Build Coastguard Worker 
80*35238bceSAndroid Build Coastguard Worker     virtual IterateResult iterate(void) = 0;
81*35238bceSAndroid Build Coastguard Worker     void logResults(void);
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker protected:
84*35238bceSAndroid Build Coastguard Worker     UploadFunction m_uploadFunction;
85*35238bceSAndroid Build Coastguard Worker     uint32_t m_format;
86*35238bceSAndroid Build Coastguard Worker     uint32_t m_type;
87*35238bceSAndroid Build Coastguard Worker     int m_texSize;
88*35238bceSAndroid Build Coastguard Worker     int m_alignment;
89*35238bceSAndroid Build Coastguard Worker 
90*35238bceSAndroid Build Coastguard Worker     gls::TheilSenCalibrator m_calibrator;
91*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
92*35238bceSAndroid Build Coastguard Worker     uint32_t m_texture;
93*35238bceSAndroid Build Coastguard Worker     de::Random m_rnd;
94*35238bceSAndroid Build Coastguard Worker     TestLog &m_log;
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     vector<uint8_t> m_texData;
97*35238bceSAndroid Build Coastguard Worker };
98*35238bceSAndroid Build Coastguard Worker 
TextureUploadCase(Context & context,const char * name,const char * description,UploadFunction uploadFunction,uint32_t format,uint32_t type,int texSize)99*35238bceSAndroid Build Coastguard Worker TextureUploadCase::TextureUploadCase(Context &context, const char *name, const char *description,
100*35238bceSAndroid Build Coastguard Worker                                      UploadFunction uploadFunction, uint32_t format, uint32_t type, int texSize)
101*35238bceSAndroid Build Coastguard Worker     : TestCase(context, tcu::NODETYPE_PERFORMANCE, name, description)
102*35238bceSAndroid Build Coastguard Worker     , m_uploadFunction(uploadFunction)
103*35238bceSAndroid Build Coastguard Worker     , m_format(format)
104*35238bceSAndroid Build Coastguard Worker     , m_type(type)
105*35238bceSAndroid Build Coastguard Worker     , m_texSize(texSize)
106*35238bceSAndroid Build Coastguard Worker     , m_alignment(4)
107*35238bceSAndroid Build Coastguard Worker     , m_calibrator()
108*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
109*35238bceSAndroid Build Coastguard Worker     , m_texture(0)
110*35238bceSAndroid Build Coastguard Worker     , m_rnd(deStringHash(name))
111*35238bceSAndroid Build Coastguard Worker     , m_log(context.getTestContext().getLog())
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker }
114*35238bceSAndroid Build Coastguard Worker 
~TextureUploadCase(void)115*35238bceSAndroid Build Coastguard Worker TextureUploadCase::~TextureUploadCase(void)
116*35238bceSAndroid Build Coastguard Worker {
117*35238bceSAndroid Build Coastguard Worker     TextureUploadCase::deinit();
118*35238bceSAndroid Build Coastguard Worker }
119*35238bceSAndroid Build Coastguard Worker 
deinit(void)120*35238bceSAndroid Build Coastguard Worker void TextureUploadCase::deinit(void)
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker     if (m_program)
125*35238bceSAndroid Build Coastguard Worker     {
126*35238bceSAndroid Build Coastguard Worker         delete m_program;
127*35238bceSAndroid Build Coastguard Worker         m_program = DE_NULL;
128*35238bceSAndroid Build Coastguard Worker     }
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     gl.deleteTextures(1, &m_texture);
131*35238bceSAndroid Build Coastguard Worker     m_texture = 0;
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     m_texData.clear();
134*35238bceSAndroid Build Coastguard Worker }
135*35238bceSAndroid Build Coastguard Worker 
init(void)136*35238bceSAndroid Build Coastguard Worker void TextureUploadCase::init(void)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
139*35238bceSAndroid Build Coastguard Worker     int maxTextureSize;
140*35238bceSAndroid Build Coastguard Worker     gl.getIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     if (m_texSize > maxTextureSize)
143*35238bceSAndroid Build Coastguard Worker     {
144*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Unsupported texture size");
145*35238bceSAndroid Build Coastguard Worker         return;
146*35238bceSAndroid Build Coastguard Worker     }
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker     // Create program
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker     string vertexShaderSource   = "";
151*35238bceSAndroid Build Coastguard Worker     string fragmentShaderSource = "";
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     vertexShaderSource.append("precision mediump    float;\n"
154*35238bceSAndroid Build Coastguard Worker                               "attribute vec2        a_pos;\n"
155*35238bceSAndroid Build Coastguard Worker                               "varying   vec2        v_texCoord;\n"
156*35238bceSAndroid Build Coastguard Worker                               "\n"
157*35238bceSAndroid Build Coastguard Worker                               "void main (void)\n"
158*35238bceSAndroid Build Coastguard Worker                               "{\n"
159*35238bceSAndroid Build Coastguard Worker                               "    v_texCoord = a_pos;\n"
160*35238bceSAndroid Build Coastguard Worker                               "    gl_Position = vec4(a_pos, 0.5, 1.0);\n"
161*35238bceSAndroid Build Coastguard Worker                               "}\n");
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     fragmentShaderSource.append("precision    mediump    float;\n"
164*35238bceSAndroid Build Coastguard Worker                                 "uniform    lowp sampler2D    u_sampler;\n"
165*35238bceSAndroid Build Coastguard Worker                                 "varying    vec2            v_texCoord;\n"
166*35238bceSAndroid Build Coastguard Worker                                 "\n"
167*35238bceSAndroid Build Coastguard Worker                                 "void main (void)\n"
168*35238bceSAndroid Build Coastguard Worker                                 "{\n"
169*35238bceSAndroid Build Coastguard Worker                                 "    gl_FragColor = texture2D(u_sampler, v_texCoord.xy);\n"
170*35238bceSAndroid Build Coastguard Worker                                 "}\n");
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(!m_program);
173*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_context.getRenderContext(),
174*35238bceSAndroid Build Coastguard Worker                                        glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
175*35238bceSAndroid Build Coastguard Worker 
176*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
177*35238bceSAndroid Build Coastguard Worker     {
178*35238bceSAndroid Build Coastguard Worker         m_log << *m_program;
179*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to create shader program (m_programRender)");
180*35238bceSAndroid Build Coastguard Worker     }
181*35238bceSAndroid Build Coastguard Worker 
182*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_program->getProgram());
183*35238bceSAndroid Build Coastguard Worker 
184*35238bceSAndroid Build Coastguard Worker     // Init GL state
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, VIEWPORT_SIZE, VIEWPORT_SIZE);
187*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_DEPTH_TEST);
188*35238bceSAndroid Build Coastguard Worker     gl.disable(GL_CULL_FACE);
189*35238bceSAndroid Build Coastguard Worker     gl.enable(GL_BLEND);
190*35238bceSAndroid Build Coastguard Worker     gl.blendFunc(GL_ONE, GL_ONE);
191*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
192*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT);
193*35238bceSAndroid Build Coastguard Worker 
194*35238bceSAndroid Build Coastguard Worker     uint32_t uSampler = gl.getUniformLocation(m_program->getProgram(), "u_sampler");
195*35238bceSAndroid Build Coastguard Worker     uint32_t aPos     = gl.getAttribLocation(m_program->getProgram(), "a_pos");
196*35238bceSAndroid Build Coastguard Worker     gl.enableVertexAttribArray(aPos);
197*35238bceSAndroid Build Coastguard Worker     gl.vertexAttribPointer(aPos, 2, GL_FLOAT, GL_FALSE, 0, &quadCoords[0]);
198*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(uSampler, 0);
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker     // Create texture
201*35238bceSAndroid Build Coastguard Worker 
202*35238bceSAndroid Build Coastguard Worker     gl.activeTexture(GL_TEXTURE0);
203*35238bceSAndroid Build Coastguard Worker     gl.genTextures(1, &m_texture);
204*35238bceSAndroid Build Coastguard Worker     gl.bindTexture(GL_TEXTURE_2D, m_texture);
205*35238bceSAndroid Build Coastguard Worker     gl.pixelStorei(GL_UNPACK_ALIGNMENT, m_alignment);
206*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
207*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
208*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
209*35238bceSAndroid Build Coastguard Worker     gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     // Prepare texture data
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker     {
214*35238bceSAndroid Build Coastguard Worker         const tcu::TextureFormat &texFmt = glu::mapGLTransferFormat(m_format, m_type);
215*35238bceSAndroid Build Coastguard Worker         int pixelSize                    = texFmt.getPixelSize();
216*35238bceSAndroid Build Coastguard Worker         int stride                       = deAlign32(pixelSize * m_texSize, m_alignment);
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker         m_texData.resize(stride * m_texSize);
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker         tcu::PixelBufferAccess access(texFmt, m_texSize, m_texSize, 1, stride, 0, &m_texData[0]);
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker         tcu::fillWithComponentGradients(access, tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
223*35238bceSAndroid Build Coastguard Worker     }
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker     // Do a dry-run to ensure the pipes are hot
226*35238bceSAndroid Build Coastguard Worker 
227*35238bceSAndroid Build Coastguard Worker     gl.texImage2D(GL_TEXTURE_2D, 0, m_format, m_texSize, m_texSize, 0, m_format, m_type, &m_texData[0]);
228*35238bceSAndroid Build Coastguard Worker     gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
229*35238bceSAndroid Build Coastguard Worker     gl.finish();
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker 
logResults(void)232*35238bceSAndroid Build Coastguard Worker void TextureUploadCase::logResults(void)
233*35238bceSAndroid Build Coastguard Worker {
234*35238bceSAndroid Build Coastguard Worker     const gls::MeasureState &measureState = m_calibrator.getMeasureState();
235*35238bceSAndroid Build Coastguard Worker 
236*35238bceSAndroid Build Coastguard Worker     // Log measurement details
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::Section("Measurement details", "Measurement details");
239*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::Message << "Uploading texture with "
240*35238bceSAndroid Build Coastguard Worker           << (m_uploadFunction == UPLOAD_TEXIMAGE2D ? "glTexImage2D" : "glTexSubImage2D") << "."
241*35238bceSAndroid Build Coastguard Worker           << TestLog::EndMessage; // \todo [arttu] Change enum to struct with name included
242*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::Message << "Texture size = " << m_texSize << "x" << m_texSize << "." << TestLog::EndMessage;
243*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::Message << "Viewport size = " << VIEWPORT_SIZE << "x" << VIEWPORT_SIZE << "."
244*35238bceSAndroid Build Coastguard Worker           << TestLog::EndMessage;
245*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::Message << measureState.numDrawCalls << " upload calls / iteration" << TestLog::EndMessage;
246*35238bceSAndroid Build Coastguard Worker     m_log << TestLog::EndSection;
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker     // Log results
249*35238bceSAndroid Build Coastguard Worker 
250*35238bceSAndroid Build Coastguard Worker     TestLog &log = m_testCtx.getLog();
251*35238bceSAndroid Build Coastguard Worker     log << TestLog::Section("Results", "Results");
252*35238bceSAndroid Build Coastguard Worker 
253*35238bceSAndroid Build Coastguard Worker     // Log individual frame durations
254*35238bceSAndroid Build Coastguard Worker     //for (int i = 0; i < m_calibrator.measureState.numFrames; i++)
255*35238bceSAndroid Build Coastguard Worker     // m_log << TestLog::Message << "Frame " << i+1 << " duration: \t" << m_calibrator.measureState.frameTimes[i] << " us."<< TestLog::EndMessage;
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker     std::vector<uint64_t> sortedFrameTimes(measureState.frameTimes.begin(), measureState.frameTimes.end());
258*35238bceSAndroid Build Coastguard Worker     std::sort(sortedFrameTimes.begin(), sortedFrameTimes.end());
259*35238bceSAndroid Build Coastguard Worker     vector<uint64_t>::const_iterator first  = sortedFrameTimes.begin();
260*35238bceSAndroid Build Coastguard Worker     vector<uint64_t>::const_iterator last   = sortedFrameTimes.end();
261*35238bceSAndroid Build Coastguard Worker     vector<uint64_t>::const_iterator middle = first + (last - first) / 2;
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker     uint64_t medianFrameTime = *middle;
264*35238bceSAndroid Build Coastguard Worker     double medianMTexelsPerSeconds =
265*35238bceSAndroid Build Coastguard Worker         (double)(m_texSize * m_texSize * measureState.numDrawCalls) / (double)medianFrameTime;
266*35238bceSAndroid Build Coastguard Worker     double medianTexelDrawDurationNs =
267*35238bceSAndroid Build Coastguard Worker         (double)medianFrameTime * 1000.0 / (double)(m_texSize * m_texSize * measureState.numDrawCalls);
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     uint64_t totalTime       = measureState.getTotalTime();
270*35238bceSAndroid Build Coastguard Worker     int numFrames            = (int)measureState.frameTimes.size();
271*35238bceSAndroid Build Coastguard Worker     int64_t numTexturesDrawn = measureState.numDrawCalls * numFrames;
272*35238bceSAndroid Build Coastguard Worker     int64_t numPixels        = (int64_t)m_texSize * (int64_t)m_texSize * numTexturesDrawn;
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker     double framesPerSecond        = (double)numFrames / ((double)totalTime / 1000000.0);
275*35238bceSAndroid Build Coastguard Worker     double avgFrameTime           = (double)totalTime / (double)numFrames;
276*35238bceSAndroid Build Coastguard Worker     double avgMTexelsPerSeconds   = (double)numPixels / (double)totalTime;
277*35238bceSAndroid Build Coastguard Worker     double avgTexelDrawDurationNs = (double)totalTime * 1000.0 / (double)numPixels;
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("FramesPerSecond", "Frames per second in measurement\t\t", "Frames/s", QP_KEY_TAG_PERFORMANCE,
280*35238bceSAndroid Build Coastguard Worker                           (float)framesPerSecond);
281*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("AverageFrameTime", "Average frame duration in measurement\t", "us", QP_KEY_TAG_PERFORMANCE,
282*35238bceSAndroid Build Coastguard Worker                           (float)avgFrameTime);
283*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("AverageTexelPerf", "Average texel upload performance\t\t", "MTex/s", QP_KEY_TAG_PERFORMANCE,
284*35238bceSAndroid Build Coastguard Worker                           (float)avgMTexelsPerSeconds);
285*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("AverageTexelTime", "Average texel upload duration\t\t", "ns", QP_KEY_TAG_PERFORMANCE,
286*35238bceSAndroid Build Coastguard Worker                           (float)avgTexelDrawDurationNs);
287*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("MedianTexelPerf", "Median texel upload performance\t\t", "MTex/s", QP_KEY_TAG_PERFORMANCE,
288*35238bceSAndroid Build Coastguard Worker                           (float)medianMTexelsPerSeconds);
289*35238bceSAndroid Build Coastguard Worker     log << TestLog::Float("MedianTexelTime", "Median texel upload duration\t\t", "ns", QP_KEY_TAG_PERFORMANCE,
290*35238bceSAndroid Build Coastguard Worker                           (float)medianTexelDrawDurationNs);
291*35238bceSAndroid Build Coastguard Worker 
292*35238bceSAndroid Build Coastguard Worker     log << TestLog::EndSection;
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker     gls::logCalibrationInfo(log, m_calibrator); // Log calibration details
295*35238bceSAndroid Build Coastguard Worker     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, de::floatToString((float)avgMTexelsPerSeconds, 2).c_str());
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker // Texture upload call case
299*35238bceSAndroid Build Coastguard Worker 
300*35238bceSAndroid Build Coastguard Worker class TextureUploadCallCase : public TextureUploadCase
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker public:
303*35238bceSAndroid Build Coastguard Worker     TextureUploadCallCase(Context &context, const char *name, const char *description, UploadFunction uploadFunction,
304*35238bceSAndroid Build Coastguard Worker                           uint32_t format, uint32_t type, int texSize);
305*35238bceSAndroid Build Coastguard Worker     ~TextureUploadCallCase(void);
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
308*35238bceSAndroid Build Coastguard Worker     void render(void);
309*35238bceSAndroid Build Coastguard Worker };
310*35238bceSAndroid Build Coastguard Worker 
TextureUploadCallCase(Context & context,const char * name,const char * description,UploadFunction uploadFunction,uint32_t format,uint32_t type,int texSize)311*35238bceSAndroid Build Coastguard Worker TextureUploadCallCase::TextureUploadCallCase(Context &context, const char *name, const char *description,
312*35238bceSAndroid Build Coastguard Worker                                              UploadFunction uploadFunction, uint32_t format, uint32_t type, int texSize)
313*35238bceSAndroid Build Coastguard Worker     : TextureUploadCase(context, name, description, uploadFunction, format, type, texSize)
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker }
316*35238bceSAndroid Build Coastguard Worker 
~TextureUploadCallCase(void)317*35238bceSAndroid Build Coastguard Worker TextureUploadCallCase::~TextureUploadCallCase(void)
318*35238bceSAndroid Build Coastguard Worker {
319*35238bceSAndroid Build Coastguard Worker     TextureUploadCase::deinit();
320*35238bceSAndroid Build Coastguard Worker }
321*35238bceSAndroid Build Coastguard Worker 
render(void)322*35238bceSAndroid Build Coastguard Worker void TextureUploadCallCase::render(void)
323*35238bceSAndroid Build Coastguard Worker {
324*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker     // Draw multiple quads to ensure enough workload
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     switch (m_uploadFunction)
329*35238bceSAndroid Build Coastguard Worker     {
330*35238bceSAndroid Build Coastguard Worker     case UPLOAD_TEXIMAGE2D:
331*35238bceSAndroid Build Coastguard Worker         gl.texImage2D(GL_TEXTURE_2D, 0, m_format, m_texSize, m_texSize, 0, m_format, m_type, &m_texData[0]);
332*35238bceSAndroid Build Coastguard Worker         break;
333*35238bceSAndroid Build Coastguard Worker     case UPLOAD_TEXSUBIMAGE2D:
334*35238bceSAndroid Build Coastguard Worker         gl.texSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_texSize, m_texSize, m_format, m_type, &m_texData[0]);
335*35238bceSAndroid Build Coastguard Worker         break;
336*35238bceSAndroid Build Coastguard Worker     default:
337*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
338*35238bceSAndroid Build Coastguard Worker     }
339*35238bceSAndroid Build Coastguard Worker }
340*35238bceSAndroid Build Coastguard Worker 
iterate(void)341*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult TextureUploadCallCase::iterate(void)
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker     if (m_testCtx.getTestResult() == QP_TEST_RESULT_NOT_SUPPORTED)
346*35238bceSAndroid Build Coastguard Worker         return STOP;
347*35238bceSAndroid Build Coastguard Worker 
348*35238bceSAndroid Build Coastguard Worker     for (;;)
349*35238bceSAndroid Build Coastguard Worker     {
350*35238bceSAndroid Build Coastguard Worker         gls::TheilSenCalibrator::State state = m_calibrator.getState();
351*35238bceSAndroid Build Coastguard Worker 
352*35238bceSAndroid Build Coastguard Worker         if (state == gls::TheilSenCalibrator::STATE_MEASURE)
353*35238bceSAndroid Build Coastguard Worker         {
354*35238bceSAndroid Build Coastguard Worker             int numCalls       = m_calibrator.getCallCount();
355*35238bceSAndroid Build Coastguard Worker             uint64_t startTime = deGetMicroseconds();
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < numCalls; i++)
358*35238bceSAndroid Build Coastguard Worker                 render();
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker             gl.finish();
361*35238bceSAndroid Build Coastguard Worker 
362*35238bceSAndroid Build Coastguard Worker             uint64_t endTime  = deGetMicroseconds();
363*35238bceSAndroid Build Coastguard Worker             uint64_t duration = endTime - startTime;
364*35238bceSAndroid Build Coastguard Worker 
365*35238bceSAndroid Build Coastguard Worker             m_calibrator.recordIteration(duration);
366*35238bceSAndroid Build Coastguard Worker         }
367*35238bceSAndroid Build Coastguard Worker         else if (state == gls::TheilSenCalibrator::STATE_RECOMPUTE_PARAMS)
368*35238bceSAndroid Build Coastguard Worker         {
369*35238bceSAndroid Build Coastguard Worker             m_calibrator.recomputeParameters();
370*35238bceSAndroid Build Coastguard Worker         }
371*35238bceSAndroid Build Coastguard Worker         else
372*35238bceSAndroid Build Coastguard Worker         {
373*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(state == gls::TheilSenCalibrator::STATE_FINISHED);
374*35238bceSAndroid Build Coastguard Worker             break;
375*35238bceSAndroid Build Coastguard Worker         }
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker         // Touch watchdog between iterations to avoid timeout.
378*35238bceSAndroid Build Coastguard Worker         {
379*35238bceSAndroid Build Coastguard Worker             qpWatchDog *dog = m_testCtx.getWatchDog();
380*35238bceSAndroid Build Coastguard Worker             if (dog)
381*35238bceSAndroid Build Coastguard Worker                 qpWatchDog_touch(dog);
382*35238bceSAndroid Build Coastguard Worker         }
383*35238bceSAndroid Build Coastguard Worker     }
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "iterate");
386*35238bceSAndroid Build Coastguard Worker     logResults();
387*35238bceSAndroid Build Coastguard Worker     return STOP;
388*35238bceSAndroid Build Coastguard Worker }
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker // Texture upload and draw case
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker class TextureUploadAndDrawCase : public TextureUploadCase
393*35238bceSAndroid Build Coastguard Worker {
394*35238bceSAndroid Build Coastguard Worker public:
395*35238bceSAndroid Build Coastguard Worker     TextureUploadAndDrawCase(Context &context, const char *name, const char *description, UploadFunction uploadFunction,
396*35238bceSAndroid Build Coastguard Worker                              uint32_t format, uint32_t type, int texSize);
397*35238bceSAndroid Build Coastguard Worker     ~TextureUploadAndDrawCase(void);
398*35238bceSAndroid Build Coastguard Worker 
399*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
400*35238bceSAndroid Build Coastguard Worker     void render(void);
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker private:
403*35238bceSAndroid Build Coastguard Worker     bool m_lastIterationRender;
404*35238bceSAndroid Build Coastguard Worker     uint64_t m_renderStart;
405*35238bceSAndroid Build Coastguard Worker };
406*35238bceSAndroid Build Coastguard Worker 
TextureUploadAndDrawCase(Context & context,const char * name,const char * description,UploadFunction uploadFunction,uint32_t format,uint32_t type,int texSize)407*35238bceSAndroid Build Coastguard Worker TextureUploadAndDrawCase::TextureUploadAndDrawCase(Context &context, const char *name, const char *description,
408*35238bceSAndroid Build Coastguard Worker                                                    UploadFunction uploadFunction, uint32_t format, uint32_t type,
409*35238bceSAndroid Build Coastguard Worker                                                    int texSize)
410*35238bceSAndroid Build Coastguard Worker     : TextureUploadCase(context, name, description, uploadFunction, format, type, texSize)
411*35238bceSAndroid Build Coastguard Worker     , m_lastIterationRender(false)
412*35238bceSAndroid Build Coastguard Worker     , m_renderStart(0)
413*35238bceSAndroid Build Coastguard Worker {
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker 
~TextureUploadAndDrawCase(void)416*35238bceSAndroid Build Coastguard Worker TextureUploadAndDrawCase::~TextureUploadAndDrawCase(void)
417*35238bceSAndroid Build Coastguard Worker {
418*35238bceSAndroid Build Coastguard Worker     TextureUploadCase::deinit();
419*35238bceSAndroid Build Coastguard Worker }
420*35238bceSAndroid Build Coastguard Worker 
render(void)421*35238bceSAndroid Build Coastguard Worker void TextureUploadAndDrawCase::render(void)
422*35238bceSAndroid Build Coastguard Worker {
423*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
424*35238bceSAndroid Build Coastguard Worker 
425*35238bceSAndroid Build Coastguard Worker     // Draw multiple quads to ensure enough workload
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker     switch (m_uploadFunction)
428*35238bceSAndroid Build Coastguard Worker     {
429*35238bceSAndroid Build Coastguard Worker     case UPLOAD_TEXIMAGE2D:
430*35238bceSAndroid Build Coastguard Worker         gl.texImage2D(GL_TEXTURE_2D, 0, m_format, m_texSize, m_texSize, 0, m_format, m_type, &m_texData[0]);
431*35238bceSAndroid Build Coastguard Worker         break;
432*35238bceSAndroid Build Coastguard Worker     case UPLOAD_TEXSUBIMAGE2D:
433*35238bceSAndroid Build Coastguard Worker         gl.texSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_texSize, m_texSize, m_format, m_type, &m_texData[0]);
434*35238bceSAndroid Build Coastguard Worker         break;
435*35238bceSAndroid Build Coastguard Worker     default:
436*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
437*35238bceSAndroid Build Coastguard Worker     }
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker     gl.drawArrays(GL_TRIANGLE_STRIP, 0, 4);
440*35238bceSAndroid Build Coastguard Worker }
441*35238bceSAndroid Build Coastguard Worker 
iterate(void)442*35238bceSAndroid Build Coastguard Worker tcu::TestNode::IterateResult TextureUploadAndDrawCase::iterate(void)
443*35238bceSAndroid Build Coastguard Worker {
444*35238bceSAndroid Build Coastguard Worker     if (m_testCtx.getTestResult() == QP_TEST_RESULT_NOT_SUPPORTED)
445*35238bceSAndroid Build Coastguard Worker         return STOP;
446*35238bceSAndroid Build Coastguard Worker 
447*35238bceSAndroid Build Coastguard Worker     if (m_lastIterationRender && (m_calibrator.getState() == gls::TheilSenCalibrator::STATE_MEASURE))
448*35238bceSAndroid Build Coastguard Worker     {
449*35238bceSAndroid Build Coastguard Worker         uint64_t curTime = deGetMicroseconds();
450*35238bceSAndroid Build Coastguard Worker         m_calibrator.recordIteration(curTime - m_renderStart);
451*35238bceSAndroid Build Coastguard Worker     }
452*35238bceSAndroid Build Coastguard Worker 
453*35238bceSAndroid Build Coastguard Worker     gls::TheilSenCalibrator::State state = m_calibrator.getState();
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker     if (state == gls::TheilSenCalibrator::STATE_MEASURE)
456*35238bceSAndroid Build Coastguard Worker     {
457*35238bceSAndroid Build Coastguard Worker         // Render
458*35238bceSAndroid Build Coastguard Worker         int numCalls = m_calibrator.getCallCount();
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker         m_renderStart         = deGetMicroseconds();
461*35238bceSAndroid Build Coastguard Worker         m_lastIterationRender = true;
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker         for (int i = 0; i < numCalls; i++)
464*35238bceSAndroid Build Coastguard Worker             render();
465*35238bceSAndroid Build Coastguard Worker 
466*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
467*35238bceSAndroid Build Coastguard Worker     }
468*35238bceSAndroid Build Coastguard Worker     else if (state == gls::TheilSenCalibrator::STATE_RECOMPUTE_PARAMS)
469*35238bceSAndroid Build Coastguard Worker     {
470*35238bceSAndroid Build Coastguard Worker         m_calibrator.recomputeParameters();
471*35238bceSAndroid Build Coastguard Worker         m_lastIterationRender = false;
472*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
473*35238bceSAndroid Build Coastguard Worker     }
474*35238bceSAndroid Build Coastguard Worker     else
475*35238bceSAndroid Build Coastguard Worker     {
476*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(state == gls::TheilSenCalibrator::STATE_FINISHED);
477*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(m_context.getRenderContext().getFunctions().getError(), "finish");
478*35238bceSAndroid Build Coastguard Worker         logResults();
479*35238bceSAndroid Build Coastguard Worker         return STOP;
480*35238bceSAndroid Build Coastguard Worker     }
481*35238bceSAndroid Build Coastguard Worker }
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker // Texture upload tests
484*35238bceSAndroid Build Coastguard Worker 
TextureUploadTests(Context & context)485*35238bceSAndroid Build Coastguard Worker TextureUploadTests::TextureUploadTests(Context &context) : TestCaseGroup(context, "upload", "Texture upload tests")
486*35238bceSAndroid Build Coastguard Worker {
487*35238bceSAndroid Build Coastguard Worker }
488*35238bceSAndroid Build Coastguard Worker 
~TextureUploadTests(void)489*35238bceSAndroid Build Coastguard Worker TextureUploadTests::~TextureUploadTests(void)
490*35238bceSAndroid Build Coastguard Worker {
491*35238bceSAndroid Build Coastguard Worker     TextureUploadTests::deinit();
492*35238bceSAndroid Build Coastguard Worker }
493*35238bceSAndroid Build Coastguard Worker 
deinit(void)494*35238bceSAndroid Build Coastguard Worker void TextureUploadTests::deinit(void)
495*35238bceSAndroid Build Coastguard Worker {
496*35238bceSAndroid Build Coastguard Worker }
497*35238bceSAndroid Build Coastguard Worker 
init(void)498*35238bceSAndroid Build Coastguard Worker void TextureUploadTests::init(void)
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *uploadCall = new TestCaseGroup(m_context, "upload", "Texture upload");
501*35238bceSAndroid Build Coastguard Worker     TestCaseGroup *uploadAndDraw =
502*35238bceSAndroid Build Coastguard Worker         new TestCaseGroup(m_context, "upload_draw_swap", "Texture upload, draw & buffer swap");
503*35238bceSAndroid Build Coastguard Worker 
504*35238bceSAndroid Build Coastguard Worker     addChild(uploadCall);
505*35238bceSAndroid Build Coastguard Worker     addChild(uploadAndDraw);
506*35238bceSAndroid Build Coastguard Worker 
507*35238bceSAndroid Build Coastguard Worker     static const struct
508*35238bceSAndroid Build Coastguard Worker     {
509*35238bceSAndroid Build Coastguard Worker         const char *name;
510*35238bceSAndroid Build Coastguard Worker         const char *nameLower;
511*35238bceSAndroid Build Coastguard Worker         UploadFunction func;
512*35238bceSAndroid Build Coastguard Worker     } uploadFunctions[] = {{"texImage2D", "teximage2d", UPLOAD_TEXIMAGE2D},
513*35238bceSAndroid Build Coastguard Worker                            {"texSubImage2D", "texsubimage2d", UPLOAD_TEXSUBIMAGE2D}};
514*35238bceSAndroid Build Coastguard Worker 
515*35238bceSAndroid Build Coastguard Worker     static const struct
516*35238bceSAndroid Build Coastguard Worker     {
517*35238bceSAndroid Build Coastguard Worker         const char *name;
518*35238bceSAndroid Build Coastguard Worker         uint32_t format;
519*35238bceSAndroid Build Coastguard Worker         uint32_t type;
520*35238bceSAndroid Build Coastguard Worker     } textureCombinations[] = {
521*35238bceSAndroid Build Coastguard Worker         {"rgb_ubyte", GL_RGB, GL_UNSIGNED_BYTE},
522*35238bceSAndroid Build Coastguard Worker         {"rgba_ubyte", GL_RGBA, GL_UNSIGNED_BYTE},
523*35238bceSAndroid Build Coastguard Worker         {"alpha_ubyte", GL_ALPHA, GL_UNSIGNED_BYTE},
524*35238bceSAndroid Build Coastguard Worker         {"luminance_ubyte", GL_LUMINANCE, GL_UNSIGNED_BYTE},
525*35238bceSAndroid Build Coastguard Worker         {"luminance-alpha_ubyte", GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE},
526*35238bceSAndroid Build Coastguard Worker         {"rgb_ushort565", GL_RGB, GL_UNSIGNED_SHORT_5_6_5},
527*35238bceSAndroid Build Coastguard Worker         {"rgba_ushort4444", GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4},
528*35238bceSAndroid Build Coastguard Worker         {"rgba_ushort5551", GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1},
529*35238bceSAndroid Build Coastguard Worker     };
530*35238bceSAndroid Build Coastguard Worker 
531*35238bceSAndroid Build Coastguard Worker     static const struct
532*35238bceSAndroid Build Coastguard Worker     {
533*35238bceSAndroid Build Coastguard Worker         int size;
534*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *uploadCallGroup;
535*35238bceSAndroid Build Coastguard Worker         TestCaseGroup *uploadAndDrawGroup;
536*35238bceSAndroid Build Coastguard Worker     } textureSizes[] = {
537*35238bceSAndroid Build Coastguard Worker         {16, new TestCaseGroup(m_context, "16x16", "Texture size 16x16"),
538*35238bceSAndroid Build Coastguard Worker          new TestCaseGroup(m_context, "16x16", "Texture size 16x16")},
539*35238bceSAndroid Build Coastguard Worker         {256, new TestCaseGroup(m_context, "256x256", "Texture size 256x256"),
540*35238bceSAndroid Build Coastguard Worker          new TestCaseGroup(m_context, "256x256", "Texture size 256x256")},
541*35238bceSAndroid Build Coastguard Worker         {257, new TestCaseGroup(m_context, "257x257", "Texture size 257x257"),
542*35238bceSAndroid Build Coastguard Worker          new TestCaseGroup(m_context, "257x257", "Texture size 257x257")},
543*35238bceSAndroid Build Coastguard Worker         {1024, new TestCaseGroup(m_context, "1024x1024", "Texture size 1024x1024"),
544*35238bceSAndroid Build Coastguard Worker          new TestCaseGroup(m_context, "1024x1024", "Texture size 1024x1024")},
545*35238bceSAndroid Build Coastguard Worker         {2048, new TestCaseGroup(m_context, "2048x2048", "Texture size 2048x2048"),
546*35238bceSAndroid Build Coastguard Worker          new TestCaseGroup(m_context, "2048x2048", "Texture size 2048x2048")},
547*35238bceSAndroid Build Coastguard Worker     };
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker #define FOR_EACH(ITERATOR, ARRAY, BODY)                                      \
550*35238bceSAndroid Build Coastguard Worker     for (int ITERATOR = 0; ITERATOR < DE_LENGTH_OF_ARRAY(ARRAY); ITERATOR++) \
551*35238bceSAndroid Build Coastguard Worker     BODY
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker     FOR_EACH(uploadFunc, uploadFunctions,
554*35238bceSAndroid Build Coastguard Worker              FOR_EACH(texSize, textureSizes, FOR_EACH(texCombination, textureCombinations, {
555*35238bceSAndroid Build Coastguard Worker                           string caseName = string("") + uploadFunctions[uploadFunc].nameLower + "_" +
556*35238bceSAndroid Build Coastguard Worker                                             textureCombinations[texCombination].name;
557*35238bceSAndroid Build Coastguard Worker                           UploadFunction function = uploadFunctions[uploadFunc].func;
558*35238bceSAndroid Build Coastguard Worker                           uint32_t format         = textureCombinations[texCombination].format;
559*35238bceSAndroid Build Coastguard Worker                           uint32_t type           = textureCombinations[texCombination].type;
560*35238bceSAndroid Build Coastguard Worker                           int size                = textureSizes[texSize].size;
561*35238bceSAndroid Build Coastguard Worker 
562*35238bceSAndroid Build Coastguard Worker                           textureSizes[texSize].uploadCallGroup->addChild(
563*35238bceSAndroid Build Coastguard Worker                               new TextureUploadCallCase(m_context, caseName.c_str(), "", function, format, type, size));
564*35238bceSAndroid Build Coastguard Worker                           textureSizes[texSize].uploadAndDrawGroup->addChild(new TextureUploadAndDrawCase(
565*35238bceSAndroid Build Coastguard Worker                               m_context, caseName.c_str(), "", function, format, type, size));
566*35238bceSAndroid Build Coastguard Worker                       })))
567*35238bceSAndroid Build Coastguard Worker 
568*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < DE_LENGTH_OF_ARRAY(textureSizes); i++)
569*35238bceSAndroid Build Coastguard Worker     {
570*35238bceSAndroid Build Coastguard Worker         uploadCall->addChild(textureSizes[i].uploadCallGroup);
571*35238bceSAndroid Build Coastguard Worker         uploadAndDraw->addChild(textureSizes[i].uploadAndDrawGroup);
572*35238bceSAndroid Build Coastguard Worker     }
573*35238bceSAndroid Build Coastguard Worker }
574*35238bceSAndroid Build Coastguard Worker 
575*35238bceSAndroid Build Coastguard Worker } // namespace Performance
576*35238bceSAndroid Build Coastguard Worker } // namespace gles2
577*35238bceSAndroid Build Coastguard Worker } // namespace deqp
578