xref: /aosp_15_r20/external/angle/src/tests/perf_tests/GenerateMipmapPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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 // GenerateMipmapBenchmark:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for generating texture mipmaps.
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 "test_utils/gl_raii.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 5;
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker struct GenerateMipmapParams final : public RenderTestParams
26*8975f5c5SAndroid Build Coastguard Worker {
GenerateMipmapParams__anonb9e554b10111::GenerateMipmapParams27*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapParams()
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = kIterationsPerStep;
30*8975f5c5SAndroid Build Coastguard Worker         trackGpuTime      = true;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker         textureWidth  = 1920;
33*8975f5c5SAndroid Build Coastguard Worker         textureHeight = 1080;
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker         internalFormat = GL_RGBA;
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker         webgl = false;
38*8975f5c5SAndroid Build Coastguard Worker     }
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override;
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker     GLsizei textureWidth;
43*8975f5c5SAndroid Build Coastguard Worker     GLsizei textureHeight;
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker     GLenum internalFormat;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     bool webgl;
48*8975f5c5SAndroid Build Coastguard Worker };
49*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const GenerateMipmapParams & params)50*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const GenerateMipmapParams &params)
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker     return os << params.backendAndStory().substr(1);
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
story() const55*8975f5c5SAndroid Build Coastguard Worker std::string GenerateMipmapParams::story() const
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     strstr << RenderTestParams::story();
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     if (webgl)
62*8975f5c5SAndroid Build Coastguard Worker     {
63*8975f5c5SAndroid Build Coastguard Worker         strstr << "_webgl";
64*8975f5c5SAndroid Build Coastguard Worker     }
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     if (internalFormat == GL_RGB)
67*8975f5c5SAndroid Build Coastguard Worker     {
68*8975f5c5SAndroid Build Coastguard Worker         strstr << "_rgb";
69*8975f5c5SAndroid Build Coastguard Worker     }
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
72*8975f5c5SAndroid Build Coastguard Worker }
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker template <typename T>
FillWithRandomData(T * storage)75*8975f5c5SAndroid Build Coastguard Worker void FillWithRandomData(T *storage)
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker     for (uint8_t &u : *storage)
78*8975f5c5SAndroid Build Coastguard Worker     {
79*8975f5c5SAndroid Build Coastguard Worker         u = rand() & 0xFF;
80*8975f5c5SAndroid Build Coastguard Worker     }
81*8975f5c5SAndroid Build Coastguard Worker }
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker class GenerateMipmapBenchmarkBase : public ANGLERenderTest,
84*8975f5c5SAndroid Build Coastguard Worker                                     public ::testing::WithParamInterface<GenerateMipmapParams>
85*8975f5c5SAndroid Build Coastguard Worker {
86*8975f5c5SAndroid Build Coastguard Worker   public:
87*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapBenchmarkBase(const char *benchmarkName);
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
90*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker   protected:
93*8975f5c5SAndroid Build Coastguard Worker     void initShaders();
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram = 0;
96*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture = 0;
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> mTextureData;
99*8975f5c5SAndroid Build Coastguard Worker };
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker class GenerateMipmapBenchmark : public GenerateMipmapBenchmarkBase
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker   public:
GenerateMipmapBenchmark()104*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapBenchmark() : GenerateMipmapBenchmarkBase("GenerateMipmap") {}
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
109*8975f5c5SAndroid Build Coastguard Worker };
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker class GenerateMipmapWithRedefineBenchmark : public GenerateMipmapBenchmarkBase
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker   public:
GenerateMipmapWithRedefineBenchmark()114*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapWithRedefineBenchmark()
115*8975f5c5SAndroid Build Coastguard Worker         : GenerateMipmapBenchmarkBase("GenerateMipmapWithRedefine")
116*8975f5c5SAndroid Build Coastguard Worker     {}
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
119*8975f5c5SAndroid Build Coastguard Worker };
120*8975f5c5SAndroid Build Coastguard Worker 
GenerateMipmapBenchmarkBase(const char * benchmarkName)121*8975f5c5SAndroid Build Coastguard Worker GenerateMipmapBenchmarkBase::GenerateMipmapBenchmarkBase(const char *benchmarkName)
122*8975f5c5SAndroid Build Coastguard Worker     : ANGLERenderTest(benchmarkName, GetParam())
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker     setWebGLCompatibilityEnabled(GetParam().webgl);
125*8975f5c5SAndroid Build Coastguard Worker     setRobustResourceInit(GetParam().webgl);
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     if (GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
128*8975f5c5SAndroid Build Coastguard Worker     {
129*8975f5c5SAndroid Build Coastguard Worker         skipTest("http://crbug.com/945415 Crashes on nvidia+d3d11");
130*8975f5c5SAndroid Build Coastguard Worker     }
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker     if (IsWindows7() && IsNVIDIA() &&
133*8975f5c5SAndroid Build Coastguard Worker         GetParam().eglParameters.renderer == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
134*8975f5c5SAndroid Build Coastguard Worker     {
135*8975f5c5SAndroid Build Coastguard Worker         skipTest(
136*8975f5c5SAndroid Build Coastguard Worker             "http://crbug.com/1096510 Fails on Windows7 NVIDIA Vulkan, presumably due to old "
137*8975f5c5SAndroid Build Coastguard Worker             "drivers");
138*8975f5c5SAndroid Build Coastguard Worker     }
139*8975f5c5SAndroid Build Coastguard Worker }
140*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()141*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapBenchmarkBase::initializeBenchmark()
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker     initShaders();
146*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
147*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(1, &mTexture);
150*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
153*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
154*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
155*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     mTextureData.resize(params.textureWidth * params.textureHeight * 4);
158*8975f5c5SAndroid Build Coastguard Worker     FillWithRandomData(&mTextureData);
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, params.internalFormat, params.textureWidth, params.textureHeight,
161*8975f5c5SAndroid Build Coastguard Worker                  0, params.internalFormat, GL_UNSIGNED_BYTE, mTextureData.data());
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     // Perform a draw so the image data is flushed.
164*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
169*8975f5c5SAndroid Build Coastguard Worker }
170*8975f5c5SAndroid Build Coastguard Worker 
initShaders()171*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapBenchmarkBase::initShaders()
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(void main()
174*8975f5c5SAndroid Build Coastguard Worker {
175*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(0, 0, 0, 1);
176*8975f5c5SAndroid Build Coastguard Worker })";
177*8975f5c5SAndroid Build Coastguard Worker 
178*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
179*8975f5c5SAndroid Build Coastguard Worker void main()
180*8975f5c5SAndroid Build Coastguard Worker {
181*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0);
182*8975f5c5SAndroid Build Coastguard Worker })";
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(kVS, kFS);
185*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_DEPTH_TEST);
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
192*8975f5c5SAndroid Build Coastguard Worker }
193*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()194*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapBenchmarkBase::destroyBenchmark()
195*8975f5c5SAndroid Build Coastguard Worker {
196*8975f5c5SAndroid Build Coastguard Worker     glDeleteTextures(1, &mTexture);
197*8975f5c5SAndroid Build Coastguard Worker     glDeleteProgram(mProgram);
198*8975f5c5SAndroid Build Coastguard Worker }
199*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()200*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapBenchmark::initializeBenchmark()
201*8975f5c5SAndroid Build Coastguard Worker {
202*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapBenchmarkBase::initializeBenchmark();
203*8975f5c5SAndroid Build Coastguard Worker 
204*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps once so the texture doesn't need to be redefined.
205*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     // Perform a draw so the image data is flushed.
208*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
209*8975f5c5SAndroid Build Coastguard Worker }
210*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()211*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapBenchmark::drawBenchmark()
212*8975f5c5SAndroid Build Coastguard Worker {
213*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker     startGpuTimer();
216*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int iteration = 0; iteration < params.iterationsPerStep; ++iteration)
217*8975f5c5SAndroid Build Coastguard Worker     {
218*8975f5c5SAndroid Build Coastguard Worker         // Slightly modify the base texture so the mipmap is definitely regenerated.
219*8975f5c5SAndroid Build Coastguard Worker         std::array<uint8_t, 4> randomData;
220*8975f5c5SAndroid Build Coastguard Worker         FillWithRandomData(&randomData);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, params.internalFormat, GL_UNSIGNED_BYTE,
223*8975f5c5SAndroid Build Coastguard Worker                         randomData.data());
224*8975f5c5SAndroid Build Coastguard Worker 
225*8975f5c5SAndroid Build Coastguard Worker         // Generate mipmaps
226*8975f5c5SAndroid Build Coastguard Worker         glGenerateMipmap(GL_TEXTURE_2D);
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker         // Perform a draw just so the texture data is flushed.  With the position attributes not
229*8975f5c5SAndroid Build Coastguard Worker         // set, a constant default value is used, resulting in a very cheap draw.
230*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 3);
231*8975f5c5SAndroid Build Coastguard Worker     }
232*8975f5c5SAndroid Build Coastguard Worker     stopGpuTimer();
233*8975f5c5SAndroid Build Coastguard Worker 
234*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()237*8975f5c5SAndroid Build Coastguard Worker void GenerateMipmapWithRedefineBenchmark::drawBenchmark()
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     // Create a new texture every time, so image redefinition happens every time.
242*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
243*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
246*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
247*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
248*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, params.internalFormat, params.textureWidth, params.textureHeight,
251*8975f5c5SAndroid Build Coastguard Worker                  0, params.internalFormat, GL_UNSIGNED_BYTE, mTextureData.data());
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker     // Perform a draw so the image data is flushed.
254*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker     startGpuTimer();
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     // Do a single iteration, otherwise the cost of redefinition is amortized.
261*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(params.iterationsPerStep, 1u);
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     // Generate mipmaps
264*8975f5c5SAndroid Build Coastguard Worker     glGenerateMipmap(GL_TEXTURE_2D);
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     // Perform a draw just so the texture data is flushed.  With the position attributes not
267*8975f5c5SAndroid Build Coastguard Worker     // set, a constant default value is used, resulting in a very cheap draw.
268*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
269*8975f5c5SAndroid Build Coastguard Worker 
270*8975f5c5SAndroid Build Coastguard Worker     stopGpuTimer();
271*8975f5c5SAndroid Build Coastguard Worker 
272*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
273*8975f5c5SAndroid Build Coastguard Worker }
274*8975f5c5SAndroid Build Coastguard Worker 
D3D11Params(bool webglCompat,bool singleIteration)275*8975f5c5SAndroid Build Coastguard Worker GenerateMipmapParams D3D11Params(bool webglCompat, bool singleIteration)
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapParams params;
278*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::D3D11();
279*8975f5c5SAndroid Build Coastguard Worker     params.majorVersion  = 3;
280*8975f5c5SAndroid Build Coastguard Worker     params.minorVersion  = 0;
281*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
282*8975f5c5SAndroid Build Coastguard Worker     if (singleIteration)
283*8975f5c5SAndroid Build Coastguard Worker     {
284*8975f5c5SAndroid Build Coastguard Worker         params.iterationsPerStep = 1;
285*8975f5c5SAndroid Build Coastguard Worker     }
286*8975f5c5SAndroid Build Coastguard Worker     return params;
287*8975f5c5SAndroid Build Coastguard Worker }
288*8975f5c5SAndroid Build Coastguard Worker 
MetalParams(bool webglCompat,bool singleIteration)289*8975f5c5SAndroid Build Coastguard Worker GenerateMipmapParams MetalParams(bool webglCompat, bool singleIteration)
290*8975f5c5SAndroid Build Coastguard Worker {
291*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapParams params;
292*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::METAL();
293*8975f5c5SAndroid Build Coastguard Worker     params.majorVersion  = 3;
294*8975f5c5SAndroid Build Coastguard Worker     params.minorVersion  = 0;
295*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
296*8975f5c5SAndroid Build Coastguard Worker     if (singleIteration)
297*8975f5c5SAndroid Build Coastguard Worker     {
298*8975f5c5SAndroid Build Coastguard Worker         params.iterationsPerStep = 1;
299*8975f5c5SAndroid Build Coastguard Worker     }
300*8975f5c5SAndroid Build Coastguard Worker     return params;
301*8975f5c5SAndroid Build Coastguard Worker }
302*8975f5c5SAndroid Build Coastguard Worker 
OpenGLOrGLESParams(bool webglCompat,bool singleIteration)303*8975f5c5SAndroid Build Coastguard Worker GenerateMipmapParams OpenGLOrGLESParams(bool webglCompat, bool singleIteration)
304*8975f5c5SAndroid Build Coastguard Worker {
305*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapParams params;
306*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::OPENGL_OR_GLES();
307*8975f5c5SAndroid Build Coastguard Worker     params.majorVersion  = 3;
308*8975f5c5SAndroid Build Coastguard Worker     params.minorVersion  = 0;
309*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
310*8975f5c5SAndroid Build Coastguard Worker     if (singleIteration)
311*8975f5c5SAndroid Build Coastguard Worker     {
312*8975f5c5SAndroid Build Coastguard Worker         params.iterationsPerStep = 1;
313*8975f5c5SAndroid Build Coastguard Worker     }
314*8975f5c5SAndroid Build Coastguard Worker     return params;
315*8975f5c5SAndroid Build Coastguard Worker }
316*8975f5c5SAndroid Build Coastguard Worker 
VulkanParams(bool webglCompat,bool singleIteration,bool emulatedFormat)317*8975f5c5SAndroid Build Coastguard Worker GenerateMipmapParams VulkanParams(bool webglCompat, bool singleIteration, bool emulatedFormat)
318*8975f5c5SAndroid Build Coastguard Worker {
319*8975f5c5SAndroid Build Coastguard Worker     GenerateMipmapParams params;
320*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::VULKAN();
321*8975f5c5SAndroid Build Coastguard Worker     params.majorVersion  = 3;
322*8975f5c5SAndroid Build Coastguard Worker     params.minorVersion  = 0;
323*8975f5c5SAndroid Build Coastguard Worker     params.webgl         = webglCompat;
324*8975f5c5SAndroid Build Coastguard Worker     if (emulatedFormat)
325*8975f5c5SAndroid Build Coastguard Worker     {
326*8975f5c5SAndroid Build Coastguard Worker         params.internalFormat = GL_RGB;
327*8975f5c5SAndroid Build Coastguard Worker     }
328*8975f5c5SAndroid Build Coastguard Worker     if (singleIteration)
329*8975f5c5SAndroid Build Coastguard Worker     {
330*8975f5c5SAndroid Build Coastguard Worker         params.iterationsPerStep = 1;
331*8975f5c5SAndroid Build Coastguard Worker     }
332*8975f5c5SAndroid Build Coastguard Worker     return params;
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker 
335*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
336*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(GenerateMipmapBenchmark,Run)337*8975f5c5SAndroid Build Coastguard Worker TEST_P(GenerateMipmapBenchmark, Run)
338*8975f5c5SAndroid Build Coastguard Worker {
339*8975f5c5SAndroid Build Coastguard Worker     run();
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(GenerateMipmapWithRedefineBenchmark,Run)342*8975f5c5SAndroid Build Coastguard Worker TEST_P(GenerateMipmapWithRedefineBenchmark, Run)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker     run();
345*8975f5c5SAndroid Build Coastguard Worker }
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker using namespace params;
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GenerateMipmapBenchmark,
350*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(false, false),
351*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(true, false),
352*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(false, false),
353*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(true, false),
354*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(false, false),
355*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(true, false),
356*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, false, false),
357*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, false, false),
358*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, false, true),
359*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, false, true));
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GenerateMipmapWithRedefineBenchmark,
362*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(false, true),
363*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(true, true),
364*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(false, true),
365*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(true, true),
366*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(false, true),
367*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(true, true),
368*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, true, false),
369*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, true, false),
370*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(false, true, true),
371*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams(true, true, true));
372