xref: /aosp_15_r20/external/angle/src/tests/perf_tests/VulkanBarriersPerf.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // VulkanBarriersPerf:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance tests for ANGLE's Vulkan backend w.r.t barrier efficiency.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 10;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker struct VulkanBarriersPerfParams final : public RenderTestParams
23*8975f5c5SAndroid Build Coastguard Worker {
VulkanBarriersPerfParams__anon40f1e62d0111::VulkanBarriersPerfParams24*8975f5c5SAndroid Build Coastguard Worker     VulkanBarriersPerfParams(bool bufferCopy, bool largeTransfers, bool slowFS)
25*8975f5c5SAndroid Build Coastguard Worker     {
26*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = kIterationsPerStep;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker         // Common default parameters
29*8975f5c5SAndroid Build Coastguard Worker         eglParameters = egl_platform::VULKAN();
30*8975f5c5SAndroid Build Coastguard Worker         majorVersion  = 3;
31*8975f5c5SAndroid Build Coastguard Worker         minorVersion  = 0;
32*8975f5c5SAndroid Build Coastguard Worker         windowWidth   = 256;
33*8975f5c5SAndroid Build Coastguard Worker         windowHeight  = 256;
34*8975f5c5SAndroid Build Coastguard Worker         trackGpuTime  = true;
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker         doBufferCopy          = bufferCopy;
37*8975f5c5SAndroid Build Coastguard Worker         doLargeTransfers      = largeTransfers;
38*8975f5c5SAndroid Build Coastguard Worker         doSlowFragmentShaders = slowFS;
39*8975f5c5SAndroid Build Coastguard Worker     }
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker     std::string story() const override;
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     // Static parameters
44*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kImageSizes[3] = {256, 512, 4096};
45*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kBufferSize    = 4096 * 4096;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     bool doBufferCopy;
48*8975f5c5SAndroid Build Coastguard Worker     bool doLargeTransfers;
49*8975f5c5SAndroid Build Coastguard Worker     bool doSlowFragmentShaders;
50*8975f5c5SAndroid Build Coastguard Worker };
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker constexpr int VulkanBarriersPerfParams::kImageSizes[];
53*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const VulkanBarriersPerfParams & params)54*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const VulkanBarriersPerfParams &params)
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker     os << params.backendAndStory().substr(1);
57*8975f5c5SAndroid Build Coastguard Worker     return os;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker class VulkanBarriersPerfBenchmark : public ANGLERenderTest,
61*8975f5c5SAndroid Build Coastguard Worker                                     public ::testing::WithParamInterface<VulkanBarriersPerfParams>
62*8975f5c5SAndroid Build Coastguard Worker {
63*8975f5c5SAndroid Build Coastguard Worker   public:
64*8975f5c5SAndroid Build Coastguard Worker     VulkanBarriersPerfBenchmark();
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
67*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
68*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker   private:
71*8975f5c5SAndroid Build Coastguard Worker     void createTexture(uint32_t textureIndex, uint32_t sizeIndex, bool compressed);
72*8975f5c5SAndroid Build Coastguard Worker     void createUniformBuffer();
73*8975f5c5SAndroid Build Coastguard Worker     void createFramebuffer(uint32_t fboIndex, uint32_t textureIndex, uint32_t sizeIndex);
74*8975f5c5SAndroid Build Coastguard Worker     void createResources();
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker     // Handle to the program object
77*8975f5c5SAndroid Build Coastguard Worker     GLProgram mProgram;
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker     // Attribute locations
80*8975f5c5SAndroid Build Coastguard Worker     GLint mPositionLoc;
81*8975f5c5SAndroid Build Coastguard Worker     GLint mTexCoordLoc;
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     // Sampler location
84*8975f5c5SAndroid Build Coastguard Worker     GLint mSamplerLoc;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     // Texture handles
87*8975f5c5SAndroid Build Coastguard Worker     GLTexture mTextures[4];
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     // Uniform buffer handles
90*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mUniformBuffers[2];
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker     // Framebuffer handles
93*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer mFbos[2];
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     // Buffer handle
96*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mVertexBuffer;
97*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mIndexBuffer;
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kSmallFboIndex = 0;
100*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kLargeFboIndex = 1;
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kUniformBuffer1Index = 0;
103*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kUniformBuffer2Index = 1;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kSmallTextureIndex     = 0;
106*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kLargeTextureIndex     = 1;
107*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kTransferTexture1Index = 2;
108*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kTransferTexture2Index = 3;
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kSmallSizeIndex = 0;
111*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kLargeSizeIndex = 1;
112*8975f5c5SAndroid Build Coastguard Worker     static constexpr size_t kHugeSizeIndex  = 2;
113*8975f5c5SAndroid Build Coastguard Worker };
114*8975f5c5SAndroid Build Coastguard Worker 
story() const115*8975f5c5SAndroid Build Coastguard Worker std::string VulkanBarriersPerfParams::story() const
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream sout;
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker     sout << RenderTestParams::story();
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker     if (doBufferCopy)
122*8975f5c5SAndroid Build Coastguard Worker     {
123*8975f5c5SAndroid Build Coastguard Worker         sout << "_buffer_copy";
124*8975f5c5SAndroid Build Coastguard Worker     }
125*8975f5c5SAndroid Build Coastguard Worker     if (doLargeTransfers)
126*8975f5c5SAndroid Build Coastguard Worker     {
127*8975f5c5SAndroid Build Coastguard Worker         sout << "_transfer";
128*8975f5c5SAndroid Build Coastguard Worker     }
129*8975f5c5SAndroid Build Coastguard Worker     if (doSlowFragmentShaders)
130*8975f5c5SAndroid Build Coastguard Worker     {
131*8975f5c5SAndroid Build Coastguard Worker         sout << "_slowfs";
132*8975f5c5SAndroid Build Coastguard Worker     }
133*8975f5c5SAndroid Build Coastguard Worker 
134*8975f5c5SAndroid Build Coastguard Worker     return sout.str();
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
VulkanBarriersPerfBenchmark()137*8975f5c5SAndroid Build Coastguard Worker VulkanBarriersPerfBenchmark::VulkanBarriersPerfBenchmark()
138*8975f5c5SAndroid Build Coastguard Worker     : ANGLERenderTest("VulkanBarriersPerf", GetParam()),
139*8975f5c5SAndroid Build Coastguard Worker       mPositionLoc(-1),
140*8975f5c5SAndroid Build Coastguard Worker       mTexCoordLoc(-1),
141*8975f5c5SAndroid Build Coastguard Worker       mSamplerLoc(-1)
142*8975f5c5SAndroid Build Coastguard Worker {
143*8975f5c5SAndroid Build Coastguard Worker     if (IsNVIDIA() && IsWindows7())
144*8975f5c5SAndroid Build Coastguard Worker     {
145*8975f5c5SAndroid Build Coastguard Worker         skipTest(
146*8975f5c5SAndroid Build Coastguard Worker             "http://crbug.com/1096510 Fails on Windows7 NVIDIA Vulkan, presumably due to old "
147*8975f5c5SAndroid Build Coastguard Worker             "drivers");
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker }
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(attribute vec4 a_position;
152*8975f5c5SAndroid Build Coastguard Worker attribute vec2 a_texCoord;
153*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
154*8975f5c5SAndroid Build Coastguard Worker void main()
155*8975f5c5SAndroid Build Coastguard Worker {
156*8975f5c5SAndroid Build Coastguard Worker     gl_Position = a_position;
157*8975f5c5SAndroid Build Coastguard Worker     v_texCoord  = a_texCoord;
158*8975f5c5SAndroid Build Coastguard Worker })";
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker constexpr char kShortFS[] = R"(precision mediump float;
161*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
162*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D s_texture;
163*8975f5c5SAndroid Build Coastguard Worker void main()
164*8975f5c5SAndroid Build Coastguard Worker {
165*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = texture2D(s_texture, v_texCoord);
166*8975f5c5SAndroid Build Coastguard Worker })";
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker constexpr char kSlowFS[] = R"(precision mediump float;
169*8975f5c5SAndroid Build Coastguard Worker varying vec2 v_texCoord;
170*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D s_texture;
171*8975f5c5SAndroid Build Coastguard Worker void main()
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker     vec4 outColor = vec4(0);
174*8975f5c5SAndroid Build Coastguard Worker     if (v_texCoord.x < 0.2)
175*8975f5c5SAndroid Build Coastguard Worker     {
176*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < 100; ++i)
177*8975f5c5SAndroid Build Coastguard Worker         {
178*8975f5c5SAndroid Build Coastguard Worker             outColor += texture2D(s_texture, v_texCoord);
179*8975f5c5SAndroid Build Coastguard Worker         }
180*8975f5c5SAndroid Build Coastguard Worker     }
181*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = outColor;
182*8975f5c5SAndroid Build Coastguard Worker })";
183*8975f5c5SAndroid Build Coastguard Worker 
createTexture(uint32_t textureIndex,uint32_t sizeIndex,bool compressed)184*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::createTexture(uint32_t textureIndex,
185*8975f5c5SAndroid Build Coastguard Worker                                                 uint32_t sizeIndex,
186*8975f5c5SAndroid Build Coastguard Worker                                                 bool compressed)
187*8975f5c5SAndroid Build Coastguard Worker {
188*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker     // TODO(syoussefi): compressed copy using vkCmdCopyImage not yet implemented in the vulkan
191*8975f5c5SAndroid Build Coastguard Worker     // backend. http://anglebug.com/42261682
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]);
194*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, params.kImageSizes[sizeIndex],
195*8975f5c5SAndroid Build Coastguard Worker                  params.kImageSizes[sizeIndex], 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     // Disable mipmapping
198*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
199*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker 
createUniformBuffer()202*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::createUniformBuffer()
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffers[kUniformBuffer1Index]);
207*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, params.kBufferSize, nullptr, GL_DYNAMIC_COPY);
208*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, mUniformBuffers[kUniformBuffer2Index]);
209*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_UNIFORM_BUFFER, params.kBufferSize, nullptr, GL_DYNAMIC_COPY);
210*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_UNIFORM_BUFFER, 0);
211*8975f5c5SAndroid Build Coastguard Worker }
212*8975f5c5SAndroid Build Coastguard Worker 
createFramebuffer(uint32_t fboIndex,uint32_t textureIndex,uint32_t sizeIndex)213*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::createFramebuffer(uint32_t fboIndex,
214*8975f5c5SAndroid Build Coastguard Worker                                                     uint32_t textureIndex,
215*8975f5c5SAndroid Build Coastguard Worker                                                     uint32_t sizeIndex)
216*8975f5c5SAndroid Build Coastguard Worker {
217*8975f5c5SAndroid Build Coastguard Worker     createTexture(textureIndex, sizeIndex, false);
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, mFbos[fboIndex]);
220*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
221*8975f5c5SAndroid Build Coastguard Worker                            mTextures[textureIndex], 0);
222*8975f5c5SAndroid Build Coastguard Worker }
223*8975f5c5SAndroid Build Coastguard Worker 
createResources()224*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::createResources()
225*8975f5c5SAndroid Build Coastguard Worker {
226*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker     mProgram.makeRaster(kVS, params.doSlowFragmentShaders ? kSlowFS : kShortFS);
229*8975f5c5SAndroid Build Coastguard Worker     ASSERT_TRUE(mProgram.valid());
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker     // Get the attribute locations
232*8975f5c5SAndroid Build Coastguard Worker     mPositionLoc = glGetAttribLocation(mProgram, "a_position");
233*8975f5c5SAndroid Build Coastguard Worker     mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord");
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     // Get the sampler location
236*8975f5c5SAndroid Build Coastguard Worker     mSamplerLoc = glGetUniformLocation(mProgram, "s_texture");
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker     // Build the vertex buffer
239*8975f5c5SAndroid Build Coastguard Worker     GLfloat vertices[] = {
240*8975f5c5SAndroid Build Coastguard Worker         -0.5f, 0.5f,  0.0f,  // Position 0
241*8975f5c5SAndroid Build Coastguard Worker         0.0f,  0.0f,         // TexCoord 0
242*8975f5c5SAndroid Build Coastguard Worker         -0.5f, -0.5f, 0.0f,  // Position 1
243*8975f5c5SAndroid Build Coastguard Worker         0.0f,  1.0f,         // TexCoord 1
244*8975f5c5SAndroid Build Coastguard Worker         0.5f,  -0.5f, 0.0f,  // Position 2
245*8975f5c5SAndroid Build Coastguard Worker         1.0f,  1.0f,         // TexCoord 2
246*8975f5c5SAndroid Build Coastguard Worker         0.5f,  0.5f,  0.0f,  // Position 3
247*8975f5c5SAndroid Build Coastguard Worker         1.0f,  0.0f          // TexCoord 3
248*8975f5c5SAndroid Build Coastguard Worker     };
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
251*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker     GLushort indices[] = {0, 1, 2, 0, 2, 3};
254*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
255*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
256*8975f5c5SAndroid Build Coastguard Worker 
257*8975f5c5SAndroid Build Coastguard Worker     // Use tightly packed data
258*8975f5c5SAndroid Build Coastguard Worker     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker     // Create four textures.  Two of them are going to be framebuffers, and two are used for large
261*8975f5c5SAndroid Build Coastguard Worker     // transfers.
262*8975f5c5SAndroid Build Coastguard Worker     createFramebuffer(kSmallFboIndex, kSmallTextureIndex, kSmallSizeIndex);
263*8975f5c5SAndroid Build Coastguard Worker     createFramebuffer(kLargeFboIndex, kLargeTextureIndex, kLargeSizeIndex);
264*8975f5c5SAndroid Build Coastguard Worker     createUniformBuffer();
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     if (params.doLargeTransfers)
267*8975f5c5SAndroid Build Coastguard Worker     {
268*8975f5c5SAndroid Build Coastguard Worker         createTexture(kTransferTexture1Index, kHugeSizeIndex, true);
269*8975f5c5SAndroid Build Coastguard Worker         createTexture(kTransferTexture2Index, kHugeSizeIndex, true);
270*8975f5c5SAndroid Build Coastguard Worker     }
271*8975f5c5SAndroid Build Coastguard Worker }
272*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()273*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::initializeBenchmark()
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker     createResources();
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
278*8975f5c5SAndroid Build Coastguard Worker 
279*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
280*8975f5c5SAndroid Build Coastguard Worker }
281*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()282*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::destroyBenchmark() {}
283*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()284*8975f5c5SAndroid Build Coastguard Worker void VulkanBarriersPerfBenchmark::drawBenchmark()
285*8975f5c5SAndroid Build Coastguard Worker {
286*8975f5c5SAndroid Build Coastguard Worker     const auto &params = GetParam();
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     // Bind the buffers
291*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
292*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     // Load the vertex position
295*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0);
296*8975f5c5SAndroid Build Coastguard Worker     // Load the texture coordinate
297*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat),
298*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<void *>(3 * sizeof(GLfloat)));
299*8975f5c5SAndroid Build Coastguard Worker 
300*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(mPositionLoc);
301*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(mTexCoordLoc);
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     // Set the texture sampler to texture unit to 0
304*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(mSamplerLoc, 0);
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     /*
307*8975f5c5SAndroid Build Coastguard Worker      * The perf benchmark does the following:
308*8975f5c5SAndroid Build Coastguard Worker      *
309*8975f5c5SAndroid Build Coastguard Worker      * - Alternately clear and draw from fbo 1 into fbo 2 and back.  This would use the color
310*8975f5c5SAndroid Build Coastguard Worker      * attachment and shader read-only layouts in the fragment shader and color attachment stages.
311*8975f5c5SAndroid Build Coastguard Worker      *
312*8975f5c5SAndroid Build Coastguard Worker      * - Alternately copy data between the 2 uniform buffers. This would use the transfer layouts
313*8975f5c5SAndroid Build Coastguard Worker      * in the transfer stage.
314*8975f5c5SAndroid Build Coastguard Worker      *
315*8975f5c5SAndroid Build Coastguard Worker      * Once compressed texture copies are supported, alternately copy large chunks of data from
316*8975f5c5SAndroid Build Coastguard Worker      * texture 1 into texture 2 and back.  This would use the transfer layouts in the transfer
317*8975f5c5SAndroid Build Coastguard Worker      * stage.
318*8975f5c5SAndroid Build Coastguard Worker      *
319*8975f5c5SAndroid Build Coastguard Worker      * Once compute shader support is added, another independent set of operations could be a few
320*8975f5c5SAndroid Build Coastguard Worker      * dispatches.  This would use the general and shader read-only layouts in the compute stage.
321*8975f5c5SAndroid Build Coastguard Worker      *
322*8975f5c5SAndroid Build Coastguard Worker      * The idea is to create independent pipelines of operations that would run in parallel on the
323*8975f5c5SAndroid Build Coastguard Worker      * GPU.  Regressions or inefficiencies in the barrier implementation could result in
324*8975f5c5SAndroid Build Coastguard Worker      * serialization of these jobs, resulting in a hit in performance.
325*8975f5c5SAndroid Build Coastguard Worker      *
326*8975f5c5SAndroid Build Coastguard Worker      * The above operations for example should ideally run on the GPU threads in parallel:
327*8975f5c5SAndroid Build Coastguard Worker      *
328*8975f5c5SAndroid Build Coastguard Worker      * + |---draw---||---draw---||---draw---||---draw---||---draw---|
329*8975f5c5SAndroid Build Coastguard Worker      * + |----buffer copy----||----buffer copy----||----buffer copy----|
330*8975f5c5SAndroid Build Coastguard Worker      * + |-----------texture copy------------||-----------texture copy------------|
331*8975f5c5SAndroid Build Coastguard Worker      * + |-----dispatch------||------dispatch------||------dispatch------|
332*8975f5c5SAndroid Build Coastguard Worker      *
333*8975f5c5SAndroid Build Coastguard Worker      * If barriers are too restrictive, situations like this could happen (draw is blocking
334*8975f5c5SAndroid Build Coastguard Worker      * copy):
335*8975f5c5SAndroid Build Coastguard Worker      *
336*8975f5c5SAndroid Build Coastguard Worker      * + |---draw---||---draw---||---draw---||---draw---||---draw---|
337*8975f5c5SAndroid Build Coastguard Worker      * +             |------------copy------------||-----------copy------------|
338*8975f5c5SAndroid Build Coastguard Worker      *
339*8975f5c5SAndroid Build Coastguard Worker      * Or like this (copy is blocking draw):
340*8975f5c5SAndroid Build Coastguard Worker      *
341*8975f5c5SAndroid Build Coastguard Worker      * + |---draw---|                     |---draw---|                     |---draw---|
342*8975f5c5SAndroid Build Coastguard Worker      * + |--------------copy-------------||-------------copy--------------|
343*8975f5c5SAndroid Build Coastguard Worker      *
344*8975f5c5SAndroid Build Coastguard Worker      * Or like this (draw and copy blocking each other):
345*8975f5c5SAndroid Build Coastguard Worker      *
346*8975f5c5SAndroid Build Coastguard Worker      * + |---draw---|                                 |---draw---|
347*8975f5c5SAndroid Build Coastguard Worker      * +             |------------copy---------------|            |------------copy------------|
348*8975f5c5SAndroid Build Coastguard Worker      *
349*8975f5c5SAndroid Build Coastguard Worker      * The idea of doing slow FS calls is to make the second case above slower (by making the draw
350*8975f5c5SAndroid Build Coastguard Worker      * slower than the transfer):
351*8975f5c5SAndroid Build Coastguard Worker      *
352*8975f5c5SAndroid Build Coastguard Worker      * + |------------------draw------------------|                                 |-...draw...-|
353*8975f5c5SAndroid Build Coastguard Worker      * + |--------------copy----------------|       |-------------copy-------------|
354*8975f5c5SAndroid Build Coastguard Worker      */
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     startGpuTimer();
357*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int iteration = 0; iteration < params.iterationsPerStep; ++iteration)
358*8975f5c5SAndroid Build Coastguard Worker     {
359*8975f5c5SAndroid Build Coastguard Worker         bool altEven = iteration % 2 == 0;
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker         const int fboDestIndex            = altEven ? kLargeFboIndex : kSmallFboIndex;
362*8975f5c5SAndroid Build Coastguard Worker         const int fboTexSrcIndex          = altEven ? kSmallTextureIndex : kLargeTextureIndex;
363*8975f5c5SAndroid Build Coastguard Worker         const int fboDestSizeIndex        = altEven ? kLargeSizeIndex : kSmallSizeIndex;
364*8975f5c5SAndroid Build Coastguard Worker         const int uniformBufferReadIndex  = altEven ? kUniformBuffer1Index : kUniformBuffer2Index;
365*8975f5c5SAndroid Build Coastguard Worker         const int uniformBufferWriteIndex = altEven ? kUniformBuffer2Index : kUniformBuffer1Index;
366*8975f5c5SAndroid Build Coastguard Worker 
367*8975f5c5SAndroid Build Coastguard Worker         if (params.doBufferCopy)
368*8975f5c5SAndroid Build Coastguard Worker         {
369*8975f5c5SAndroid Build Coastguard Worker             // Transfer data between the 2 Uniform buffers
370*8975f5c5SAndroid Build Coastguard Worker             glBindBuffer(GL_COPY_READ_BUFFER, mUniformBuffers[uniformBufferReadIndex]);
371*8975f5c5SAndroid Build Coastguard Worker             glBindBuffer(GL_COPY_WRITE_BUFFER, mUniformBuffers[uniformBufferWriteIndex]);
372*8975f5c5SAndroid Build Coastguard Worker             glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0,
373*8975f5c5SAndroid Build Coastguard Worker                                 params.kBufferSize);
374*8975f5c5SAndroid Build Coastguard Worker         }
375*8975f5c5SAndroid Build Coastguard Worker 
376*8975f5c5SAndroid Build Coastguard Worker         // Bind the framebuffer
377*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, mFbos[fboDestIndex]);
378*8975f5c5SAndroid Build Coastguard Worker 
379*8975f5c5SAndroid Build Coastguard Worker         // Set the viewport
380*8975f5c5SAndroid Build Coastguard Worker         glViewport(0, 0, params.kImageSizes[fboDestSizeIndex],
381*8975f5c5SAndroid Build Coastguard Worker                    params.kImageSizes[fboDestSizeIndex]);
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker         // Clear the color buffer
384*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
385*8975f5c5SAndroid Build Coastguard Worker 
386*8975f5c5SAndroid Build Coastguard Worker         // Bind the texture
387*8975f5c5SAndroid Build Coastguard Worker         glActiveTexture(GL_TEXTURE0);
388*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, mTextures[fboTexSrcIndex]);
389*8975f5c5SAndroid Build Coastguard Worker 
390*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
393*8975f5c5SAndroid Build Coastguard Worker     }
394*8975f5c5SAndroid Build Coastguard Worker     stopGpuTimer();
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
397*8975f5c5SAndroid Build Coastguard Worker }
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker }  // namespace
400*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(VulkanBarriersPerfBenchmark,Run)401*8975f5c5SAndroid Build Coastguard Worker TEST_P(VulkanBarriersPerfBenchmark, Run)
402*8975f5c5SAndroid Build Coastguard Worker {
403*8975f5c5SAndroid Build Coastguard Worker     run();
404*8975f5c5SAndroid Build Coastguard Worker }
405*8975f5c5SAndroid Build Coastguard Worker 
406*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VulkanBarriersPerfBenchmark);
407*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(VulkanBarriersPerfBenchmark,
408*8975f5c5SAndroid Build Coastguard Worker                        VulkanBarriersPerfParams(false, false, false),
409*8975f5c5SAndroid Build Coastguard Worker                        VulkanBarriersPerfParams(true, false, false),
410*8975f5c5SAndroid Build Coastguard Worker                        VulkanBarriersPerfParams(false, true, false),
411*8975f5c5SAndroid Build Coastguard Worker                        VulkanBarriersPerfParams(false, true, true));
412