xref: /aosp_15_r20/external/angle/src/tests/perf_tests/MultisampledSwapchainResolve.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 // MultisampledSwapchainResolveBenchmark:
7*8975f5c5SAndroid Build Coastguard Worker //   Performance test for resolving multisample swapchains in subpass
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "ANGLEPerfTest.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <iostream>
13*8975f5c5SAndroid Build Coastguard Worker #include <random>
14*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker struct MultisampledSwapchainResolveParams final : public RenderTestParams
24*8975f5c5SAndroid Build Coastguard Worker {
MultisampledSwapchainResolveParams__anonb79f57a40111::MultisampledSwapchainResolveParams25*8975f5c5SAndroid Build Coastguard Worker     MultisampledSwapchainResolveParams()
26*8975f5c5SAndroid Build Coastguard Worker     {
27*8975f5c5SAndroid Build Coastguard Worker         iterationsPerStep = 1;
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker         windowWidth  = 1920;
30*8975f5c5SAndroid Build Coastguard Worker         windowHeight = 1080;
31*8975f5c5SAndroid Build Coastguard Worker         multisample  = true;
32*8975f5c5SAndroid Build Coastguard Worker         samples      = 4;
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 };
37*8975f5c5SAndroid Build Coastguard Worker 
operator <<(std::ostream & os,const MultisampledSwapchainResolveParams & params)38*8975f5c5SAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &os, const MultisampledSwapchainResolveParams &params)
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker     return os << params.backendAndStory().substr(1);
41*8975f5c5SAndroid Build Coastguard Worker }
42*8975f5c5SAndroid Build Coastguard Worker 
story() const43*8975f5c5SAndroid Build Coastguard Worker std::string MultisampledSwapchainResolveParams::story() const
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker     std::stringstream strstr;
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     strstr << RenderTestParams::story();
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     return strstr.str();
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker class MultisampledSwapchainResolveBenchmark
53*8975f5c5SAndroid Build Coastguard Worker     : public ANGLERenderTest,
54*8975f5c5SAndroid Build Coastguard Worker       public ::testing::WithParamInterface<MultisampledSwapchainResolveParams>
55*8975f5c5SAndroid Build Coastguard Worker {
56*8975f5c5SAndroid Build Coastguard Worker   public:
57*8975f5c5SAndroid Build Coastguard Worker     MultisampledSwapchainResolveBenchmark();
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     void initializeBenchmark() override;
60*8975f5c5SAndroid Build Coastguard Worker     void destroyBenchmark() override;
61*8975f5c5SAndroid Build Coastguard Worker     void drawBenchmark() override;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker   protected:
64*8975f5c5SAndroid Build Coastguard Worker     void initShaders();
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     GLuint mProgram = 0;
67*8975f5c5SAndroid Build Coastguard Worker };
68*8975f5c5SAndroid Build Coastguard Worker 
MultisampledSwapchainResolveBenchmark()69*8975f5c5SAndroid Build Coastguard Worker MultisampledSwapchainResolveBenchmark::MultisampledSwapchainResolveBenchmark()
70*8975f5c5SAndroid Build Coastguard Worker     : ANGLERenderTest("MultisampledSwapchainResolve", GetParam())
71*8975f5c5SAndroid Build Coastguard Worker {}
72*8975f5c5SAndroid Build Coastguard Worker 
initializeBenchmark()73*8975f5c5SAndroid Build Coastguard Worker void MultisampledSwapchainResolveBenchmark::initializeBenchmark()
74*8975f5c5SAndroid Build Coastguard Worker {
75*8975f5c5SAndroid Build Coastguard Worker     initShaders();
76*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
79*8975f5c5SAndroid Build Coastguard Worker }
80*8975f5c5SAndroid Build Coastguard Worker 
initShaders()81*8975f5c5SAndroid Build Coastguard Worker void MultisampledSwapchainResolveBenchmark::initShaders()
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(void main()
84*8975f5c5SAndroid Build Coastguard Worker {
85*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(0);
86*8975f5c5SAndroid Build Coastguard Worker })";
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(void main(void)
89*8975f5c5SAndroid Build Coastguard Worker {
90*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
91*8975f5c5SAndroid Build Coastguard Worker })";
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     mProgram = CompileProgram(kVS, kFS);
94*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, mProgram);
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(mProgram);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker 
destroyBenchmark()101*8975f5c5SAndroid Build Coastguard Worker void MultisampledSwapchainResolveBenchmark::destroyBenchmark()
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker     glDeleteProgram(mProgram);
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker 
drawBenchmark()106*8975f5c5SAndroid Build Coastguard Worker void MultisampledSwapchainResolveBenchmark::drawBenchmark()
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker     // Initially clear the color attachment to avoid having to load from the resolved image.
109*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
110*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
111*8975f5c5SAndroid Build Coastguard Worker 
112*8975f5c5SAndroid Build Coastguard Worker     // Perform a draw just to have something in the render pass.  With the position attributes
113*8975f5c5SAndroid Build Coastguard Worker     // not set, a constant default value is used, resulting in a very cheap draw.
114*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
117*8975f5c5SAndroid Build Coastguard Worker }
118*8975f5c5SAndroid Build Coastguard Worker 
VulkanParams()119*8975f5c5SAndroid Build Coastguard Worker MultisampledSwapchainResolveParams VulkanParams()
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     MultisampledSwapchainResolveParams params;
122*8975f5c5SAndroid Build Coastguard Worker     params.eglParameters = egl_platform::VULKAN();
123*8975f5c5SAndroid Build Coastguard Worker     params.majorVersion  = 3;
124*8975f5c5SAndroid Build Coastguard Worker     params.minorVersion  = 0;
125*8975f5c5SAndroid Build Coastguard Worker     return params;
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
129*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(MultisampledSwapchainResolveBenchmark,Run)130*8975f5c5SAndroid Build Coastguard Worker TEST_P(MultisampledSwapchainResolveBenchmark, Run)
131*8975f5c5SAndroid Build Coastguard Worker {
132*8975f5c5SAndroid Build Coastguard Worker     run();
133*8975f5c5SAndroid Build Coastguard Worker }
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker using namespace params;
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(MultisampledSwapchainResolveBenchmark, VulkanParams());
138