1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 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 // ImagelessFramebufferPerfTest:
7*8975f5c5SAndroid Build Coastguard Worker // Performance test for imageless framebuffers. It binds and draws many textures to the FBO both
8*8975f5c5SAndroid Build Coastguard Worker // using imageless framebuffers (if supported) and with imageless framebuffer disabled.
9*8975f5c5SAndroid Build Coastguard Worker //
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
15*8975f5c5SAndroid Build Coastguard Worker #include <random>
16*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker namespace angle
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kIterationsPerStep = 1;
21*8975f5c5SAndroid Build Coastguard Worker constexpr unsigned int kTextureSize = 64;
22*8975f5c5SAndroid Build Coastguard Worker constexpr std::size_t kTextureCount = 100;
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker struct ImagelessFramebufferAttachmentParams final : public RenderTestParams
25*8975f5c5SAndroid Build Coastguard Worker {
ImagelessFramebufferAttachmentParamsangle::ImagelessFramebufferAttachmentParams26*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentParams()
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker iterationsPerStep = kIterationsPerStep;
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker // Common default params
31*8975f5c5SAndroid Build Coastguard Worker majorVersion = 3;
32*8975f5c5SAndroid Build Coastguard Worker minorVersion = 0;
33*8975f5c5SAndroid Build Coastguard Worker }
34*8975f5c5SAndroid Build Coastguard Worker
35*8975f5c5SAndroid Build Coastguard Worker std::string story() const override;
36*8975f5c5SAndroid Build Coastguard Worker bool isImagelessFramebufferEnabled = false;
37*8975f5c5SAndroid Build Coastguard Worker };
38*8975f5c5SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const ImagelessFramebufferAttachmentParams & params)39*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const ImagelessFramebufferAttachmentParams ¶ms)
40*8975f5c5SAndroid Build Coastguard Worker {
41*8975f5c5SAndroid Build Coastguard Worker os << params.backendAndStory().substr(1);
42*8975f5c5SAndroid Build Coastguard Worker return os;
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker
story() const45*8975f5c5SAndroid Build Coastguard Worker std::string ImagelessFramebufferAttachmentParams::story() const
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker std::stringstream strstr;
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Worker strstr << RenderTestParams::story();
50*8975f5c5SAndroid Build Coastguard Worker strstr << (!isImagelessFramebufferEnabled ? "_imageless_framebuffer_disabled" : "_default");
51*8975f5c5SAndroid Build Coastguard Worker
52*8975f5c5SAndroid Build Coastguard Worker return strstr.str();
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker class ImagelessFramebufferAttachmentBenchmark
56*8975f5c5SAndroid Build Coastguard Worker : public ANGLERenderTest,
57*8975f5c5SAndroid Build Coastguard Worker public ::testing::WithParamInterface<ImagelessFramebufferAttachmentParams>
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker public:
ImagelessFramebufferAttachmentBenchmark()60*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentBenchmark() : ANGLERenderTest("ImagelessFramebuffers", GetParam())
61*8975f5c5SAndroid Build Coastguard Worker {}
62*8975f5c5SAndroid Build Coastguard Worker void initializeBenchmark() override;
63*8975f5c5SAndroid Build Coastguard Worker void drawBenchmark() override;
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker protected:
66*8975f5c5SAndroid Build Coastguard Worker std::array<GLTexture, kTextureCount> mTextures;
67*8975f5c5SAndroid Build Coastguard Worker GLuint mProgram = 0;
68*8975f5c5SAndroid Build Coastguard Worker };
69*8975f5c5SAndroid Build Coastguard Worker
initializeBenchmark()70*8975f5c5SAndroid Build Coastguard Worker void ImagelessFramebufferAttachmentBenchmark::initializeBenchmark()
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] = R"(void main()
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker gl_Position = vec4(0);
75*8975f5c5SAndroid Build Coastguard Worker })";
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] = R"(void main(void)
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
80*8975f5c5SAndroid Build Coastguard Worker })";
81*8975f5c5SAndroid Build Coastguard Worker
82*8975f5c5SAndroid Build Coastguard Worker mProgram = CompileProgram(kVS, kFS);
83*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(0u, mProgram);
84*8975f5c5SAndroid Build Coastguard Worker glUseProgram(mProgram);
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker for (GLTexture &texture : mTextures)
87*8975f5c5SAndroid Build Coastguard Worker {
88*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
89*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
90*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0, GL_RGBA,
91*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
92*8975f5c5SAndroid Build Coastguard Worker }
93*8975f5c5SAndroid Build Coastguard Worker }
94*8975f5c5SAndroid Build Coastguard Worker
drawBenchmark()95*8975f5c5SAndroid Build Coastguard Worker void ImagelessFramebufferAttachmentBenchmark::drawBenchmark()
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker const auto ¶ms = GetParam();
98*8975f5c5SAndroid Build Coastguard Worker
99*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker for (size_t it = 0; it < params.iterationsPerStep; ++it)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
104*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < kTextureCount; ++i)
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker for (size_t j = 0; j < kTextureCount; ++j)
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker if (j == i)
109*8975f5c5SAndroid Build Coastguard Worker continue;
110*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
111*8975f5c5SAndroid Build Coastguard Worker mTextures[i], 0);
112*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D,
113*8975f5c5SAndroid Build Coastguard Worker mTextures[j], 0);
114*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_POINTS, 0, 1);
115*8975f5c5SAndroid Build Coastguard Worker }
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker
119*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
120*8975f5c5SAndroid Build Coastguard Worker }
121*8975f5c5SAndroid Build Coastguard Worker
ImagelessVulkanEnabledParams()122*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentParams ImagelessVulkanEnabledParams()
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentParams params;
125*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::VULKAN().disable(Feature::PreferSubmitAtFBOBoundary);
126*8975f5c5SAndroid Build Coastguard Worker params.isImagelessFramebufferEnabled = true;
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker return params;
129*8975f5c5SAndroid Build Coastguard Worker }
130*8975f5c5SAndroid Build Coastguard Worker
ImagelessVulkanDisabledParams()131*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentParams ImagelessVulkanDisabledParams()
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker ImagelessFramebufferAttachmentParams params;
134*8975f5c5SAndroid Build Coastguard Worker params.eglParameters = egl_platform::VULKAN()
135*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::PreferSubmitAtFBOBoundary)
136*8975f5c5SAndroid Build Coastguard Worker .disable(Feature::SupportsImagelessFramebuffer);
137*8975f5c5SAndroid Build Coastguard Worker params.isImagelessFramebufferEnabled = false;
138*8975f5c5SAndroid Build Coastguard Worker
139*8975f5c5SAndroid Build Coastguard Worker return params;
140*8975f5c5SAndroid Build Coastguard Worker }
141*8975f5c5SAndroid Build Coastguard Worker
142*8975f5c5SAndroid Build Coastguard Worker // Runs tests to measure imageless framebuffer performance
TEST_P(ImagelessFramebufferAttachmentBenchmark,Run)143*8975f5c5SAndroid Build Coastguard Worker TEST_P(ImagelessFramebufferAttachmentBenchmark, Run)
144*8975f5c5SAndroid Build Coastguard Worker {
145*8975f5c5SAndroid Build Coastguard Worker run();
146*8975f5c5SAndroid Build Coastguard Worker }
147*8975f5c5SAndroid Build Coastguard Worker
148*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ImagelessFramebufferAttachmentBenchmark);
149*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(ImagelessFramebufferAttachmentBenchmark,
150*8975f5c5SAndroid Build Coastguard Worker ImagelessVulkanEnabledParams(),
151*8975f5c5SAndroid Build Coastguard Worker ImagelessVulkanDisabledParams());
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
154