Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/egl_tests/EGLCreateContextAttribsTest.cpp
1693 views
1
//
2
// Copyright 2019 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
// EGLCreateContectAttribsTest.cpp:
7
// This suite of test cases test invalid attributes passed to eglCreateContext
8
// Section 3.7.1 of EGL 1.5 specification provides error cases
9
//
10
11
#include <gtest/gtest.h>
12
#include <vector>
13
14
#include "test_utils/ANGLETest.h"
15
16
using namespace angle;
17
18
class EGLCreateContextAttribsTest : public ANGLETest
19
{
20
public:
21
EGLCreateContextAttribsTest() : mDisplay(EGL_NO_DISPLAY) {}
22
23
void testSetUp() override
24
{
25
EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
26
mDisplay = eglGetPlatformDisplayEXT(
27
EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
28
EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
29
EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr) != EGL_FALSE);
30
}
31
32
EGLDisplay mDisplay;
33
};
34
35
// Specify invalid client version in the attributes to eglCreateContext
36
// and verify EGL_BAD_ATTRIBUTE
37
TEST_P(EGLCreateContextAttribsTest, InvalidClientVersion)
38
{
39
EGLContext context = EGL_NO_CONTEXT;
40
41
// Pick config
42
EGLConfig config = EGL_NO_CONFIG_KHR;
43
EGLint count = 0;
44
45
// Get a 1.0 compatible config
46
EGLint cfgAttribList1[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, EGL_NONE};
47
EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, cfgAttribList1, &config, 1, &count));
48
ANGLE_SKIP_TEST_IF(count == 0);
49
50
// GLES 0.0 is invalid verify invalid attribute request
51
EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 0, EGL_CONTEXT_MINOR_VERSION, 0,
52
EGL_NONE};
53
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs1);
54
EXPECT_EQ(context, EGL_NO_CONTEXT);
55
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
56
57
// Get a 2.0/3.x compatible config
58
EGLint cfgAttribList2[] = {EGL_RENDERABLE_TYPE, (EGL_OPENGL_ES2_BIT), EGL_NONE};
59
EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, cfgAttribList2, &config, 1, &count));
60
ASSERT_TRUE(count > 0);
61
62
// GLES 2.1 is invalid verify invalid attribute request
63
EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 1,
64
EGL_NONE};
65
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs2);
66
EXPECT_EQ(context, EGL_NO_CONTEXT);
67
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
68
69
// GLES 3.3 is invalid verify invalid attribute request
70
EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 3,
71
EGL_NONE};
72
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs3);
73
EXPECT_EQ(context, EGL_NO_CONTEXT);
74
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
75
76
// GLES 4.0 is invalid verify invalid attribute request
77
EGLint contextAttribs4[] = {EGL_CONTEXT_MAJOR_VERSION, 4, EGL_CONTEXT_MINOR_VERSION, 0,
78
EGL_NONE};
79
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs4);
80
EXPECT_EQ(context, EGL_NO_CONTEXT);
81
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
82
83
// Cleanup contexts
84
eglTerminate(mDisplay);
85
}
86
87
// Choose config that doesn't support requested client version, and verify that eglCreateContext
88
// sets EGL_BAD_MATCH
89
TEST_P(EGLCreateContextAttribsTest, IncompatibleConfig)
90
{
91
// Get all the configs
92
EGLint count;
93
EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &count) != EGL_FALSE);
94
EXPECT_TRUE(count > 0);
95
std::vector<EGLConfig> configs(count);
96
EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, configs.data(), count, &count) != EGL_FALSE);
97
98
EGLConfig notGLES1Config = EGL_NO_CONFIG_KHR;
99
EGLConfig notGLES2Config = EGL_NO_CONFIG_KHR;
100
EGLConfig notGLES3Config = EGL_NO_CONFIG_KHR;
101
102
// Find non API matching configs
103
for (auto config : configs)
104
{
105
EGLint value = 0;
106
EXPECT_EGL_TRUE(eglGetConfigAttrib(mDisplay, config, EGL_RENDERABLE_TYPE, &value));
107
108
if (((value & EGL_OPENGL_ES_BIT) == 0) && (notGLES1Config == EGL_NO_CONFIG_KHR))
109
{
110
notGLES1Config = config;
111
continue;
112
}
113
if (((value & EGL_OPENGL_ES2_BIT) == 0) && (notGLES2Config == EGL_NO_CONFIG_KHR))
114
{
115
notGLES2Config = config;
116
continue;
117
}
118
if (((value & EGL_OPENGL_ES3_BIT) == 0) && (notGLES3Config == EGL_NO_CONFIG_KHR))
119
{
120
notGLES3Config = config;
121
continue;
122
}
123
}
124
125
// These selected configs should not be a match with the requested client version.
126
EGLContext context = EGL_NO_CONTEXT;
127
// Check GLES1
128
if (notGLES1Config != EGL_NO_CONFIG_KHR)
129
{
130
EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 1, EGL_CONTEXT_MINOR_VERSION, 0,
131
EGL_NONE};
132
context = eglCreateContext(mDisplay, notGLES1Config, nullptr, contextAttribs1);
133
EXPECT_EQ(context, EGL_NO_CONTEXT);
134
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
135
}
136
137
// Check GLES2
138
if (notGLES2Config != EGL_NO_CONFIG_KHR)
139
{
140
EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 0,
141
EGL_NONE};
142
context = eglCreateContext(mDisplay, notGLES2Config, nullptr, contextAttribs2);
143
EXPECT_EQ(context, EGL_NO_CONTEXT);
144
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
145
}
146
147
// Check GLES3
148
if (notGLES3Config != EGL_NO_CONFIG_KHR)
149
{
150
EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 0,
151
EGL_NONE};
152
context = eglCreateContext(mDisplay, notGLES3Config, nullptr, contextAttribs3);
153
EXPECT_EQ(context, EGL_NO_CONTEXT);
154
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
155
}
156
157
// Cleanup contexts
158
eglTerminate(mDisplay);
159
}
160
161
// EGL_IMG_context_priority - set and get attribute
162
TEST_P(EGLCreateContextAttribsTest, IMGContextPriorityExtension)
163
{
164
const EGLint configAttributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8,
165
EGL_BLUE_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
166
EGL_NONE};
167
168
// Get all the configs
169
EGLint count;
170
EGLConfig config;
171
EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, configAttributes, &config, 1, &count));
172
EXPECT_TRUE(count == 1);
173
174
EGLContext context = EGL_NO_CONTEXT;
175
EGLint contextAttribs[] = {EGL_CONTEXT_MAJOR_VERSION,
176
2,
177
EGL_CONTEXT_MINOR_VERSION,
178
0,
179
EGL_CONTEXT_PRIORITY_LEVEL_IMG,
180
EGL_CONTEXT_PRIORITY_HIGH_IMG,
181
EGL_NONE};
182
183
if (IsEGLDisplayExtensionEnabled(mDisplay, "EGL_IMG_context_priority"))
184
{
185
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs);
186
EXPECT_NE(context, EGL_NO_CONTEXT);
187
ASSERT_EGL_ERROR(EGL_SUCCESS);
188
189
EGLint value = 0;
190
EXPECT_EGL_TRUE(eglQueryContext(mDisplay, context, EGL_CONTEXT_PRIORITY_LEVEL_IMG, &value));
191
ASSERT_EGL_ERROR(EGL_SUCCESS);
192
}
193
else // Not supported so should get EGL_BAD_ATTRIBUTE
194
{
195
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs);
196
EXPECT_EQ(context, EGL_NO_CONTEXT);
197
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
198
199
EGLint contextAttribs[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 0,
200
EGL_NONE};
201
202
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs);
203
EXPECT_NE(context, EGL_NO_CONTEXT);
204
ASSERT_EGL_ERROR(EGL_SUCCESS);
205
206
EGLint value = 0;
207
EXPECT_EGL_FALSE(
208
eglQueryContext(mDisplay, context, EGL_CONTEXT_PRIORITY_LEVEL_IMG, &value));
209
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
210
}
211
212
// Cleanup contexts
213
ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
214
eglDestroyContext(mDisplay, context);
215
eglTerminate(mDisplay);
216
}
217
218
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLCreateContextAttribsTest);
219
ANGLE_INSTANTIATE_TEST(EGLCreateContextAttribsTest,
220
WithNoFixture(ES2_D3D9()),
221
WithNoFixture(ES2_D3D11()),
222
WithNoFixture(ES2_OPENGL()),
223
WithNoFixture(ES2_VULKAN()),
224
WithNoFixture(ES3_D3D11()),
225
WithNoFixture(ES3_OPENGL()),
226
WithNoFixture(ES3_VULKAN()));
227
228