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 format performance tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2pTextureCases.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderPerformanceCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
35*35238bceSAndroid Build Coastguard Worker
36*35238bceSAndroid Build Coastguard Worker namespace deqp
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace gles2
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace Performance
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker using namespace gls;
44*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
45*35238bceSAndroid Build Coastguard Worker using std::string;
46*35238bceSAndroid Build Coastguard Worker using std::vector;
47*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
48*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
49*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
50*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
51*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
52*35238bceSAndroid Build Coastguard Worker
Texture2DRenderCase(Context & context,const char * name,const char * description,uint32_t format,uint32_t dataType,uint32_t wrapS,uint32_t wrapT,uint32_t minFilter,uint32_t magFilter,const tcu::Mat3 & coordTransform,int numTextures,bool powerOfTwo)53*35238bceSAndroid Build Coastguard Worker Texture2DRenderCase::Texture2DRenderCase(Context &context, const char *name, const char *description, uint32_t format,
54*35238bceSAndroid Build Coastguard Worker uint32_t dataType, uint32_t wrapS, uint32_t wrapT, uint32_t minFilter,
55*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, const tcu::Mat3 &coordTransform, int numTextures,
56*35238bceSAndroid Build Coastguard Worker bool powerOfTwo)
57*35238bceSAndroid Build Coastguard Worker : ShaderPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description, CASETYPE_FRAGMENT)
58*35238bceSAndroid Build Coastguard Worker , m_format(format)
59*35238bceSAndroid Build Coastguard Worker , m_dataType(dataType)
60*35238bceSAndroid Build Coastguard Worker , m_wrapS(wrapS)
61*35238bceSAndroid Build Coastguard Worker , m_wrapT(wrapT)
62*35238bceSAndroid Build Coastguard Worker , m_minFilter(minFilter)
63*35238bceSAndroid Build Coastguard Worker , m_magFilter(magFilter)
64*35238bceSAndroid Build Coastguard Worker , m_coordTransform(coordTransform)
65*35238bceSAndroid Build Coastguard Worker , m_numTextures(numTextures)
66*35238bceSAndroid Build Coastguard Worker , m_powerOfTwo(powerOfTwo)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker }
69*35238bceSAndroid Build Coastguard Worker
~Texture2DRenderCase(void)70*35238bceSAndroid Build Coastguard Worker Texture2DRenderCase::~Texture2DRenderCase(void)
71*35238bceSAndroid Build Coastguard Worker {
72*35238bceSAndroid Build Coastguard Worker for (vector<glu::Texture2D *>::iterator i = m_textures.begin(); i != m_textures.end(); i++)
73*35238bceSAndroid Build Coastguard Worker delete *i;
74*35238bceSAndroid Build Coastguard Worker m_textures.clear();
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker
roundDownToPowerOfTwo(int val)77*35238bceSAndroid Build Coastguard Worker static inline int roundDownToPowerOfTwo(int val)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker DE_ASSERT(val >= 0);
80*35238bceSAndroid Build Coastguard Worker int l0 = deClz32(val);
81*35238bceSAndroid Build Coastguard Worker return val & ~((1 << (31 - l0)) - 1);
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker
init(void)84*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::init(void)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker int width = m_renderCtx.getRenderTarget().getWidth();
89*35238bceSAndroid Build Coastguard Worker int height = m_renderCtx.getRenderTarget().getHeight();
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker if (m_powerOfTwo)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker width = roundDownToPowerOfTwo(width);
94*35238bceSAndroid Build Coastguard Worker height = roundDownToPowerOfTwo(height);
95*35238bceSAndroid Build Coastguard Worker }
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker bool mipmaps = m_minFilter == GL_NEAREST_MIPMAP_NEAREST || m_minFilter == GL_NEAREST_MIPMAP_LINEAR ||
98*35238bceSAndroid Build Coastguard Worker m_minFilter == GL_LINEAR_MIPMAP_NEAREST || m_minFilter == GL_LINEAR_MIPMAP_LINEAR;
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_powerOfTwo || (!mipmaps && m_wrapS == GL_CLAMP_TO_EDGE && m_wrapT == GL_CLAMP_TO_EDGE));
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker Vec2 p00 = (m_coordTransform * Vec3(0.0f, 0.0f, 1.0f)).swizzle(0, 1);
103*35238bceSAndroid Build Coastguard Worker Vec2 p10 = (m_coordTransform * Vec3(1.0f, 0.0f, 1.0f)).swizzle(0, 1);
104*35238bceSAndroid Build Coastguard Worker Vec2 p01 = (m_coordTransform * Vec3(0.0f, 1.0f, 1.0f)).swizzle(0, 1);
105*35238bceSAndroid Build Coastguard Worker Vec2 p11 = (m_coordTransform * Vec3(1.0f, 1.0f, 1.0f)).swizzle(0, 1);
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker m_attributes.push_back(AttribSpec("a_coords", Vec4(p00.x(), p00.y(), 0.0f, 0.0f),
108*35238bceSAndroid Build Coastguard Worker Vec4(p10.x(), p10.y(), 0.0f, 0.0f), Vec4(p01.x(), p01.y(), 0.0f, 0.0f),
109*35238bceSAndroid Build Coastguard Worker Vec4(p11.x(), p11.y(), 0.0f, 0.0f)));
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Size: " << width << "x" << height << TestLog::EndMessage;
112*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Format: " << glu::getTextureFormatName(m_format) << " " << glu::getTypeName(m_dataType)
113*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
114*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Coords: " << p00 << ", " << p10 << ", " << p01 << ", " << p11 << TestLog::EndMessage;
115*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Wrap: " << glu::getTextureWrapModeStr(m_wrapS) << " / "
116*35238bceSAndroid Build Coastguard Worker << glu::getTextureWrapModeStr(m_wrapT) << TestLog::EndMessage;
117*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Filter: " << glu::getTextureFilterStr(m_minFilter) << " / "
118*35238bceSAndroid Build Coastguard Worker << glu::getTextureFilterStr(m_magFilter) << TestLog::EndMessage;
119*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Mipmaps: " << (mipmaps ? "true" : "false") << TestLog::EndMessage;
120*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Using additive blending." << TestLog::EndMessage;
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker // Use same viewport size as texture size.
123*35238bceSAndroid Build Coastguard Worker setViewportSize(width, height);
124*35238bceSAndroid Build Coastguard Worker
125*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = "attribute highp vec4 a_position;\n"
126*35238bceSAndroid Build Coastguard Worker "attribute mediump vec2 a_coords;\n"
127*35238bceSAndroid Build Coastguard Worker "varying mediump vec2 v_coords;\n"
128*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
129*35238bceSAndroid Build Coastguard Worker "{\n"
130*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
131*35238bceSAndroid Build Coastguard Worker " v_coords = a_coords;\n"
132*35238bceSAndroid Build Coastguard Worker "}\n";
133*35238bceSAndroid Build Coastguard Worker
134*35238bceSAndroid Build Coastguard Worker std::ostringstream fragSrc;
135*35238bceSAndroid Build Coastguard Worker fragSrc << "varying mediump vec2 v_coords;\n";
136*35238bceSAndroid Build Coastguard Worker
137*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
138*35238bceSAndroid Build Coastguard Worker fragSrc << "uniform sampler2D u_sampler" << texNdx << ";\n";
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker fragSrc << "void main (void)\n"
141*35238bceSAndroid Build Coastguard Worker << "{\n";
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
144*35238bceSAndroid Build Coastguard Worker fragSrc << "\t" << (texNdx == 0 ? "lowp vec4 r = " : "r += ") << "texture2D(u_sampler" << texNdx
145*35238bceSAndroid Build Coastguard Worker << ", v_coords);\n";
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker fragSrc << " gl_FragColor = r;\n"
148*35238bceSAndroid Build Coastguard Worker << "}\n";
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragSrc.str();
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker m_textures.reserve(m_numTextures);
153*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker static const IVec4 swizzles[] = {IVec4(0, 1, 2, 3), IVec4(1, 2, 3, 0), IVec4(2, 3, 0, 1), IVec4(3, 0, 1, 2),
156*35238bceSAndroid Build Coastguard Worker IVec4(3, 2, 1, 0), IVec4(2, 1, 0, 3), IVec4(1, 0, 3, 2), IVec4(0, 3, 2, 1)};
157*35238bceSAndroid Build Coastguard Worker const IVec4 &sw = swizzles[texNdx % DE_LENGTH_OF_ARRAY(swizzles)];
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker glu::Texture2D *texture = new glu::Texture2D(m_renderCtx, m_format, m_dataType, width, height);
160*35238bceSAndroid Build Coastguard Worker m_textures.push_back(texture);
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker // Fill levels.
163*35238bceSAndroid Build Coastguard Worker int numLevels = mipmaps ? texture->getRefTexture().getNumLevels() : 1;
164*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
165*35238bceSAndroid Build Coastguard Worker {
166*35238bceSAndroid Build Coastguard Worker texture->getRefTexture().allocLevel(levelNdx);
167*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(texture->getRefTexture().getLevel(levelNdx),
168*35238bceSAndroid Build Coastguard Worker Vec4(0.0f, 0.0f, 0.0f, 0.0f).swizzle(sw[0], sw[1], sw[2], sw[3]),
169*35238bceSAndroid Build Coastguard Worker Vec4(1.0f, 1.0f, 1.0f, 1.0f).swizzle(sw[0], sw[1], sw[2], sw[3]));
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker texture->upload();
173*35238bceSAndroid Build Coastguard Worker }
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker ShaderPerformanceCase::init();
176*35238bceSAndroid Build Coastguard Worker }
177*35238bceSAndroid Build Coastguard Worker
deinit(void)178*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::deinit(void)
179*35238bceSAndroid Build Coastguard Worker {
180*35238bceSAndroid Build Coastguard Worker for (vector<glu::Texture2D *>::iterator i = m_textures.begin(); i != m_textures.end(); i++)
181*35238bceSAndroid Build Coastguard Worker delete *i;
182*35238bceSAndroid Build Coastguard Worker m_textures.clear();
183*35238bceSAndroid Build Coastguard Worker
184*35238bceSAndroid Build Coastguard Worker ShaderPerformanceCase::deinit();
185*35238bceSAndroid Build Coastguard Worker }
186*35238bceSAndroid Build Coastguard Worker
setupProgram(uint32_t program)187*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::setupProgram(uint32_t program)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_renderCtx.getFunctions();
190*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
191*35238bceSAndroid Build Coastguard Worker {
192*35238bceSAndroid Build Coastguard Worker int samplerLoc = gl.getUniformLocation(program, (string("u_sampler") + de::toString(texNdx)).c_str());
193*35238bceSAndroid Build Coastguard Worker gl.uniform1i(samplerLoc, texNdx);
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker
setupRenderState(void)197*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::setupRenderState(void)
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_renderCtx.getFunctions();
200*35238bceSAndroid Build Coastguard Worker
201*35238bceSAndroid Build Coastguard Worker // Setup additive blending.
202*35238bceSAndroid Build Coastguard Worker gl.enable(GL_BLEND);
203*35238bceSAndroid Build Coastguard Worker gl.blendFunc(GL_ONE, GL_ONE);
204*35238bceSAndroid Build Coastguard Worker gl.blendEquation(GL_FUNC_ADD);
205*35238bceSAndroid Build Coastguard Worker
206*35238bceSAndroid Build Coastguard Worker // Setup textures.
207*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker gl.activeTexture(GL_TEXTURE0 + texNdx);
210*35238bceSAndroid Build Coastguard Worker gl.bindTexture(GL_TEXTURE_2D, m_textures[texNdx]->getGLTexture());
211*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_minFilter);
212*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_magFilter);
213*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_wrapS);
214*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_wrapT);
215*35238bceSAndroid Build Coastguard Worker }
216*35238bceSAndroid Build Coastguard Worker }
217*35238bceSAndroid Build Coastguard Worker
218*35238bceSAndroid Build Coastguard Worker } // namespace Performance
219*35238bceSAndroid Build Coastguard Worker } // namespace gles2
220*35238bceSAndroid Build Coastguard Worker } // namespace deqp
221