xref: /aosp_15_r20/external/angle/src/tests/perf_tests/CompilerPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2018 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 // CompilerPerfTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for the shader translator. The test initializes the compiler once and then
8*8975f5c5SAndroid Build Coastguard Worker //   compiles the same shader repeatedly. There are different variations of the tests using
9*8975f5c5SAndroid Build Coastguard Worker //   different shaders.
10*8975f5c5SAndroid Build Coastguard Worker //
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "GLSLANG/ShaderLang.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Compiler.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/InitializeGlobals.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/PoolAlloc.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker const char *kSimpleESSL100FragSource = R"(
23*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
24*8975f5c5SAndroid Build Coastguard Worker void main()
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0, 1, 0, 1);
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker )";
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker const char *kSimpleESSL100Id = "SimpleESSL100";
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker const char *kSimpleESSL300FragSource = R"(#version 300 es
33*8975f5c5SAndroid Build Coastguard Worker precision highp float;
34*8975f5c5SAndroid Build Coastguard Worker out vec4 outColor;
35*8975f5c5SAndroid Build Coastguard Worker void main()
36*8975f5c5SAndroid Build Coastguard Worker {
37*8975f5c5SAndroid Build Coastguard Worker     outColor = vec4(0, 1, 0, 1);
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker )";
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker const char *kSimpleESSL300Id = "SimpleESSL300";
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker const char *kRealWorldESSL100FragSource = R"(precision highp float;
44*8975f5c5SAndroid Build Coastguard Worker precision highp sampler2D;
45*8975f5c5SAndroid Build Coastguard Worker precision highp int;
46*8975f5c5SAndroid Build Coastguard Worker varying vec2 vPixelCoords; // in pixels
47*8975f5c5SAndroid Build Coastguard Worker uniform int uCircleCount;
48*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D uCircleParameters;
49*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D uBrushTex;
50*8975f5c5SAndroid Build Coastguard Worker void main(void)
51*8975f5c5SAndroid Build Coastguard Worker {
52*8975f5c5SAndroid Build Coastguard Worker     float destAlpha = 0.0;
53*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 32; ++i)
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         vec4 parameterColor = texture2D(uCircleParameters,vec2(0.25, (float(i) + 0.5) / 32.0));
56*8975f5c5SAndroid Build Coastguard Worker         vec2 center = parameterColor.xy;
57*8975f5c5SAndroid Build Coastguard Worker         float circleRadius = parameterColor.z;
58*8975f5c5SAndroid Build Coastguard Worker         float circleFlowAlpha = parameterColor.w;
59*8975f5c5SAndroid Build Coastguard Worker         vec4 parameterColor2 = texture2D(uCircleParameters,vec2(0.75, (float(i) + 0.5) / 32.0));
60*8975f5c5SAndroid Build Coastguard Worker         float circleRotation = parameterColor2.x;
61*8975f5c5SAndroid Build Coastguard Worker         vec2 centerDiff = vPixelCoords - center;
62*8975f5c5SAndroid Build Coastguard Worker         float radius = max(circleRadius, 0.5);
63*8975f5c5SAndroid Build Coastguard Worker         float flowAlpha = (circleRadius < 0.5) ? circleFlowAlpha * circleRadius * circleRadius * 4.0: circleFlowAlpha;
64*8975f5c5SAndroid Build Coastguard Worker         float antialiasMult = clamp((radius + 1.0 - length(centerDiff)) * 0.5, 0.0, 1.0);
65*8975f5c5SAndroid Build Coastguard Worker         mat2 texRotation = mat2(cos(circleRotation), -sin(circleRotation), sin(circleRotation), cos(circleRotation));
66*8975f5c5SAndroid Build Coastguard Worker         vec2 texCoords = texRotation * centerDiff / radius * 0.5 + 0.5;
67*8975f5c5SAndroid Build Coastguard Worker         float texValue = texture2D(uBrushTex, texCoords).r;
68*8975f5c5SAndroid Build Coastguard Worker         float circleAlpha = flowAlpha * antialiasMult * texValue;
69*8975f5c5SAndroid Build Coastguard Worker         if (i < uCircleCount)
70*8975f5c5SAndroid Build Coastguard Worker         {
71*8975f5c5SAndroid Build Coastguard Worker             destAlpha = clamp(circleAlpha + (1.0 - circleAlpha) * destAlpha, 0.0, 1.0);
72*8975f5c5SAndroid Build Coastguard Worker         }
73*8975f5c5SAndroid Build Coastguard Worker     }
74*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0.0, 0.0, 0.0, destAlpha);
75*8975f5c5SAndroid Build Coastguard Worker })";
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker const char *kRealWorldESSL100Id = "RealWorldESSL100";
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker // This shader is intended to trigger many AST transformations, particularly on the HLSL backend.
80*8975f5c5SAndroid Build Coastguard Worker const char *kTrickyESSL300FragSource = R"(#version 300 es
81*8975f5c5SAndroid Build Coastguard Worker precision highp float;
82*8975f5c5SAndroid Build Coastguard Worker precision highp sampler2D;
83*8975f5c5SAndroid Build Coastguard Worker precision highp isampler2D;
84*8975f5c5SAndroid Build Coastguard Worker precision highp int;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker float globalF;
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker uniform ivec4 uivec;
89*8975f5c5SAndroid Build Coastguard Worker uniform int ui;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker struct SS
92*8975f5c5SAndroid Build Coastguard Worker {
93*8975f5c5SAndroid Build Coastguard Worker     int iField;
94*8975f5c5SAndroid Build Coastguard Worker     float fField;
95*8975f5c5SAndroid Build Coastguard Worker     vec2 f2Field;
96*8975f5c5SAndroid Build Coastguard Worker     sampler2D sField;
97*8975f5c5SAndroid Build Coastguard Worker     isampler2D isField;
98*8975f5c5SAndroid Build Coastguard Worker };
99*8975f5c5SAndroid Build Coastguard Worker uniform SS us;
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker out vec4 my_FragColor;
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker float[3] sideEffectArray()
104*8975f5c5SAndroid Build Coastguard Worker {
105*8975f5c5SAndroid Build Coastguard Worker     globalF += 1.0;
106*8975f5c5SAndroid Build Coastguard Worker     return float[3](globalF, globalF * 2.0, globalF * 3.0);
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker // This struct is unused and can be pruned.
110*8975f5c5SAndroid Build Coastguard Worker struct SUnused
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker     vec2 fField;
113*8975f5c5SAndroid Build Coastguard Worker };
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker void main()
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker     struct S2
118*8975f5c5SAndroid Build Coastguard Worker     {
119*8975f5c5SAndroid Build Coastguard Worker         float fField;
120*8975f5c5SAndroid Build Coastguard Worker     } s2;
121*8975f5c5SAndroid Build Coastguard Worker     vec4 foo = vec4(ui);
122*8975f5c5SAndroid Build Coastguard Worker     mat4 fooM = mat4(foo.x);
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     // Some unused variables that can be pruned.
125*8975f5c5SAndroid Build Coastguard Worker     float fUnused, fUnused2;
126*8975f5c5SAndroid Build Coastguard Worker     ivec4 iUnused, iUnused2;
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     globalF = us.fField;
129*8975f5c5SAndroid Build Coastguard Worker     s2.fField = us.fField;
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker     float[3] fa = sideEffectArray();
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     globalF -= us.fField;
134*8975f5c5SAndroid Build Coastguard Worker     if (fa == sideEffectArray())
135*8975f5c5SAndroid Build Coastguard Worker     {
136*8975f5c5SAndroid Build Coastguard Worker         globalF += us.fField * sin(2.0);
137*8975f5c5SAndroid Build Coastguard Worker     }
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker     // Switch with fall-through.
140*8975f5c5SAndroid Build Coastguard Worker     switch (ui)
141*8975f5c5SAndroid Build Coastguard Worker     {
142*8975f5c5SAndroid Build Coastguard Worker       case 0:
143*8975f5c5SAndroid Build Coastguard Worker         // Sequence operator and matrix and vector dynamic indexing.
144*8975f5c5SAndroid Build Coastguard Worker         (globalF += 1.0, fooM[ui][ui] += fooM[ui - 1][uivec[ui] + 1]);
145*8975f5c5SAndroid Build Coastguard Worker       case 1:
146*8975f5c5SAndroid Build Coastguard Worker         // Built-in emulation.
147*8975f5c5SAndroid Build Coastguard Worker         foo[3] = tanh(foo[1]);
148*8975f5c5SAndroid Build Coastguard Worker       default:
149*8975f5c5SAndroid Build Coastguard Worker         // Sequence operator and length of an array expression with side effects.
150*8975f5c5SAndroid Build Coastguard Worker         foo[2] += (globalF -= 1.0, float((sideEffectArray()).length() * 2));
151*8975f5c5SAndroid Build Coastguard Worker     }
152*8975f5c5SAndroid Build Coastguard Worker     int i = 0;
153*8975f5c5SAndroid Build Coastguard Worker     do
154*8975f5c5SAndroid Build Coastguard Worker     {
155*8975f5c5SAndroid Build Coastguard Worker         s2.fField = us.fField * us.f2Field.x;
156*8975f5c5SAndroid Build Coastguard Worker         // Sequence operator and short-circuiting operator with side effects on the right hand side.
157*8975f5c5SAndroid Build Coastguard Worker     } while ((++i, i < int(us.fField) && ++i <= ui || ++i < ui * 2 - 3));
158*8975f5c5SAndroid Build Coastguard Worker     // Samplers in structures and integer texture sampling.
159*8975f5c5SAndroid Build Coastguard Worker     foo += texture(us.sField, us.f2Field) + intBitsToFloat(texture(us.isField, us.f2Field + 4.0));
160*8975f5c5SAndroid Build Coastguard Worker     my_FragColor = foo * s2.fField * globalF + fooM[ui];
161*8975f5c5SAndroid Build Coastguard Worker })";
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker const char *kTrickyESSL300Id = "TrickyESSL300";
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker constexpr int kNumIterationsPerStep = 4;
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker struct CompilerParameters
168*8975f5c5SAndroid Build Coastguard Worker {
CompilerParameters__anonc1b4337d0111::CompilerParameters169*8975f5c5SAndroid Build Coastguard Worker     CompilerParameters() { output = SH_HLSL_4_1_OUTPUT; }
170*8975f5c5SAndroid Build Coastguard Worker 
CompilerParameters__anonc1b4337d0111::CompilerParameters171*8975f5c5SAndroid Build Coastguard Worker     CompilerParameters(ShShaderOutput output) : output(output) {}
172*8975f5c5SAndroid Build Coastguard Worker 
str__anonc1b4337d0111::CompilerParameters173*8975f5c5SAndroid Build Coastguard Worker     const char *str() const
174*8975f5c5SAndroid Build Coastguard Worker     {
175*8975f5c5SAndroid Build Coastguard Worker         switch (output)
176*8975f5c5SAndroid Build Coastguard Worker         {
177*8975f5c5SAndroid Build Coastguard Worker             case SH_HLSL_4_1_OUTPUT:
178*8975f5c5SAndroid Build Coastguard Worker                 return "HLSL_4_1";
179*8975f5c5SAndroid Build Coastguard Worker             case SH_GLSL_450_CORE_OUTPUT:
180*8975f5c5SAndroid Build Coastguard Worker                 return "GLSL_4_50";
181*8975f5c5SAndroid Build Coastguard Worker             case SH_ESSL_OUTPUT:
182*8975f5c5SAndroid Build Coastguard Worker                 return "ESSL";
183*8975f5c5SAndroid Build Coastguard Worker             default:
184*8975f5c5SAndroid Build Coastguard Worker                 UNREACHABLE();
185*8975f5c5SAndroid Build Coastguard Worker                 return "unk";
186*8975f5c5SAndroid Build Coastguard Worker         }
187*8975f5c5SAndroid Build Coastguard Worker     }
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker     ShShaderOutput output;
190*8975f5c5SAndroid Build Coastguard Worker };
191*8975f5c5SAndroid Build Coastguard Worker 
IsPlatformAvailable(const CompilerParameters & param)192*8975f5c5SAndroid Build Coastguard Worker bool IsPlatformAvailable(const CompilerParameters &param)
193*8975f5c5SAndroid Build Coastguard Worker {
194*8975f5c5SAndroid Build Coastguard Worker     switch (param.output)
195*8975f5c5SAndroid Build Coastguard Worker     {
196*8975f5c5SAndroid Build Coastguard Worker         case SH_HLSL_4_1_OUTPUT:
197*8975f5c5SAndroid Build Coastguard Worker         case SH_HLSL_3_0_OUTPUT:
198*8975f5c5SAndroid Build Coastguard Worker         {
199*8975f5c5SAndroid Build Coastguard Worker             angle::PoolAllocator allocator;
200*8975f5c5SAndroid Build Coastguard Worker             InitializePoolIndex();
201*8975f5c5SAndroid Build Coastguard Worker             allocator.push();
202*8975f5c5SAndroid Build Coastguard Worker             SetGlobalPoolAllocator(&allocator);
203*8975f5c5SAndroid Build Coastguard Worker             ShHandle translator =
204*8975f5c5SAndroid Build Coastguard Worker                 sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL2_SPEC, param.output);
205*8975f5c5SAndroid Build Coastguard Worker             bool success = translator != nullptr;
206*8975f5c5SAndroid Build Coastguard Worker             SetGlobalPoolAllocator(nullptr);
207*8975f5c5SAndroid Build Coastguard Worker             allocator.pop();
208*8975f5c5SAndroid Build Coastguard Worker             FreePoolIndex();
209*8975f5c5SAndroid Build Coastguard Worker             if (!success)
210*8975f5c5SAndroid Build Coastguard Worker             {
211*8975f5c5SAndroid Build Coastguard Worker                 return false;
212*8975f5c5SAndroid Build Coastguard Worker             }
213*8975f5c5SAndroid Build Coastguard Worker             break;
214*8975f5c5SAndroid Build Coastguard Worker         }
215*8975f5c5SAndroid Build Coastguard Worker         default:
216*8975f5c5SAndroid Build Coastguard Worker             break;
217*8975f5c5SAndroid Build Coastguard Worker     }
218*8975f5c5SAndroid Build Coastguard Worker     return true;
219*8975f5c5SAndroid Build Coastguard Worker }
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker struct CompilerPerfParameters final : public CompilerParameters
222*8975f5c5SAndroid Build Coastguard Worker {
CompilerPerfParameters__anonc1b4337d0111::CompilerPerfParameters223*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(ShShaderOutput output,
224*8975f5c5SAndroid Build Coastguard Worker                            const char *shaderSource,
225*8975f5c5SAndroid Build Coastguard Worker                            const char *shaderSourceId)
226*8975f5c5SAndroid Build Coastguard Worker         : CompilerParameters(output), shaderSource(shaderSource)
227*8975f5c5SAndroid Build Coastguard Worker     {
228*8975f5c5SAndroid Build Coastguard Worker         testId = shaderSourceId;
229*8975f5c5SAndroid Build Coastguard Worker         testId += "_";
230*8975f5c5SAndroid Build Coastguard Worker         testId += CompilerParameters::str();
231*8975f5c5SAndroid Build Coastguard Worker     }
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     const char *shaderSource;
234*8975f5c5SAndroid Build Coastguard Worker     std::string testId;
235*8975f5c5SAndroid Build Coastguard Worker };
236*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & stream,const CompilerPerfParameters & p)237*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &stream, const CompilerPerfParameters &p)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     stream << p.testId;
240*8975f5c5SAndroid Build Coastguard Worker     return stream;
241*8975f5c5SAndroid Build Coastguard Worker }
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker class CompilerPerfTest : public ANGLEPerfTest,
244*8975f5c5SAndroid Build Coastguard Worker                          public ::testing::WithParamInterface<CompilerPerfParameters>
245*8975f5c5SAndroid Build Coastguard Worker {
246*8975f5c5SAndroid Build Coastguard Worker   public:
247*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfTest();
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker     void step() override;
250*8975f5c5SAndroid Build Coastguard Worker 
251*8975f5c5SAndroid Build Coastguard Worker     void SetUp() override;
252*8975f5c5SAndroid Build Coastguard Worker     void TearDown() override;
253*8975f5c5SAndroid Build Coastguard Worker 
254*8975f5c5SAndroid Build Coastguard Worker   protected:
setTestShader(const char * str)255*8975f5c5SAndroid Build Coastguard Worker     void setTestShader(const char *str) { mTestShader = str; }
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker   private:
258*8975f5c5SAndroid Build Coastguard Worker     const char *mTestShader;
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     ShBuiltInResources mResources;
261*8975f5c5SAndroid Build Coastguard Worker     angle::PoolAllocator mAllocator;
262*8975f5c5SAndroid Build Coastguard Worker     sh::TCompiler *mTranslator;
263*8975f5c5SAndroid Build Coastguard Worker };
264*8975f5c5SAndroid Build Coastguard Worker 
CompilerPerfTest()265*8975f5c5SAndroid Build Coastguard Worker CompilerPerfTest::CompilerPerfTest()
266*8975f5c5SAndroid Build Coastguard Worker     : ANGLEPerfTest("CompilerPerf", "", GetParam().testId, kNumIterationsPerStep)
267*8975f5c5SAndroid Build Coastguard Worker {}
268*8975f5c5SAndroid Build Coastguard Worker 
SetUp()269*8975f5c5SAndroid Build Coastguard Worker void CompilerPerfTest::SetUp()
270*8975f5c5SAndroid Build Coastguard Worker {
271*8975f5c5SAndroid Build Coastguard Worker     ANGLEPerfTest::SetUp();
272*8975f5c5SAndroid Build Coastguard Worker 
273*8975f5c5SAndroid Build Coastguard Worker     InitializePoolIndex();
274*8975f5c5SAndroid Build Coastguard Worker     mAllocator.push();
275*8975f5c5SAndroid Build Coastguard Worker     SetGlobalPoolAllocator(&mAllocator);
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
278*8975f5c5SAndroid Build Coastguard Worker 
279*8975f5c5SAndroid Build Coastguard Worker     mTranslator = sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL2_SPEC, params.output);
280*8975f5c5SAndroid Build Coastguard Worker     sh::InitBuiltInResources(&mResources);
281*8975f5c5SAndroid Build Coastguard Worker     mResources.FragmentPrecisionHigh = true;
282*8975f5c5SAndroid Build Coastguard Worker     if (!mTranslator->Init(mResources))
283*8975f5c5SAndroid Build Coastguard Worker     {
284*8975f5c5SAndroid Build Coastguard Worker         SafeDelete(mTranslator);
285*8975f5c5SAndroid Build Coastguard Worker     }
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker     setTestShader(params.shaderSource);
288*8975f5c5SAndroid Build Coastguard Worker }
289*8975f5c5SAndroid Build Coastguard Worker 
TearDown()290*8975f5c5SAndroid Build Coastguard Worker void CompilerPerfTest::TearDown()
291*8975f5c5SAndroid Build Coastguard Worker {
292*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mTranslator);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     SetGlobalPoolAllocator(nullptr);
295*8975f5c5SAndroid Build Coastguard Worker     mAllocator.pop();
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     FreePoolIndex();
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     ANGLEPerfTest::TearDown();
300*8975f5c5SAndroid Build Coastguard Worker }
301*8975f5c5SAndroid Build Coastguard Worker 
step()302*8975f5c5SAndroid Build Coastguard Worker void CompilerPerfTest::step()
303*8975f5c5SAndroid Build Coastguard Worker {
304*8975f5c5SAndroid Build Coastguard Worker     const char *shaderStrings[] = {mTestShader};
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     ShCompileOptions compileOptions              = {};
307*8975f5c5SAndroid Build Coastguard Worker     compileOptions.objectCode                    = true;
308*8975f5c5SAndroid Build Coastguard Worker     compileOptions.initializeUninitializedLocals = true;
309*8975f5c5SAndroid Build Coastguard Worker     compileOptions.initOutputVariables           = true;
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker #if !defined(NDEBUG)
312*8975f5c5SAndroid Build Coastguard Worker     // Make sure that compilation succeeds and print the info log if it doesn't in debug mode.
313*8975f5c5SAndroid Build Coastguard Worker     if (!mTranslator->compile(shaderStrings, 1, compileOptions))
314*8975f5c5SAndroid Build Coastguard Worker     {
315*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Compiling perf test shader failed with log:\n"
316*8975f5c5SAndroid Build Coastguard Worker                   << mTranslator->getInfoSink().info.c_str();
317*8975f5c5SAndroid Build Coastguard Worker     }
318*8975f5c5SAndroid Build Coastguard Worker #endif
319*8975f5c5SAndroid Build Coastguard Worker 
320*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int iteration = 0; iteration < kNumIterationsPerStep; ++iteration)
321*8975f5c5SAndroid Build Coastguard Worker     {
322*8975f5c5SAndroid Build Coastguard Worker         mTranslator->compile(shaderStrings, 1, compileOptions);
323*8975f5c5SAndroid Build Coastguard Worker     }
324*8975f5c5SAndroid Build Coastguard Worker }
325*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(CompilerPerfTest,Run)326*8975f5c5SAndroid Build Coastguard Worker TEST_P(CompilerPerfTest, Run)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker     run();
329*8975f5c5SAndroid Build Coastguard Worker }
330*8975f5c5SAndroid Build Coastguard Worker 
331*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(
332*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfTest,
333*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_HLSL_4_1_OUTPUT, kSimpleESSL100FragSource, kSimpleESSL100Id),
334*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_HLSL_4_1_OUTPUT, kSimpleESSL300FragSource, kSimpleESSL300Id),
335*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_HLSL_4_1_OUTPUT, kRealWorldESSL100FragSource, kRealWorldESSL100Id),
336*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_HLSL_4_1_OUTPUT, kTrickyESSL300FragSource, kTrickyESSL300Id),
337*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_GLSL_450_CORE_OUTPUT, kSimpleESSL100FragSource, kSimpleESSL100Id),
338*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_GLSL_450_CORE_OUTPUT, kSimpleESSL300FragSource, kSimpleESSL300Id),
339*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_GLSL_450_CORE_OUTPUT,
340*8975f5c5SAndroid Build Coastguard Worker                            kRealWorldESSL100FragSource,
341*8975f5c5SAndroid Build Coastguard Worker                            kRealWorldESSL100Id),
342*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_GLSL_450_CORE_OUTPUT, kTrickyESSL300FragSource, kTrickyESSL300Id),
343*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_ESSL_OUTPUT, kSimpleESSL100FragSource, kSimpleESSL100Id),
344*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_ESSL_OUTPUT, kSimpleESSL300FragSource, kSimpleESSL300Id),
345*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_ESSL_OUTPUT, kRealWorldESSL100FragSource, kRealWorldESSL100Id),
346*8975f5c5SAndroid Build Coastguard Worker     CompilerPerfParameters(SH_ESSL_OUTPUT, kTrickyESSL300FragSource, kTrickyESSL300Id));
347*8975f5c5SAndroid Build Coastguard Worker 
348*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
349