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.
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
11
#include <gtest/gtest.h>
14
#include "test_utils/ANGLETest.h"
16
using namespace angle;
18
class EGLCreateContextAttribsTest : public ANGLETest
21
EGLCreateContextAttribsTest() : mDisplay(EGL_NO_DISPLAY) {}
23
void testSetUp() override
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);
35
// Specify invalid client version in the attributes to eglCreateContext
36
// and verify EGL_BAD_ATTRIBUTE
37
TEST_P(EGLCreateContextAttribsTest, InvalidClientVersion)
39
EGLContext context = EGL_NO_CONTEXT;
42
EGLConfig config = EGL_NO_CONFIG_KHR;
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);
50
// GLES 0.0 is invalid verify invalid attribute request
51
EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 0, EGL_CONTEXT_MINOR_VERSION, 0,
53
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs1);
54
EXPECT_EQ(context, EGL_NO_CONTEXT);
55
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
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);
62
// GLES 2.1 is invalid verify invalid attribute request
63
EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 1,
65
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs2);
66
EXPECT_EQ(context, EGL_NO_CONTEXT);
67
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
69
// GLES 3.3 is invalid verify invalid attribute request
70
EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 3,
72
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs3);
73
EXPECT_EQ(context, EGL_NO_CONTEXT);
74
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
76
// GLES 4.0 is invalid verify invalid attribute request
77
EGLint contextAttribs4[] = {EGL_CONTEXT_MAJOR_VERSION, 4, EGL_CONTEXT_MINOR_VERSION, 0,
79
context = eglCreateContext(mDisplay, config, nullptr, contextAttribs4);
80
EXPECT_EQ(context, EGL_NO_CONTEXT);
81
ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE);
84
eglTerminate(mDisplay);
87
// Choose config that doesn't support requested client version, and verify that eglCreateContext
89
TEST_P(EGLCreateContextAttribsTest, IncompatibleConfig)
91
// Get all the configs
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);
98
EGLConfig notGLES1Config = EGL_NO_CONFIG_KHR;
99
EGLConfig notGLES2Config = EGL_NO_CONFIG_KHR;
100
EGLConfig notGLES3Config = EGL_NO_CONFIG_KHR;
102
// Find non API matching configs
103
for (auto config : configs)
106
EXPECT_EGL_TRUE(eglGetConfigAttrib(mDisplay, config, EGL_RENDERABLE_TYPE, &value));
108
if (((value & EGL_OPENGL_ES_BIT) == 0) && (notGLES1Config == EGL_NO_CONFIG_KHR))
110
notGLES1Config = config;
113
if (((value & EGL_OPENGL_ES2_BIT) == 0) && (notGLES2Config == EGL_NO_CONFIG_KHR))
115
notGLES2Config = config;
118
if (((value & EGL_OPENGL_ES3_BIT) == 0) && (notGLES3Config == EGL_NO_CONFIG_KHR))
120
notGLES3Config = config;
125
// These selected configs should not be a match with the requested client version.
126
EGLContext context = EGL_NO_CONTEXT;
128
if (notGLES1Config != EGL_NO_CONFIG_KHR)
130
EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 1, EGL_CONTEXT_MINOR_VERSION, 0,
132
context = eglCreateContext(mDisplay, notGLES1Config, nullptr, contextAttribs1);
133
EXPECT_EQ(context, EGL_NO_CONTEXT);
134
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
138
if (notGLES2Config != EGL_NO_CONFIG_KHR)
140
EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 0,
142
context = eglCreateContext(mDisplay, notGLES2Config, nullptr, contextAttribs2);
143
EXPECT_EQ(context, EGL_NO_CONTEXT);
144
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
148
if (notGLES3Config != EGL_NO_CONFIG_KHR)
150
EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 0,
152
context = eglCreateContext(mDisplay, notGLES3Config, nullptr, contextAttribs3);
153
EXPECT_EQ(context, EGL_NO_CONTEXT);
154
ASSERT_EGL_ERROR(EGL_BAD_MATCH);
158
eglTerminate(mDisplay);
161
ANGLE_INSTANTIATE_TEST(EGLCreateContextAttribsTest,
162
WithNoFixture(ES2_D3D9()),
163
WithNoFixture(ES2_D3D11()),
164
WithNoFixture(ES2_OPENGL()),
165
WithNoFixture(ES2_VULKAN()),
166
WithNoFixture(ES3_D3D11()),
167
WithNoFixture(ES3_OPENGL()),
168
WithNoFixture(ES3_VULKAN()));