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