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 format performance tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3pTextureCases.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 "gluTextureUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker
34*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker namespace deqp
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker namespace gles3
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker namespace Performance
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using namespace gls;
45*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
46*35238bceSAndroid Build Coastguard Worker using std::string;
47*35238bceSAndroid Build Coastguard Worker using std::vector;
48*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
49*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
50*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
51*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
52*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
53*35238bceSAndroid Build Coastguard Worker
Texture2DRenderCase(Context & context,const char * name,const char * description,uint32_t internalFormat,uint32_t wrapS,uint32_t wrapT,uint32_t minFilter,uint32_t magFilter,const tcu::Mat3 & coordTransform,int numTextures,bool powerOfTwo)54*35238bceSAndroid Build Coastguard Worker Texture2DRenderCase::Texture2DRenderCase(Context &context, const char *name, const char *description,
55*35238bceSAndroid Build Coastguard Worker uint32_t internalFormat, uint32_t wrapS, uint32_t wrapT, uint32_t minFilter,
56*35238bceSAndroid Build Coastguard Worker uint32_t magFilter, const tcu::Mat3 &coordTransform, int numTextures,
57*35238bceSAndroid Build Coastguard Worker bool powerOfTwo)
58*35238bceSAndroid Build Coastguard Worker : ShaderPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description, CASETYPE_FRAGMENT)
59*35238bceSAndroid Build Coastguard Worker , m_internalFormat(internalFormat)
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 const tcu::TextureFormat texFormat = glu::mapGLInternalFormat(m_internalFormat);
89*35238bceSAndroid Build Coastguard Worker const tcu::TextureFormatInfo fmtInfo = tcu::getTextureFormatInfo(texFormat);
90*35238bceSAndroid Build Coastguard Worker const glu::Precision samplerPrec =
91*35238bceSAndroid Build Coastguard Worker (texFormat.type == tcu::TextureFormat::FLOAT || texFormat.type == tcu::TextureFormat::UNSIGNED_INT32 ||
92*35238bceSAndroid Build Coastguard Worker texFormat.type == tcu::TextureFormat::SIGNED_INT32) ?
93*35238bceSAndroid Build Coastguard Worker glu::PRECISION_HIGHP :
94*35238bceSAndroid Build Coastguard Worker glu::PRECISION_MEDIUMP;
95*35238bceSAndroid Build Coastguard Worker const glu::DataType samplerType = glu::getSampler2DType(texFormat);
96*35238bceSAndroid Build Coastguard Worker const bool isIntUint = samplerType == glu::TYPE_INT_SAMPLER_2D || samplerType == glu::TYPE_UINT_SAMPLER_2D;
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker int width = m_renderCtx.getRenderTarget().getWidth();
99*35238bceSAndroid Build Coastguard Worker int height = m_renderCtx.getRenderTarget().getHeight();
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker if (m_powerOfTwo)
102*35238bceSAndroid Build Coastguard Worker {
103*35238bceSAndroid Build Coastguard Worker width = roundDownToPowerOfTwo(width);
104*35238bceSAndroid Build Coastguard Worker height = roundDownToPowerOfTwo(height);
105*35238bceSAndroid Build Coastguard Worker }
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker bool mipmaps = m_minFilter == GL_NEAREST_MIPMAP_NEAREST || m_minFilter == GL_NEAREST_MIPMAP_LINEAR ||
108*35238bceSAndroid Build Coastguard Worker m_minFilter == GL_LINEAR_MIPMAP_NEAREST || m_minFilter == GL_LINEAR_MIPMAP_LINEAR;
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_powerOfTwo || (!mipmaps && m_wrapS == GL_CLAMP_TO_EDGE && m_wrapT == GL_CLAMP_TO_EDGE));
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker Vec2 p00 = (m_coordTransform * Vec3(0.0f, 0.0f, 1.0f)).swizzle(0, 1);
113*35238bceSAndroid Build Coastguard Worker Vec2 p10 = (m_coordTransform * Vec3(1.0f, 0.0f, 1.0f)).swizzle(0, 1);
114*35238bceSAndroid Build Coastguard Worker Vec2 p01 = (m_coordTransform * Vec3(0.0f, 1.0f, 1.0f)).swizzle(0, 1);
115*35238bceSAndroid Build Coastguard Worker Vec2 p11 = (m_coordTransform * Vec3(1.0f, 1.0f, 1.0f)).swizzle(0, 1);
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker m_attributes.push_back(AttribSpec("a_coords", Vec4(p00.x(), p00.y(), 0.0f, 0.0f),
118*35238bceSAndroid Build Coastguard Worker Vec4(p10.x(), p10.y(), 0.0f, 0.0f), Vec4(p01.x(), p01.y(), 0.0f, 0.0f),
119*35238bceSAndroid Build Coastguard Worker Vec4(p11.x(), p11.y(), 0.0f, 0.0f)));
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Size: " << width << "x" << height << TestLog::EndMessage;
122*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Format: " << glu::getTextureFormatName(m_internalFormat) << TestLog::EndMessage;
123*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Coords: " << p00 << ", " << p10 << ", " << p01 << ", " << p11 << TestLog::EndMessage;
124*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Wrap: " << glu::getTextureWrapModeStr(m_wrapS) << " / "
125*35238bceSAndroid Build Coastguard Worker << glu::getTextureWrapModeStr(m_wrapT) << TestLog::EndMessage;
126*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Filter: " << glu::getTextureFilterStr(m_minFilter) << " / "
127*35238bceSAndroid Build Coastguard Worker << glu::getTextureFilterStr(m_magFilter) << TestLog::EndMessage;
128*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Mipmaps: " << (mipmaps ? "true" : "false") << TestLog::EndMessage;
129*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Using additive blending." << TestLog::EndMessage;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker // Use same viewport size as texture size.
132*35238bceSAndroid Build Coastguard Worker setViewportSize(width, height);
133*35238bceSAndroid Build Coastguard Worker
134*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = "#version 300 es\n"
135*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
136*35238bceSAndroid Build Coastguard Worker "in mediump vec2 a_coords;\n"
137*35238bceSAndroid Build Coastguard Worker "out mediump vec2 v_coords;\n"
138*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
139*35238bceSAndroid Build Coastguard Worker "{\n"
140*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
141*35238bceSAndroid Build Coastguard Worker " v_coords = a_coords;\n"
142*35238bceSAndroid Build Coastguard Worker "}\n";
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker std::ostringstream fragSrc;
145*35238bceSAndroid Build Coastguard Worker fragSrc << "#version 300 es\n";
146*35238bceSAndroid Build Coastguard Worker fragSrc << "layout(location = 0) out mediump vec4 o_color;\n";
147*35238bceSAndroid Build Coastguard Worker fragSrc << "in mediump vec2 v_coords;\n";
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
150*35238bceSAndroid Build Coastguard Worker fragSrc << "uniform " << glu::getPrecisionName(samplerPrec) << " " << glu::getDataTypeName(samplerType)
151*35238bceSAndroid Build Coastguard Worker << " u_sampler" << texNdx << ";\n";
152*35238bceSAndroid Build Coastguard Worker
153*35238bceSAndroid Build Coastguard Worker fragSrc << "void main (void)\n"
154*35238bceSAndroid Build Coastguard Worker << "{\n";
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
157*35238bceSAndroid Build Coastguard Worker {
158*35238bceSAndroid Build Coastguard Worker if (texNdx == 0)
159*35238bceSAndroid Build Coastguard Worker fragSrc << "\t" << glu::getPrecisionName(samplerPrec) << " vec4 r = ";
160*35238bceSAndroid Build Coastguard Worker else
161*35238bceSAndroid Build Coastguard Worker fragSrc << "\tr += ";
162*35238bceSAndroid Build Coastguard Worker
163*35238bceSAndroid Build Coastguard Worker if (isIntUint)
164*35238bceSAndroid Build Coastguard Worker fragSrc << "vec4(";
165*35238bceSAndroid Build Coastguard Worker
166*35238bceSAndroid Build Coastguard Worker fragSrc << "texture(u_sampler" << texNdx << ", v_coords)";
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker if (isIntUint)
169*35238bceSAndroid Build Coastguard Worker fragSrc << ")";
170*35238bceSAndroid Build Coastguard Worker
171*35238bceSAndroid Build Coastguard Worker fragSrc << ";\n";
172*35238bceSAndroid Build Coastguard Worker }
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker fragSrc << " o_color = r;\n"
175*35238bceSAndroid Build Coastguard Worker << "}\n";
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragSrc.str();
178*35238bceSAndroid Build Coastguard Worker
179*35238bceSAndroid Build Coastguard Worker m_textures.reserve(m_numTextures);
180*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
181*35238bceSAndroid Build Coastguard Worker {
182*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),
183*35238bceSAndroid Build Coastguard Worker IVec4(3, 2, 1, 0), IVec4(2, 1, 0, 3), IVec4(1, 0, 3, 2), IVec4(0, 3, 2, 1)};
184*35238bceSAndroid Build Coastguard Worker const IVec4 &sw = swizzles[texNdx % DE_LENGTH_OF_ARRAY(swizzles)];
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker glu::Texture2D *texture = new glu::Texture2D(m_renderCtx, m_internalFormat, width, height);
187*35238bceSAndroid Build Coastguard Worker m_textures.push_back(texture);
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker // Fill levels.
190*35238bceSAndroid Build Coastguard Worker int numLevels = mipmaps ? texture->getRefTexture().getNumLevels() : 1;
191*35238bceSAndroid Build Coastguard Worker for (int levelNdx = 0; levelNdx < numLevels; levelNdx++)
192*35238bceSAndroid Build Coastguard Worker {
193*35238bceSAndroid Build Coastguard Worker // \todo [2013-06-02 pyry] Values are not scaled back to 0..1 range in shaders.
194*35238bceSAndroid Build Coastguard Worker texture->getRefTexture().allocLevel(levelNdx);
195*35238bceSAndroid Build Coastguard Worker tcu::fillWithComponentGradients(texture->getRefTexture().getLevel(levelNdx),
196*35238bceSAndroid Build Coastguard Worker fmtInfo.valueMin.swizzle(sw[0], sw[1], sw[2], sw[3]),
197*35238bceSAndroid Build Coastguard Worker fmtInfo.valueMax.swizzle(sw[0], sw[1], sw[2], sw[3]));
198*35238bceSAndroid Build Coastguard Worker }
199*35238bceSAndroid Build Coastguard Worker
200*35238bceSAndroid Build Coastguard Worker texture->upload();
201*35238bceSAndroid Build Coastguard Worker }
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker ShaderPerformanceCase::init();
204*35238bceSAndroid Build Coastguard Worker }
205*35238bceSAndroid Build Coastguard Worker
deinit(void)206*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::deinit(void)
207*35238bceSAndroid Build Coastguard Worker {
208*35238bceSAndroid Build Coastguard Worker for (vector<glu::Texture2D *>::iterator i = m_textures.begin(); i != m_textures.end(); i++)
209*35238bceSAndroid Build Coastguard Worker delete *i;
210*35238bceSAndroid Build Coastguard Worker m_textures.clear();
211*35238bceSAndroid Build Coastguard Worker
212*35238bceSAndroid Build Coastguard Worker ShaderPerformanceCase::deinit();
213*35238bceSAndroid Build Coastguard Worker }
214*35238bceSAndroid Build Coastguard Worker
setupProgram(uint32_t program)215*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::setupProgram(uint32_t program)
216*35238bceSAndroid Build Coastguard Worker {
217*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_renderCtx.getFunctions();
218*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
219*35238bceSAndroid Build Coastguard Worker {
220*35238bceSAndroid Build Coastguard Worker int samplerLoc = gl.getUniformLocation(program, (string("u_sampler") + de::toString(texNdx)).c_str());
221*35238bceSAndroid Build Coastguard Worker gl.uniform1i(samplerLoc, texNdx);
222*35238bceSAndroid Build Coastguard Worker }
223*35238bceSAndroid Build Coastguard Worker }
224*35238bceSAndroid Build Coastguard Worker
setupRenderState(void)225*35238bceSAndroid Build Coastguard Worker void Texture2DRenderCase::setupRenderState(void)
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_renderCtx.getFunctions();
228*35238bceSAndroid Build Coastguard Worker
229*35238bceSAndroid Build Coastguard Worker // Setup additive blending.
230*35238bceSAndroid Build Coastguard Worker gl.enable(GL_BLEND);
231*35238bceSAndroid Build Coastguard Worker gl.blendFunc(GL_ONE, GL_ONE);
232*35238bceSAndroid Build Coastguard Worker gl.blendEquation(GL_FUNC_ADD);
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker // Setup textures.
235*35238bceSAndroid Build Coastguard Worker for (int texNdx = 0; texNdx < m_numTextures; texNdx++)
236*35238bceSAndroid Build Coastguard Worker {
237*35238bceSAndroid Build Coastguard Worker gl.activeTexture(GL_TEXTURE0 + texNdx);
238*35238bceSAndroid Build Coastguard Worker gl.bindTexture(GL_TEXTURE_2D, m_textures[texNdx]->getGLTexture());
239*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_minFilter);
240*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_magFilter);
241*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_wrapS);
242*35238bceSAndroid Build Coastguard Worker gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_wrapT);
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker }
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker } // namespace Performance
247*35238bceSAndroid Build Coastguard Worker } // namespace gles3
248*35238bceSAndroid Build Coastguard Worker } // namespace deqp
249