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