xref: /aosp_15_r20/external/angle/src/tests/perf_tests/DispatchComputePerf.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 // 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 &params)
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 &params = 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 &params = 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 &params = 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