xref: /aosp_15_r20/external/angle/src/tests/perf_tests/ImagelessFramebufferPerfTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &params)
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 &params = 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