xref: /aosp_15_r20/external/angle/src/tests/perf_tests/TexturesPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // TexturesPerf:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for setting texture state.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
13*8975f5c5SAndroid Build Coastguard Worker #include <random>
14*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace angle
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 256;
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker enum class Frequency
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     Always,
26*8975f5c5SAndroid Build Coastguard Worker     Sometimes,
27*8975f5c5SAndroid Build Coastguard Worker     Never
28*8975f5c5SAndroid Build Coastguard Worker };
29*8975f5c5SAndroid Build Coastguard Worker 
GetFrequencyValue(Frequency frequency,size_t sometimesValue)30*8975f5c5SAndroid Build Coastguard Worker size_t GetFrequencyValue(Frequency frequency, size_t sometimesValue)
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     switch (frequency)
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Always:
35*8975f5c5SAndroid Build Coastguard Worker             return 1;
36*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Never:
37*8975f5c5SAndroid Build Coastguard Worker             return std::numeric_limits<size_t>::max();
38*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Sometimes:
39*8975f5c5SAndroid Build Coastguard Worker             return sometimesValue;
40*8975f5c5SAndroid Build Coastguard Worker         default:
41*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
42*8975f5c5SAndroid Build Coastguard Worker             return 0;
43*8975f5c5SAndroid Build Coastguard Worker     }
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker 
FrequencyToString(Frequency frequency)46*8975f5c5SAndroid Build Coastguard Worker std::string FrequencyToString(Frequency frequency)
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker     switch (frequency)
49*8975f5c5SAndroid Build Coastguard Worker     {
50*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Always:
51*8975f5c5SAndroid Build Coastguard Worker             return "always";
52*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Sometimes:
53*8975f5c5SAndroid Build Coastguard Worker             return "sometimes";
54*8975f5c5SAndroid Build Coastguard Worker         case Frequency::Never:
55*8975f5c5SAndroid Build Coastguard Worker             return "never";
56*8975f5c5SAndroid Build Coastguard Worker         default:
57*8975f5c5SAndroid Build Coastguard Worker             UNREACHABLE();
58*8975f5c5SAndroid Build Coastguard Worker             return "";
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker }
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kRebindSometimesFrequency      = 5;
63*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kStateUpdateSometimesFrequency = 3;
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker struct TexturesParams final : public RenderTestParams
66*8975f5c5SAndroid Build Coastguard Worker {
TexturesParamsangle::TexturesParams67*8975f5c5SAndroid Build Coastguard Worker     TexturesParams()
68*8975f5c5SAndroid Build Coastguard Worker     {
69*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = kIterationsPerStep;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker         // Common default params
72*8975f5c5SAndroid Build Coastguard Worker         majorVersion = 2;
73*8975f5c5SAndroid Build Coastguard Worker         minorVersion = 0;
74*8975f5c5SAndroid Build Coastguard Worker         windowWidth  = 720;
75*8975f5c5SAndroid Build Coastguard Worker         windowHeight = 720;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker         numTextures                 = 8;
78*8975f5c5SAndroid Build Coastguard Worker         textureRebindFrequency      = Frequency::Sometimes;
79*8975f5c5SAndroid Build Coastguard Worker         textureStateUpdateFrequency = Frequency::Sometimes;
80*8975f5c5SAndroid Build Coastguard Worker         textureMipCount             = 8;
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker         webgl = false;
83*8975f5c5SAndroid Build Coastguard Worker     }
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override;
86*8975f5c5SAndroid Build Coastguard Worker     size_t numTextures;
87*8975f5c5SAndroid Build Coastguard Worker     Frequency textureRebindFrequency;
88*8975f5c5SAndroid Build Coastguard Worker     Frequency textureStateUpdateFrequency;
89*8975f5c5SAndroid Build Coastguard Worker     size_t textureMipCount;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     bool webgl;
92*8975f5c5SAndroid Build Coastguard Worker };
93*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const TexturesParams & params)94*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const TexturesParams &params)
95*8975f5c5SAndroid Build Coastguard Worker {
96*8975f5c5SAndroid Build Coastguard Worker     os << params.backendAndStory().substr(1);
97*8975f5c5SAndroid Build Coastguard Worker     return os;
98*8975f5c5SAndroid Build Coastguard Worker }
99*8975f5c5SAndroid Build Coastguard Worker 
story() const100*8975f5c5SAndroid Build Coastguard Worker std::string TexturesParams::story() const
101*8975f5c5SAndroid Build Coastguard Worker {
102*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker     strstr << RenderTestParams::story();
105*8975f5c5SAndroid Build Coastguard Worker     strstr << "_" << FrequencyToString(textureRebindFrequency) << "_rebind";
106*8975f5c5SAndroid Build Coastguard Worker     strstr << "_" << FrequencyToString(textureStateUpdateFrequency) << "_update";
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     if (webgl)
109*8975f5c5SAndroid Build Coastguard Worker     {
110*8975f5c5SAndroid Build Coastguard Worker         strstr << "_webgl";
111*8975f5c5SAndroid Build Coastguard Worker     }
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
114*8975f5c5SAndroid Build Coastguard Worker }
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker class TexturesBenchmark : public ANGLERenderTest,
117*8975f5c5SAndroid Build Coastguard Worker                           public ::testing::WithParamInterface<TexturesParams>
118*8975f5c5SAndroid Build Coastguard Worker {
119*8975f5c5SAndroid Build Coastguard Worker   public:
120*8975f5c5SAndroid Build Coastguard Worker     TexturesBenchmark();
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
123*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
124*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker   private:
127*8975f5c5SAndroid Build Coastguard Worker     void initShaders();
128*8975f5c5SAndroid Build Coastguard Worker     void initTextures();
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mTextures;
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
133*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mUniformLocations;
134*8975f5c5SAndroid Build Coastguard Worker };
135*8975f5c5SAndroid Build Coastguard Worker 
TexturesBenchmark()136*8975f5c5SAndroid Build Coastguard Worker TexturesBenchmark::TexturesBenchmark() : ANGLERenderTest("Textures", GetParam()), mProgram(0u)
137*8975f5c5SAndroid Build Coastguard Worker {
138*8975f5c5SAndroid Build Coastguard Worker     setWebGLCompatibilityEnabled(GetParam().webgl);
139*8975f5c5SAndroid Build Coastguard Worker     setRobustResourceInit(GetParam().webgl);
140*8975f5c5SAndroid Build Coastguard Worker }
141*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()142*8975f5c5SAndroid Build Coastguard Worker void TexturesBenchmark::initializeBenchmark()
143*8975f5c5SAndroid Build Coastguard Worker {
144*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker     // Verify the uniform counts are within the limits
147*8975f5c5SAndroid Build Coastguard Worker     GLint maxTextureUnits;
148*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
149*8975f5c5SAndroid Build Coastguard Worker     if (params.numTextures > static_cast<size_t>(maxTextureUnits))
150*8975f5c5SAndroid Build Coastguard Worker     {
151*8975f5c5SAndroid Build Coastguard Worker         FAIL() << "Texture count (" << params.numTextures << ")"
152*8975f5c5SAndroid Build Coastguard Worker                << " exceeds maximum texture unit count: " << maxTextureUnits << std::endl;
153*8975f5c5SAndroid Build Coastguard Worker     }
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     initShaders();
156*8975f5c5SAndroid Build Coastguard Worker     initTextures();
157*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
158*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
161*8975f5c5SAndroid Build Coastguard Worker }
162*8975f5c5SAndroid Build Coastguard Worker 
GetUniformLocationName(size_t idx,bool vertexShader)163*8975f5c5SAndroid Build Coastguard Worker std::string GetUniformLocationName(size_t idx, bool vertexShader)
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
166*8975f5c5SAndroid Build Coastguard Worker     strstr << (vertexShader ? "vs" : "fs") << "_u_" << idx;
167*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
168*8975f5c5SAndroid Build Coastguard Worker }
169*8975f5c5SAndroid Build Coastguard Worker 
initShaders()170*8975f5c5SAndroid Build Coastguard Worker void TexturesBenchmark::initShaders()
171*8975f5c5SAndroid Build Coastguard Worker {
172*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker     std::string vs =
175*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
176*8975f5c5SAndroid Build Coastguard Worker         "{\n"
177*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(0, 0, 0, 0);\n"
178*8975f5c5SAndroid Build Coastguard Worker         "}\n";
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker     std::stringstream fstrstr;
181*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < params.numTextures; i++)
182*8975f5c5SAndroid Build Coastguard Worker     {
183*8975f5c5SAndroid Build Coastguard Worker         fstrstr << "uniform sampler2D tex" << i << ";";
184*8975f5c5SAndroid Build Coastguard Worker     }
185*8975f5c5SAndroid Build Coastguard Worker     fstrstr << "void main()\n"
186*8975f5c5SAndroid Build Coastguard Worker                "{\n"
187*8975f5c5SAndroid Build Coastguard Worker                "    gl_FragColor = vec4(0, 0, 0, 0)";
188*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < params.numTextures; i++)
189*8975f5c5SAndroid Build Coastguard Worker     {
190*8975f5c5SAndroid Build Coastguard Worker         fstrstr << "+ texture2D(tex" << i << ", vec2(0, 0))";
191*8975f5c5SAndroid Build Coastguard Worker     }
192*8975f5c5SAndroid Build Coastguard Worker     fstrstr << ";\n"
193*8975f5c5SAndroid Build Coastguard Worker                "}\n";
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(vs.c_str(), fstrstr.str().c_str());
196*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
197*8975f5c5SAndroid Build Coastguard Worker 
198*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < params.numTextures; ++i)
199*8975f5c5SAndroid Build Coastguard Worker     {
200*8975f5c5SAndroid Build Coastguard Worker         std::stringstream uniformName;
201*8975f5c5SAndroid Build Coastguard Worker         uniformName << "tex" << i;
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker         GLint location = glGetUniformLocation(mProgram, uniformName.str().c_str());
204*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, location);
205*8975f5c5SAndroid Build Coastguard Worker         mUniformLocations.push_back(location);
206*8975f5c5SAndroid Build Coastguard Worker     }
207*8975f5c5SAndroid Build Coastguard Worker 
208*8975f5c5SAndroid Build Coastguard Worker     // Use the program object
209*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
210*8975f5c5SAndroid Build Coastguard Worker }
211*8975f5c5SAndroid Build Coastguard Worker 
initTextures()212*8975f5c5SAndroid Build Coastguard Worker void TexturesBenchmark::initTextures()
213*8975f5c5SAndroid Build Coastguard Worker {
214*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker     size_t textureSize = static_cast<size_t>(1) << params.textureMipCount;
217*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> textureData(textureSize * textureSize * 4);
218*8975f5c5SAndroid Build Coastguard Worker     for (auto &byte : textureData)
219*8975f5c5SAndroid Build Coastguard Worker     {
220*8975f5c5SAndroid Build Coastguard Worker         byte = rand() % 255u;
221*8975f5c5SAndroid Build Coastguard Worker     }
222*8975f5c5SAndroid Build Coastguard Worker 
223*8975f5c5SAndroid Build Coastguard Worker     for (size_t texIndex = 0; texIndex < params.numTextures; texIndex++)
224*8975f5c5SAndroid Build Coastguard Worker     {
225*8975f5c5SAndroid Build Coastguard Worker         GLuint tex = 0;
226*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &tex);
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + texIndex));
229*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
230*8975f5c5SAndroid Build Coastguard Worker         for (size_t mip = 0; mip < params.textureMipCount; mip++)
231*8975f5c5SAndroid Build Coastguard Worker         {
232*8975f5c5SAndroid Build Coastguard Worker             GLsizei levelSize = static_cast<GLsizei>(textureSize >> mip);
233*8975f5c5SAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, static_cast<GLint>(mip), GL_RGBA, levelSize, levelSize, 0,
234*8975f5c5SAndroid Build Coastguard Worker                          GL_RGBA, GL_UNSIGNED_BYTE, textureData.data());
235*8975f5c5SAndroid Build Coastguard Worker         }
236*8975f5c5SAndroid Build Coastguard Worker         mTextures.push_back(tex);
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mUniformLocations[texIndex], static_cast<GLint>(texIndex));
239*8975f5c5SAndroid Build Coastguard Worker     }
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()242*8975f5c5SAndroid Build Coastguard Worker void TexturesBenchmark::destroyBenchmark()
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker     glDeleteProgram(mProgram);
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()247*8975f5c5SAndroid Build Coastguard Worker void TexturesBenchmark::drawBenchmark()
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker     size_t textureRebindPeriod =
252*8975f5c5SAndroid Build Coastguard Worker         GetFrequencyValue(params.textureRebindFrequency, kRebindSometimesFrequency);
253*8975f5c5SAndroid Build Coastguard Worker     size_t textureStateUpdatePeriod =
254*8975f5c5SAndroid Build Coastguard Worker         GetFrequencyValue(params.textureStateUpdateFrequency, kStateUpdateSometimesFrequency);
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     for (size_t it = 0; it < params.iterationsPerStep; ++it)
257*8975f5c5SAndroid Build Coastguard Worker     {
258*8975f5c5SAndroid Build Coastguard Worker         if (it % textureRebindPeriod == 0)
259*8975f5c5SAndroid Build Coastguard Worker         {
260*8975f5c5SAndroid Build Coastguard Worker             // Swap two textures
261*8975f5c5SAndroid Build Coastguard Worker             size_t swapTexture = (it / textureRebindPeriod) % (params.numTextures - 1);
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + swapTexture));
264*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[swapTexture]);
265*8975f5c5SAndroid Build Coastguard Worker             glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + swapTexture + 1));
266*8975f5c5SAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, mTextures[swapTexture + 1]);
267*8975f5c5SAndroid Build Coastguard Worker             std::swap(mTextures[swapTexture], mTextures[swapTexture + 1]);
268*8975f5c5SAndroid Build Coastguard Worker         }
269*8975f5c5SAndroid Build Coastguard Worker 
270*8975f5c5SAndroid Build Coastguard Worker         if (it % textureStateUpdatePeriod == 0)
271*8975f5c5SAndroid Build Coastguard Worker         {
272*8975f5c5SAndroid Build Coastguard Worker             // Update a texture's state
273*8975f5c5SAndroid Build Coastguard Worker             size_t stateUpdateCount = it / textureStateUpdatePeriod;
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker             const size_t numUpdateTextures = 4;
276*8975f5c5SAndroid Build Coastguard Worker             ASSERT_LE(numUpdateTextures, params.numTextures);
277*8975f5c5SAndroid Build Coastguard Worker 
278*8975f5c5SAndroid Build Coastguard Worker             size_t firstTexture = stateUpdateCount % (params.numTextures - numUpdateTextures);
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker             for (size_t updateTextureIdx = 0; updateTextureIdx < numUpdateTextures;
281*8975f5c5SAndroid Build Coastguard Worker                  updateTextureIdx++)
282*8975f5c5SAndroid Build Coastguard Worker             {
283*8975f5c5SAndroid Build Coastguard Worker                 size_t updateTexture = firstTexture + updateTextureIdx;
284*8975f5c5SAndroid Build Coastguard Worker                 glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + updateTexture));
285*8975f5c5SAndroid Build Coastguard Worker 
286*8975f5c5SAndroid Build Coastguard Worker                 const GLenum minFilters[] = {
287*8975f5c5SAndroid Build Coastguard Worker                     GL_NEAREST,
288*8975f5c5SAndroid Build Coastguard Worker                     GL_LINEAR,
289*8975f5c5SAndroid Build Coastguard Worker                     GL_NEAREST_MIPMAP_NEAREST,
290*8975f5c5SAndroid Build Coastguard Worker                     GL_LINEAR_MIPMAP_NEAREST,
291*8975f5c5SAndroid Build Coastguard Worker                     GL_NEAREST_MIPMAP_LINEAR,
292*8975f5c5SAndroid Build Coastguard Worker                     GL_LINEAR_MIPMAP_LINEAR,
293*8975f5c5SAndroid Build Coastguard Worker                 };
294*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
295*8975f5c5SAndroid Build Coastguard Worker                                 minFilters[stateUpdateCount % ArraySize(minFilters)]);
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker                 const GLenum magFilters[] = {
298*8975f5c5SAndroid Build Coastguard Worker                     GL_NEAREST,
299*8975f5c5SAndroid Build Coastguard Worker                     GL_LINEAR,
300*8975f5c5SAndroid Build Coastguard Worker                 };
301*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
302*8975f5c5SAndroid Build Coastguard Worker                                 magFilters[stateUpdateCount % ArraySize(magFilters)]);
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker                 const GLenum wrapParameters[] = {
305*8975f5c5SAndroid Build Coastguard Worker                     GL_CLAMP_TO_EDGE,
306*8975f5c5SAndroid Build Coastguard Worker                     GL_REPEAT,
307*8975f5c5SAndroid Build Coastguard Worker                     GL_MIRRORED_REPEAT,
308*8975f5c5SAndroid Build Coastguard Worker                 };
309*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
310*8975f5c5SAndroid Build Coastguard Worker                                 wrapParameters[stateUpdateCount % ArraySize(wrapParameters)]);
311*8975f5c5SAndroid Build Coastguard Worker                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
312*8975f5c5SAndroid Build Coastguard Worker                                 wrapParameters[stateUpdateCount % ArraySize(wrapParameters)]);
313*8975f5c5SAndroid Build Coastguard Worker             }
314*8975f5c5SAndroid Build Coastguard Worker         }
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 3);
317*8975f5c5SAndroid Build Coastguard Worker     }
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
320*8975f5c5SAndroid Build Coastguard Worker }
321*8975f5c5SAndroid Build Coastguard Worker 
ApplyFrequencies(const TexturesParams & paramsIn,Frequency rebindFrequency,Frequency stateUpdateFrequency)322*8975f5c5SAndroid Build Coastguard Worker TexturesParams ApplyFrequencies(const TexturesParams &paramsIn,
323*8975f5c5SAndroid Build Coastguard Worker                                 Frequency rebindFrequency,
324*8975f5c5SAndroid Build Coastguard Worker                                 Frequency stateUpdateFrequency)
325*8975f5c5SAndroid Build Coastguard Worker {
326*8975f5c5SAndroid Build Coastguard Worker     TexturesParams paramsOut              = paramsIn;
327*8975f5c5SAndroid Build Coastguard Worker     paramsOut.textureRebindFrequency      = rebindFrequency;
328*8975f5c5SAndroid Build Coastguard Worker     paramsOut.textureStateUpdateFrequency = stateUpdateFrequency;
329*8975f5c5SAndroid Build Coastguard Worker     return paramsOut;
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker 
D3D11Params(bool webglCompat,Frequency rebindFrequency,Frequency stateUpdateFrequency)332*8975f5c5SAndroid Build Coastguard Worker TexturesParams D3D11Params(bool webglCompat,
333*8975f5c5SAndroid Build Coastguard Worker                            Frequency rebindFrequency,
334*8975f5c5SAndroid Build Coastguard Worker                            Frequency stateUpdateFrequency)
335*8975f5c5SAndroid Build Coastguard Worker {
336*8975f5c5SAndroid Build Coastguard Worker     TexturesParams params;
337*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::D3D11_NULL();
338*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
339*8975f5c5SAndroid Build Coastguard Worker     return ApplyFrequencies(params, rebindFrequency, stateUpdateFrequency);
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker 
MetalParams(bool webglCompat,Frequency rebindFrequency,Frequency stateUpdateFrequency)342*8975f5c5SAndroid Build Coastguard Worker TexturesParams MetalParams(bool webglCompat,
343*8975f5c5SAndroid Build Coastguard Worker                            Frequency rebindFrequency,
344*8975f5c5SAndroid Build Coastguard Worker                            Frequency stateUpdateFrequency)
345*8975f5c5SAndroid Build Coastguard Worker {
346*8975f5c5SAndroid Build Coastguard Worker     TexturesParams params;
347*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::METAL();
348*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
349*8975f5c5SAndroid Build Coastguard Worker     return ApplyFrequencies(params, rebindFrequency, stateUpdateFrequency);
350*8975f5c5SAndroid Build Coastguard Worker }
351*8975f5c5SAndroid Build Coastguard Worker 
OpenGLOrGLESParams(bool webglCompat,Frequency rebindFrequency,Frequency stateUpdateFrequency)352*8975f5c5SAndroid Build Coastguard Worker TexturesParams OpenGLOrGLESParams(bool webglCompat,
353*8975f5c5SAndroid Build Coastguard Worker                                   Frequency rebindFrequency,
354*8975f5c5SAndroid Build Coastguard Worker                                   Frequency stateUpdateFrequency)
355*8975f5c5SAndroid Build Coastguard Worker {
356*8975f5c5SAndroid Build Coastguard Worker     TexturesParams params;
357*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::OPENGL_OR_GLES_NULL();
358*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
359*8975f5c5SAndroid Build Coastguard Worker     return ApplyFrequencies(params, rebindFrequency, stateUpdateFrequency);
360*8975f5c5SAndroid Build Coastguard Worker }
361*8975f5c5SAndroid Build Coastguard Worker 
VulkanParams(bool webglCompat,Frequency rebindFrequency,Frequency stateUpdateFrequency)362*8975f5c5SAndroid Build Coastguard Worker TexturesParams VulkanParams(bool webglCompat,
363*8975f5c5SAndroid Build Coastguard Worker                             Frequency rebindFrequency,
364*8975f5c5SAndroid Build Coastguard Worker                             Frequency stateUpdateFrequency)
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker     TexturesParams params;
367*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::VULKAN_NULL();
368*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
369*8975f5c5SAndroid Build Coastguard Worker     return ApplyFrequencies(params, rebindFrequency, stateUpdateFrequency);
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(TexturesBenchmark,Run)372*8975f5c5SAndroid Build Coastguard Worker TEST_P(TexturesBenchmark, Run)
373*8975f5c5SAndroid Build Coastguard Worker {
374*8975f5c5SAndroid Build Coastguard Worker     run();
375*8975f5c5SAndroid Build Coastguard Worker }
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(TexturesBenchmark,
378*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(false, Frequency::Sometimes, Frequency::Sometimes),
379*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(true, Frequency::Sometimes, Frequency::Sometimes),
380*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(false, Frequency::Always, Frequency::Always),
381*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(true, Frequency::Always, Frequency::Always),
382*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(false, Frequency::Sometimes, Frequency::Sometimes),
383*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(true, Frequency::Sometimes, Frequency::Sometimes),
384*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(false, Frequency::Always, Frequency::Always),
385*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(true, Frequency::Always, Frequency::Always),
386*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(false, Frequency::Sometimes, Frequency::Sometimes),
387*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(true, Frequency::Sometimes, Frequency::Sometimes),
388*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(false, Frequency::Always, Frequency::Always),
389*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(true, Frequency::Always, Frequency::Always),
390*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, Frequency::Sometimes, Frequency::Sometimes),
391*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, Frequency::Sometimes, Frequency::Sometimes),
392*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, Frequency::Always, Frequency::Always),
393*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, Frequency::Always, Frequency::Always),
394*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, Frequency::Always, Frequency::Never));
395*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
396