xref: /aosp_15_r20/external/deqp/modules/gles2/performance/es2pTextureCases.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 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