xref: /aosp_15_r20/external/angle/src/tests/perf_tests/TextureSampling.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 // TextureSamplingBenchmark:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for texture sampling. The test generates a texture containing random data
8*8975f5c5SAndroid Build Coastguard Worker //   and then blurs it in a fragment shader using nearest neighbor sampling. The test is
9*8975f5c5SAndroid Build Coastguard Worker //   specifically designed to test overhead of GLSL's builtin texture*() functions that may result
10*8975f5c5SAndroid Build Coastguard Worker //   from how ANGLE translates them on each backend.
11*8975f5c5SAndroid Build Coastguard Worker //
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
16*8975f5c5SAndroid Build Coastguard Worker #include <random>
17*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker namespace
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 4;
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker struct TextureSamplingParams final : public RenderTestParams
28*8975f5c5SAndroid Build Coastguard Worker {
TextureSamplingParams__anon7344e4810111::TextureSamplingParams29*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingParams()
30*8975f5c5SAndroid Build Coastguard Worker     {
31*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = kIterationsPerStep;
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker         // Common default params
34*8975f5c5SAndroid Build Coastguard Worker         majorVersion = 3;
35*8975f5c5SAndroid Build Coastguard Worker         minorVersion = 0;
36*8975f5c5SAndroid Build Coastguard Worker         windowWidth  = 720;
37*8975f5c5SAndroid Build Coastguard Worker         windowHeight = 720;
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker         numSamplers = 2;
40*8975f5c5SAndroid Build Coastguard Worker         textureSize = 32;
41*8975f5c5SAndroid Build Coastguard Worker         kernelSize  = 3;
42*8975f5c5SAndroid Build Coastguard Worker     }
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override;
45*8975f5c5SAndroid Build Coastguard Worker     unsigned int numSamplers;
46*8975f5c5SAndroid Build Coastguard Worker     unsigned int textureSize;
47*8975f5c5SAndroid Build Coastguard Worker     unsigned int kernelSize;
48*8975f5c5SAndroid Build Coastguard Worker };
49*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const TextureSamplingParams & params)50*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const TextureSamplingParams &params)
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker     os << params.backendAndStory().substr(1);
53*8975f5c5SAndroid Build Coastguard Worker     return os;
54*8975f5c5SAndroid Build Coastguard Worker }
55*8975f5c5SAndroid Build Coastguard Worker 
story() const56*8975f5c5SAndroid Build Coastguard Worker std::string TextureSamplingParams::story() const
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     strstr << RenderTestParams::story() << "_" << numSamplers << "samplers";
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker class TextureSamplingBenchmark : public ANGLERenderTest,
66*8975f5c5SAndroid Build Coastguard Worker                                  public ::testing::WithParamInterface<TextureSamplingParams>
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker   public:
69*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingBenchmark();
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
72*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
73*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker   protected:
76*8975f5c5SAndroid Build Coastguard Worker     void initShaders();
77*8975f5c5SAndroid Build Coastguard Worker     void initVertexBuffer();
78*8975f5c5SAndroid Build Coastguard Worker     void initTextures();
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram;
81*8975f5c5SAndroid Build Coastguard Worker     GLuint mBuffer;
82*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> mTextures;
83*8975f5c5SAndroid Build Coastguard Worker };
84*8975f5c5SAndroid Build Coastguard Worker 
TextureSamplingBenchmark()85*8975f5c5SAndroid Build Coastguard Worker TextureSamplingBenchmark::TextureSamplingBenchmark()
86*8975f5c5SAndroid Build Coastguard Worker     : ANGLERenderTest("TextureSampling", GetParam()), mProgram(0u), mBuffer(0u)
87*8975f5c5SAndroid Build Coastguard Worker {}
88*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()89*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::initializeBenchmark()
90*8975f5c5SAndroid Build Coastguard Worker {
91*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Verify "numSamplers" is within MAX_TEXTURE_IMAGE_UNITS limit
94*8975f5c5SAndroid Build Coastguard Worker     GLint maxTextureImageUnits;
95*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureImageUnits);
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     if (params.numSamplers > static_cast<unsigned int>(maxTextureImageUnits))
98*8975f5c5SAndroid Build Coastguard Worker     {
99*8975f5c5SAndroid Build Coastguard Worker         FAIL() << "Sampler count (" << params.numSamplers << ")"
100*8975f5c5SAndroid Build Coastguard Worker                << " exceeds maximum texture count: " << maxTextureImageUnits << std::endl;
101*8975f5c5SAndroid Build Coastguard Worker     }
102*8975f5c5SAndroid Build Coastguard Worker     initShaders();
103*8975f5c5SAndroid Build Coastguard Worker     initVertexBuffer();
104*8975f5c5SAndroid Build Coastguard Worker     initTextures();
105*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
106*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
initShaders()111*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::initShaders()
112*8975f5c5SAndroid Build Coastguard Worker {
113*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     std::stringstream vstrstr;
116*8975f5c5SAndroid Build Coastguard Worker     vstrstr << "attribute vec2 aPosition;\n"
117*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 vTextureCoordinates;\n"
118*8975f5c5SAndroid Build Coastguard Worker                "void main()\n"
119*8975f5c5SAndroid Build Coastguard Worker                "{\n"
120*8975f5c5SAndroid Build Coastguard Worker                "    vTextureCoordinates = (aPosition + vec2(1.0)) * 0.5;\n"
121*8975f5c5SAndroid Build Coastguard Worker                "    gl_Position = vec4(aPosition, 0, 1.0);\n"
122*8975f5c5SAndroid Build Coastguard Worker                "}";
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     std::stringstream fstrstr;
125*8975f5c5SAndroid Build Coastguard Worker     fstrstr << "precision mediump float;\n"
126*8975f5c5SAndroid Build Coastguard Worker                "varying vec2 vTextureCoordinates;\n";
127*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int count = 0; count < params.numSamplers; count++)
128*8975f5c5SAndroid Build Coastguard Worker     {
129*8975f5c5SAndroid Build Coastguard Worker         fstrstr << "uniform sampler2D uSampler" << count << ";\n";
130*8975f5c5SAndroid Build Coastguard Worker     }
131*8975f5c5SAndroid Build Coastguard Worker     fstrstr << "void main()\n"
132*8975f5c5SAndroid Build Coastguard Worker                "{\n"
133*8975f5c5SAndroid Build Coastguard Worker                "    const float inverseTextureSize = 1.0 / "
134*8975f5c5SAndroid Build Coastguard Worker             << params.textureSize
135*8975f5c5SAndroid Build Coastguard Worker             << ".0;\n"
136*8975f5c5SAndroid Build Coastguard Worker                "    vec4 colorOut = vec4(0.0, 0.0, 0.0, 1.0);\n";
137*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int count = 0; count < params.numSamplers; count++)
138*8975f5c5SAndroid Build Coastguard Worker     {
139*8975f5c5SAndroid Build Coastguard Worker         fstrstr << "    for (int x = 0; x < " << params.kernelSize
140*8975f5c5SAndroid Build Coastguard Worker                 << "; ++x)\n"
141*8975f5c5SAndroid Build Coastguard Worker                    "    {\n"
142*8975f5c5SAndroid Build Coastguard Worker                    "        for (int y = 0; y < "
143*8975f5c5SAndroid Build Coastguard Worker                 << params.kernelSize
144*8975f5c5SAndroid Build Coastguard Worker                 << "; ++y)\n"
145*8975f5c5SAndroid Build Coastguard Worker                    "        {\n"
146*8975f5c5SAndroid Build Coastguard Worker                    "            colorOut += texture2D(uSampler"
147*8975f5c5SAndroid Build Coastguard Worker                 << count
148*8975f5c5SAndroid Build Coastguard Worker                 << ", vTextureCoordinates + vec2(x, y) * inverseTextureSize) * 0.1;\n"
149*8975f5c5SAndroid Build Coastguard Worker                    "        }\n"
150*8975f5c5SAndroid Build Coastguard Worker                    "    }\n";
151*8975f5c5SAndroid Build Coastguard Worker     }
152*8975f5c5SAndroid Build Coastguard Worker     fstrstr << "    gl_FragColor = colorOut;\n"
153*8975f5c5SAndroid Build Coastguard Worker                "}\n";
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(vstrstr.str().c_str(), fstrstr.str().c_str());
156*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     // Use the program object
159*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker 
initVertexBuffer()162*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::initVertexBuffer()
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     std::vector<float> vertexPositions(12);
165*8975f5c5SAndroid Build Coastguard Worker     {
166*8975f5c5SAndroid Build Coastguard Worker         // Bottom left triangle
167*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[0] = -1.0f;
168*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[1] = -1.0f;
169*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[2] = 1.0f;
170*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[3] = -1.0f;
171*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[4] = -1.0f;
172*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[5] = 1.0f;
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker         // Top right triangle
175*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[6]  = -1.0f;
176*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[7]  = 1.0f;
177*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[8]  = 1.0f;
178*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[9]  = -1.0f;
179*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[10] = 1.0f;
180*8975f5c5SAndroid Build Coastguard Worker         vertexPositions[11] = 1.0f;
181*8975f5c5SAndroid Build Coastguard Worker     }
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker     glGenBuffers(1, &mBuffer);
184*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mBuffer);
185*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(float), &vertexPositions[0],
186*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
187*8975f5c5SAndroid Build Coastguard Worker 
188*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(mProgram, "aPosition");
189*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
192*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
193*8975f5c5SAndroid Build Coastguard Worker }
194*8975f5c5SAndroid Build Coastguard Worker 
initTextures()195*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::initTextures()
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker     unsigned int dataSize = params.textureSize * params.textureSize;
200*8975f5c5SAndroid Build Coastguard Worker     std::vector<unsigned int> randomTextureData;
201*8975f5c5SAndroid Build Coastguard Worker     randomTextureData.resize(dataSize);
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker     unsigned int pseudoRandom = 1u;
204*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < dataSize; ++i)
205*8975f5c5SAndroid Build Coastguard Worker     {
206*8975f5c5SAndroid Build Coastguard Worker         pseudoRandom         = pseudoRandom * 1664525u + 1013904223u;
207*8975f5c5SAndroid Build Coastguard Worker         randomTextureData[i] = pseudoRandom;
208*8975f5c5SAndroid Build Coastguard Worker     }
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker     mTextures.resize(params.numSamplers);
211*8975f5c5SAndroid Build Coastguard Worker     glGenTextures(params.numSamplers, mTextures.data());
212*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < params.numSamplers; ++i)
213*8975f5c5SAndroid Build Coastguard Worker     {
214*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0 + i);
215*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[i]);
216*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
217*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
218*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
219*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
220*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, params.textureSize, params.textureSize, 0, GL_RGBA,
221*8975f5c5SAndroid Build Coastguard Worker                      GL_UNSIGNED_BYTE, randomTextureData.data());
222*8975f5c5SAndroid Build Coastguard Worker     }
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int count = 0; count < params.numSamplers; count++)
225*8975f5c5SAndroid Build Coastguard Worker     {
226*8975f5c5SAndroid Build Coastguard Worker         std::stringstream samplerstrstr;
227*8975f5c5SAndroid Build Coastguard Worker         samplerstrstr << "uSampler" << count;
228*8975f5c5SAndroid Build Coastguard Worker         GLint samplerLocation = glGetUniformLocation(mProgram, samplerstrstr.str().c_str());
229*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, samplerLocation);
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(samplerLocation, count);
232*8975f5c5SAndroid Build Coastguard Worker     }
233*8975f5c5SAndroid Build Coastguard Worker }
234*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()235*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::destroyBenchmark()
236*8975f5c5SAndroid Build Coastguard Worker {
237*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker     glDeleteProgram(mProgram);
240*8975f5c5SAndroid Build Coastguard Worker     glDeleteBuffers(1, &mBuffer);
241*8975f5c5SAndroid Build Coastguard Worker     if (!mTextures.empty())
242*8975f5c5SAndroid Build Coastguard Worker     {
243*8975f5c5SAndroid Build Coastguard Worker         glDeleteTextures(params.numSamplers, mTextures.data());
244*8975f5c5SAndroid Build Coastguard Worker     }
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()247*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingBenchmark::drawBenchmark()
248*8975f5c5SAndroid Build Coastguard Worker {
249*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int it = 0; it < params.iterationsPerStep; ++it)
254*8975f5c5SAndroid Build Coastguard Worker     {
255*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
256*8975f5c5SAndroid Build Coastguard Worker     }
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
259*8975f5c5SAndroid Build Coastguard Worker }
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker // Identical to TextureSamplingBenchmark, but enables and then disables
262*8975f5c5SAndroid Build Coastguard Worker // EXT_texture_format_sRGB_override during initialization. This should force the internal texture
263*8975f5c5SAndroid Build Coastguard Worker // representation to use VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, which is expected to carry a
264*8975f5c5SAndroid Build Coastguard Worker // performance penalty. This penalty can be quantified by comparing the results of this test with
265*8975f5c5SAndroid Build Coastguard Worker // the results from TextureSamplingBenchmark
266*8975f5c5SAndroid Build Coastguard Worker class TextureSamplingMutableFormatBenchmark : public TextureSamplingBenchmark
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker   public:
269*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker   protected:
272*8975f5c5SAndroid Build Coastguard Worker     void initTextures();
273*8975f5c5SAndroid Build Coastguard Worker };
274*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()275*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingMutableFormatBenchmark::initializeBenchmark()
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker     if (IsGLExtensionEnabled("GL_EXT_texture_format_sRGB_override"))
278*8975f5c5SAndroid Build Coastguard Worker     {
279*8975f5c5SAndroid Build Coastguard Worker         TextureSamplingBenchmark::initializeBenchmark();
280*8975f5c5SAndroid Build Coastguard Worker         initTextures();
281*8975f5c5SAndroid Build Coastguard Worker     }
282*8975f5c5SAndroid Build Coastguard Worker }
283*8975f5c5SAndroid Build Coastguard Worker 
initTextures()284*8975f5c5SAndroid Build Coastguard Worker void TextureSamplingMutableFormatBenchmark::initTextures()
285*8975f5c5SAndroid Build Coastguard Worker {
286*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingBenchmark::initTextures();
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < mTextures.size(); ++i)
289*8975f5c5SAndroid Build Coastguard Worker     {
290*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0 + i);
291*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[i]);
292*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT, GL_SRGB);
293*8975f5c5SAndroid Build Coastguard Worker     }
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker     // Force a state update
296*8975f5c5SAndroid Build Coastguard Worker     drawBenchmark();
297*8975f5c5SAndroid Build Coastguard Worker 
298*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < mTextures.size(); ++i)
299*8975f5c5SAndroid Build Coastguard Worker     {
300*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0 + i);
301*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[i]);
302*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT, GL_NONE);
303*8975f5c5SAndroid Build Coastguard Worker     }
304*8975f5c5SAndroid Build Coastguard Worker }
305*8975f5c5SAndroid Build Coastguard Worker 
D3D11Params()306*8975f5c5SAndroid Build Coastguard Worker TextureSamplingParams D3D11Params()
307*8975f5c5SAndroid Build Coastguard Worker {
308*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingParams params;
309*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::D3D11();
310*8975f5c5SAndroid Build Coastguard Worker     return params;
311*8975f5c5SAndroid Build Coastguard Worker }
312*8975f5c5SAndroid Build Coastguard Worker 
MetalParams()313*8975f5c5SAndroid Build Coastguard Worker TextureSamplingParams MetalParams()
314*8975f5c5SAndroid Build Coastguard Worker {
315*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingParams params;
316*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::METAL();
317*8975f5c5SAndroid Build Coastguard Worker     return params;
318*8975f5c5SAndroid Build Coastguard Worker }
319*8975f5c5SAndroid Build Coastguard Worker 
OpenGLOrGLESParams()320*8975f5c5SAndroid Build Coastguard Worker TextureSamplingParams OpenGLOrGLESParams()
321*8975f5c5SAndroid Build Coastguard Worker {
322*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingParams params;
323*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::OPENGL_OR_GLES();
324*8975f5c5SAndroid Build Coastguard Worker     return params;
325*8975f5c5SAndroid Build Coastguard Worker }
326*8975f5c5SAndroid Build Coastguard Worker 
VulkanParams()327*8975f5c5SAndroid Build Coastguard Worker TextureSamplingParams VulkanParams()
328*8975f5c5SAndroid Build Coastguard Worker {
329*8975f5c5SAndroid Build Coastguard Worker     TextureSamplingParams params;
330*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::VULKAN();
331*8975f5c5SAndroid Build Coastguard Worker     return params;
332*8975f5c5SAndroid Build Coastguard Worker }
333*8975f5c5SAndroid Build Coastguard Worker 
334*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
335*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(TextureSamplingBenchmark,Run)336*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureSamplingBenchmark, Run)
337*8975f5c5SAndroid Build Coastguard Worker {
338*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_sRGB_override"));
339*8975f5c5SAndroid Build Coastguard Worker     run();
340*8975f5c5SAndroid Build Coastguard Worker }
341*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(TextureSamplingMutableFormatBenchmark,Run)342*8975f5c5SAndroid Build Coastguard Worker TEST_P(TextureSamplingMutableFormatBenchmark, Run)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_sRGB_override"));
345*8975f5c5SAndroid Build Coastguard Worker     run();
346*8975f5c5SAndroid Build Coastguard Worker }
347*8975f5c5SAndroid Build Coastguard Worker 
348*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(TextureSamplingBenchmark,
349*8975f5c5SAndroid Build Coastguard Worker                        D3D11Params(),
350*8975f5c5SAndroid Build Coastguard Worker                        MetalParams(),
351*8975f5c5SAndroid Build Coastguard Worker                        OpenGLOrGLESParams(),
352*8975f5c5SAndroid Build Coastguard Worker                        VulkanParams());
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TextureSamplingMutableFormatBenchmark);
355*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(TextureSamplingMutableFormatBenchmark, VulkanParams());
356