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 // DispatchComputePerf:
7*8975f5c5SAndroid Build Coastguard Worker // Performance tests for ANGLE DispatchCompute call overhead.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker namespace
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker unsigned int kIterationsPerStep = 50;
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker struct DispatchComputePerfParams final : public RenderTestParams
18*8975f5c5SAndroid Build Coastguard Worker {
DispatchComputePerfParams__anon9ba7788f0111::DispatchComputePerfParams19*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfParams()
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
22*8975f5c5SAndroid Build Coastguard Worker majorVersion = 3;
23*8975f5c5SAndroid Build Coastguard Worker minorVersion = 1;
24*8975f5c5SAndroid Build Coastguard Worker }
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker std::string story() const override;
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker unsigned int localSizeX = 16;
29*8975f5c5SAndroid Build Coastguard Worker unsigned int localSizeY = 16;
30*8975f5c5SAndroid Build Coastguard Worker unsigned int textureWidth = 32;
31*8975f5c5SAndroid Build Coastguard Worker unsigned int textureHeight = 32;
32*8975f5c5SAndroid Build Coastguard Worker };
33*8975f5c5SAndroid Build Coastguard Worker
story() const34*8975f5c5SAndroid Build Coastguard Worker std::string DispatchComputePerfParams::story() const
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker std::stringstream storyStr;
37*8975f5c5SAndroid Build Coastguard Worker storyStr << RenderTestParams::story();
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker storyStr << "_null";
42*8975f5c5SAndroid Build Coastguard Worker }
43*8975f5c5SAndroid Build Coastguard Worker return storyStr.str();
44*8975f5c5SAndroid Build Coastguard Worker }
45*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const DispatchComputePerfParams & params)46*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const DispatchComputePerfParams ¶ms)
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
49*8975f5c5SAndroid Build Coastguard Worker return os;
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker
52*8975f5c5SAndroid Build Coastguard Worker class DispatchComputePerfBenchmark : public ANGLERenderTest,
53*8975f5c5SAndroid Build Coastguard Worker public ::testing::WithParamInterface<DispatchComputePerfParams>
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker public:
56*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfBenchmark();
57*8975f5c5SAndroid Build Coastguard Worker
58*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
59*8975f5c5SAndroid Build Coastguard Worker void destroyBenchmark() override;
60*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker private:
63*8975f5c5SAndroid Build Coastguard Worker void initComputeShader();
64*8975f5c5SAndroid Build Coastguard Worker void initTextures();
65*8975f5c5SAndroid Build Coastguard Worker
66*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram = 0;
67*8975f5c5SAndroid Build Coastguard Worker GLuint mReadTexture = 0;
68*8975f5c5SAndroid Build Coastguard Worker GLuint mWriteTexture = 0;
69*8975f5c5SAndroid Build Coastguard Worker GLuint mDispatchX = 0;
70*8975f5c5SAndroid Build Coastguard Worker GLuint mDispatchY = 0;
71*8975f5c5SAndroid Build Coastguard Worker };
72*8975f5c5SAndroid Build Coastguard Worker
DispatchComputePerfBenchmark()73*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfBenchmark::DispatchComputePerfBenchmark()
74*8975f5c5SAndroid Build Coastguard Worker : ANGLERenderTest("DispatchComputePerf", GetParam())
75*8975f5c5SAndroid Build Coastguard Worker {}
76*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()77*8975f5c5SAndroid Build Coastguard Worker void DispatchComputePerfBenchmark::initializeBenchmark()
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker initComputeShader();
82*8975f5c5SAndroid Build Coastguard Worker initTextures();
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
85*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
86*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mReadTexture);
87*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(mProgram, "readTexture"), 0);
88*8975f5c5SAndroid Build Coastguard Worker glBindImageTexture(4, mWriteTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker mDispatchX = params.textureWidth / params.localSizeX;
91*8975f5c5SAndroid Build Coastguard Worker mDispatchY = params.textureHeight / params.localSizeY;
92*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker
initComputeShader()95*8975f5c5SAndroid Build Coastguard Worker void DispatchComputePerfBenchmark::initComputeShader()
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker constexpr char kCS[] = R"(#version 310 es
98*8975f5c5SAndroid Build Coastguard Worker #define LOCAL_SIZE_X 16
99*8975f5c5SAndroid Build Coastguard Worker #define LOCAL_SIZE_Y 16
100*8975f5c5SAndroid Build Coastguard Worker layout(local_size_x=LOCAL_SIZE_X, local_size_y=LOCAL_SIZE_Y) in;
101*8975f5c5SAndroid Build Coastguard Worker precision highp float;
102*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D readTexture;
103*8975f5c5SAndroid Build Coastguard Worker layout(r32f, binding = 4) writeonly uniform highp image2D outImage;
104*8975f5c5SAndroid Build Coastguard Worker
105*8975f5c5SAndroid Build Coastguard Worker void main() {
106*8975f5c5SAndroid Build Coastguard Worker float sum = 0.;
107*8975f5c5SAndroid Build Coastguard Worker sum += texelFetch(readTexture, ivec2(gl_GlobalInvocationID.xy), 0).r;
108*8975f5c5SAndroid Build Coastguard Worker imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(sum));
109*8975f5c5SAndroid Build Coastguard Worker })";
110*8975f5c5SAndroid Build Coastguard Worker
111*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileComputeProgram(kCS, false);
112*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
113*8975f5c5SAndroid Build Coastguard Worker }
114*8975f5c5SAndroid Build Coastguard Worker
initTextures()115*8975f5c5SAndroid Build Coastguard Worker void DispatchComputePerfBenchmark::initTextures()
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
118*8975f5c5SAndroid Build Coastguard Worker
119*8975f5c5SAndroid Build Coastguard Worker unsigned int textureDataSize = params.textureWidth * params.textureHeight;
120*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> textureInputData(textureDataSize, 0.2f);
121*8975f5c5SAndroid Build Coastguard Worker std::vector<GLfloat> textureOutputData(textureDataSize, 0.1f);
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mReadTexture);
124*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mReadTexture);
125*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_R32F, params.textureWidth, params.textureHeight, 0, GL_RED,
126*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, textureInputData.data());
127*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
128*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
129*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
130*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &mWriteTexture);
133*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mWriteTexture);
134*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, params.textureWidth, params.textureHeight);
135*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, params.textureWidth, params.textureHeight, GL_RED,
136*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, textureOutputData.data());
137*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker
destroyBenchmark()140*8975f5c5SAndroid Build Coastguard Worker void DispatchComputePerfBenchmark::destroyBenchmark()
141*8975f5c5SAndroid Build Coastguard Worker {
142*8975f5c5SAndroid Build Coastguard Worker glDeleteProgram(mProgram);
143*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mReadTexture);
144*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(1, &mWriteTexture);
145*8975f5c5SAndroid Build Coastguard Worker }
146*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()147*8975f5c5SAndroid Build Coastguard Worker void DispatchComputePerfBenchmark::drawBenchmark()
148*8975f5c5SAndroid Build Coastguard Worker {
149*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
150*8975f5c5SAndroid Build Coastguard Worker for (unsigned int it = 0; it < params.iterationsPerStep; it++)
151*8975f5c5SAndroid Build Coastguard Worker {
152*8975f5c5SAndroid Build Coastguard Worker glDispatchCompute(mDispatchX, mDispatchY, 1);
153*8975f5c5SAndroid Build Coastguard Worker glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
154*8975f5c5SAndroid Build Coastguard Worker }
155*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
156*8975f5c5SAndroid Build Coastguard Worker }
157*8975f5c5SAndroid Build Coastguard Worker
DispatchComputePerfOpenGLOrGLESParams(bool useNullDevice)158*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfParams DispatchComputePerfOpenGLOrGLESParams(bool useNullDevice)
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfParams params;
161*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = useNullDevice ? angle::egl_platform::OPENGL_OR_GLES_NULL()
162*8975f5c5SAndroid Build Coastguard Worker : angle::egl_platform::OPENGL_OR_GLES();
163*8975f5c5SAndroid Build Coastguard Worker return params;
164*8975f5c5SAndroid Build Coastguard Worker }
165*8975f5c5SAndroid Build Coastguard Worker
TEST_P(DispatchComputePerfBenchmark,Run)166*8975f5c5SAndroid Build Coastguard Worker TEST_P(DispatchComputePerfBenchmark, Run)
167*8975f5c5SAndroid Build Coastguard Worker {
168*8975f5c5SAndroid Build Coastguard Worker run();
169*8975f5c5SAndroid Build Coastguard Worker }
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DispatchComputePerfBenchmark);
172*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(DispatchComputePerfBenchmark,
173*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfOpenGLOrGLESParams(true),
174*8975f5c5SAndroid Build Coastguard Worker DispatchComputePerfOpenGLOrGLESParams(false));
175*8975f5c5SAndroid Build Coastguard Worker
176*8975f5c5SAndroid Build Coastguard Worker } // namespace
177