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