Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/perf_tests/FramebufferAttachmentPerfTest.cpp
1693 views
1
//
2
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
3
// Use of this source code is governed by a BSD-style license that can be
4
// found in the LICENSE file.
5
//
6
// FramebufferAttachPerfTest:
7
// Performance test for attaching and detaching resources to a Framebuffer.
8
//
9
10
#include "ANGLEPerfTest.h"
11
#include "test_utils/gl_raii.h"
12
13
#include <iostream>
14
#include <random>
15
#include <sstream>
16
17
namespace angle
18
{
19
constexpr unsigned int kIterationsPerStep = 256;
20
constexpr unsigned int kTextureSize = 256;
21
constexpr std::size_t kTextureCount = 4;
22
constexpr std::size_t kFboCount = kTextureCount;
23
constexpr std::size_t kAdditionalFboCount = kFboCount * kFboCount;
24
25
struct FramebufferAttachmentParams final : public RenderTestParams
26
{
27
FramebufferAttachmentParams()
28
{
29
iterationsPerStep = kIterationsPerStep;
30
31
// Common default params
32
majorVersion = 3;
33
minorVersion = 0;
34
windowWidth = kTextureSize;
35
windowHeight = kTextureSize;
36
}
37
38
std::string story() const override;
39
};
40
41
std::ostream &operator<<(std::ostream &os, const FramebufferAttachmentParams &params)
42
{
43
os << params.backendAndStory().substr(1);
44
return os;
45
}
46
47
std::string FramebufferAttachmentParams::story() const
48
{
49
std::stringstream strstr;
50
51
strstr << RenderTestParams::story();
52
53
return strstr.str();
54
}
55
56
class FramebufferAttachmentBenchmark
57
: public ANGLERenderTest,
58
public ::testing::WithParamInterface<FramebufferAttachmentParams>
59
{
60
public:
61
FramebufferAttachmentBenchmark() : ANGLERenderTest("Framebuffers", GetParam()) {}
62
void initializeBenchmark() override;
63
void drawBenchmark() override;
64
65
protected:
66
void initTextures();
67
68
std::array<GLTexture, kTextureCount> mTextures;
69
std::array<GLFramebuffer, kFboCount> mFbo;
70
};
71
72
void FramebufferAttachmentBenchmark::initializeBenchmark()
73
{
74
initTextures();
75
76
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
77
glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
78
79
ASSERT_GL_NO_ERROR();
80
81
GLint maxAttachmentCount;
82
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxAttachmentCount);
83
if (mTextures.size() > static_cast<size_t>(maxAttachmentCount))
84
{
85
// Texture count exceeds maximum attachment unit count, skip the test
86
mSkipTest = true;
87
}
88
}
89
90
void FramebufferAttachmentBenchmark::initTextures()
91
{
92
std::vector<GLubyte> textureData(kTextureSize * kTextureSize * 4);
93
for (auto &byte : textureData)
94
{
95
byte = rand() % 255u;
96
}
97
98
for (GLTexture &texture : mTextures)
99
{
100
glBindTexture(GL_TEXTURE_2D, texture);
101
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTextureSize, kTextureSize, 0, GL_RGBA,
102
GL_UNSIGNED_BYTE, textureData.data());
103
glBindTexture(GL_TEXTURE_2D, 0);
104
}
105
}
106
107
void FramebufferAttachmentBenchmark::drawBenchmark()
108
{
109
const auto &params = GetParam();
110
111
size_t fboCount = mFbo.size();
112
size_t textureCount = mTextures.size();
113
114
for (size_t it = 0; it < params.iterationsPerStep; ++it)
115
{
116
// Attach
117
for (size_t fboIndex = 0; fboIndex < fboCount; fboIndex++)
118
{
119
glBindFramebuffer(GL_FRAMEBUFFER, mFbo[fboIndex]);
120
for (size_t textureIndex = 0; textureIndex < textureCount; textureIndex++)
121
{
122
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + textureIndex,
123
GL_TEXTURE_2D, mTextures[textureIndex], 0);
124
}
125
glBindFramebuffer(GL_FRAMEBUFFER, 0);
126
}
127
128
// Detach
129
for (size_t fboIndex = 0; fboIndex < fboCount; fboIndex++)
130
{
131
glBindFramebuffer(GL_FRAMEBUFFER, mFbo[fboIndex]);
132
for (size_t index = 0; index < textureCount; index++)
133
{
134
size_t textureIndex = mTextures.size() - (index + 1);
135
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + textureIndex,
136
GL_TEXTURE_2D, 0, 0);
137
}
138
glBindFramebuffer(GL_FRAMEBUFFER, 0);
139
}
140
}
141
142
ASSERT_GL_NO_ERROR();
143
}
144
145
class FramebufferAttachmentStateUpdateBenchmark : public FramebufferAttachmentBenchmark
146
{
147
public:
148
FramebufferAttachmentStateUpdateBenchmark() : FramebufferAttachmentBenchmark() {}
149
void initializeBenchmark() override;
150
void destroyBenchmark() override;
151
void drawBenchmark() override;
152
153
private:
154
std::array<GLFramebuffer, kAdditionalFboCount> mAdditionalFbo;
155
};
156
157
void FramebufferAttachmentStateUpdateBenchmark::initializeBenchmark()
158
{
159
FramebufferAttachmentBenchmark::initializeBenchmark();
160
161
// Attach
162
for (size_t fboIndex = 0; fboIndex < mAdditionalFbo.size(); fboIndex++)
163
{
164
glBindFramebuffer(GL_FRAMEBUFFER, mAdditionalFbo[fboIndex]);
165
for (size_t textureIndex = 0; textureIndex < mTextures.size(); textureIndex++)
166
{
167
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + textureIndex,
168
GL_TEXTURE_2D, mTextures[textureIndex], 0);
169
}
170
glBindFramebuffer(GL_FRAMEBUFFER, 0);
171
}
172
}
173
174
void FramebufferAttachmentStateUpdateBenchmark::destroyBenchmark()
175
{
176
// Detach
177
for (size_t fboIndex = 0; fboIndex < mAdditionalFbo.size(); fboIndex++)
178
{
179
glBindFramebuffer(GL_FRAMEBUFFER, mAdditionalFbo[fboIndex]);
180
for (size_t index = 0; index < mTextures.size(); index++)
181
{
182
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_2D, 0,
183
0);
184
}
185
glBindFramebuffer(GL_FRAMEBUFFER, 0);
186
}
187
188
FramebufferAttachmentBenchmark::destroyBenchmark();
189
}
190
191
void FramebufferAttachmentStateUpdateBenchmark::drawBenchmark()
192
{
193
const auto &params = GetParam();
194
195
size_t textureCount = mTextures.size();
196
GLenum nearestFilter = GL_NEAREST;
197
GLenum linearFilter = GL_LINEAR;
198
for (size_t it = 0; it < params.iterationsPerStep; ++it)
199
{
200
for (size_t textureIndex = 0; textureIndex < textureCount; textureIndex++)
201
{
202
glBindTexture(GL_TEXTURE_2D, mTextures[textureIndex]);
203
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
204
(it % 2) ? linearFilter : nearestFilter);
205
glBindTexture(GL_TEXTURE_2D, 0);
206
}
207
}
208
209
ASSERT_GL_NO_ERROR();
210
}
211
212
FramebufferAttachmentParams VulkanParams()
213
{
214
FramebufferAttachmentParams params;
215
params.eglParameters = egl_platform::VULKAN_NULL();
216
217
return params;
218
}
219
220
TEST_P(FramebufferAttachmentBenchmark, Run)
221
{
222
run();
223
}
224
225
TEST_P(FramebufferAttachmentStateUpdateBenchmark, Run)
226
{
227
run();
228
}
229
230
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferAttachmentBenchmark);
231
ANGLE_INSTANTIATE_TEST(FramebufferAttachmentBenchmark, VulkanParams());
232
233
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferAttachmentStateUpdateBenchmark);
234
ANGLE_INSTANTIATE_TEST(FramebufferAttachmentStateUpdateBenchmark, VulkanParams());
235
} // namespace angle
236
237