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 ¶m)
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 ¶ms = 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