| // | |
| // Copyright 2019 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // EGLCreateContectAttribsTest.cpp: | |
| // This suite of test cases test invalid attributes passed to eglCreateContext | |
| // Section 3.7.1 of EGL 1.5 specification provides error cases | |
| // | |
| #include <gtest/gtest.h> | |
| #include <vector> | |
| #include "test_utils/ANGLETest.h" | |
| using namespace angle; | |
| class EGLCreateContextAttribsTest : public ANGLETest | |
| { | |
| public: | |
| EGLCreateContextAttribsTest() : mDisplay(EGL_NO_DISPLAY) {} | |
| void testSetUp() override | |
| { | |
| EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE}; | |
| mDisplay = eglGetPlatformDisplayEXT( | |
| EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs); | |
| EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY); | |
| EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr) != EGL_FALSE); | |
| } | |
| EGLDisplay mDisplay; | |
| }; | |
| // Specify invalid client version in the attributes to eglCreateContext | |
| // and verify EGL_BAD_ATTRIBUTE | |
| TEST_P(EGLCreateContextAttribsTest, InvalidClientVersion) | |
| { | |
| EGLContext context = EGL_NO_CONTEXT; | |
| // Pick config | |
| EGLConfig config = EGL_NO_CONFIG_KHR; | |
| EGLint count = 0; | |
| // Get a 1.0 compatible config | |
| EGLint cfgAttribList1[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, EGL_NONE}; | |
| EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, cfgAttribList1, &config, 1, &count)); | |
| ANGLE_SKIP_TEST_IF(count == 0); | |
| // GLES 0.0 is invalid verify invalid attribute request | |
| EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 0, EGL_CONTEXT_MINOR_VERSION, 0, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, config, nullptr, contextAttribs1); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE); | |
| // Get a 2.0/3.x compatible config | |
| EGLint cfgAttribList2[] = {EGL_RENDERABLE_TYPE, (EGL_OPENGL_ES2_BIT), EGL_NONE}; | |
| EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, cfgAttribList2, &config, 1, &count)); | |
| ASSERT_TRUE(count > 0); | |
| // GLES 2.1 is invalid verify invalid attribute request | |
| EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 1, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, config, nullptr, contextAttribs2); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE); | |
| // GLES 3.3 is invalid verify invalid attribute request | |
| EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 3, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, config, nullptr, contextAttribs3); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE); | |
| // GLES 4.0 is invalid verify invalid attribute request | |
| EGLint contextAttribs4[] = {EGL_CONTEXT_MAJOR_VERSION, 4, EGL_CONTEXT_MINOR_VERSION, 0, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, config, nullptr, contextAttribs4); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_ATTRIBUTE); | |
| // Cleanup contexts | |
| eglTerminate(mDisplay); | |
| } | |
| // Choose config that doesn't support requested client version, and verify that eglCreateContext | |
| // sets EGL_BAD_MATCH | |
| TEST_P(EGLCreateContextAttribsTest, IncompatibleConfig) | |
| { | |
| // Get all the configs | |
| EGLint count; | |
| EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, nullptr, 0, &count) != EGL_FALSE); | |
| EXPECT_TRUE(count > 0); | |
| std::vector<EGLConfig> configs(count); | |
| EXPECT_EGL_TRUE(eglGetConfigs(mDisplay, configs.data(), count, &count) != EGL_FALSE); | |
| EGLConfig notGLES1Config = EGL_NO_CONFIG_KHR; | |
| EGLConfig notGLES2Config = EGL_NO_CONFIG_KHR; | |
| EGLConfig notGLES3Config = EGL_NO_CONFIG_KHR; | |
| // Find non API matching configs | |
| for (auto config : configs) | |
| { | |
| EGLint value = 0; | |
| EXPECT_EGL_TRUE(eglGetConfigAttrib(mDisplay, config, EGL_RENDERABLE_TYPE, &value)); | |
| if (((value & EGL_OPENGL_ES_BIT) == 0) && (notGLES1Config == EGL_NO_CONFIG_KHR)) | |
| { | |
| notGLES1Config = config; | |
| continue; | |
| } | |
| if (((value & EGL_OPENGL_ES2_BIT) == 0) && (notGLES2Config == EGL_NO_CONFIG_KHR)) | |
| { | |
| notGLES2Config = config; | |
| continue; | |
| } | |
| if (((value & EGL_OPENGL_ES3_BIT) == 0) && (notGLES3Config == EGL_NO_CONFIG_KHR)) | |
| { | |
| notGLES3Config = config; | |
| continue; | |
| } | |
| } | |
| // These selected configs should not be a match with the requested client version. | |
| EGLContext context = EGL_NO_CONTEXT; | |
| // Check GLES1 | |
| if (notGLES1Config != EGL_NO_CONFIG_KHR) | |
| { | |
| EGLint contextAttribs1[] = {EGL_CONTEXT_MAJOR_VERSION, 1, EGL_CONTEXT_MINOR_VERSION, 0, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, notGLES1Config, nullptr, contextAttribs1); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_MATCH); | |
| } | |
| // Check GLES2 | |
| if (notGLES2Config != EGL_NO_CONFIG_KHR) | |
| { | |
| EGLint contextAttribs2[] = {EGL_CONTEXT_MAJOR_VERSION, 2, EGL_CONTEXT_MINOR_VERSION, 0, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, notGLES2Config, nullptr, contextAttribs2); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_MATCH); | |
| } | |
| // Check GLES3 | |
| if (notGLES3Config != EGL_NO_CONFIG_KHR) | |
| { | |
| EGLint contextAttribs3[] = {EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 0, | |
| EGL_NONE}; | |
| context = eglCreateContext(mDisplay, notGLES3Config, nullptr, contextAttribs3); | |
| EXPECT_EQ(context, EGL_NO_CONTEXT); | |
| ASSERT_EGL_ERROR(EGL_BAD_MATCH); | |
| } | |
| // Cleanup contexts | |
| eglTerminate(mDisplay); | |
| } | |
| ANGLE_INSTANTIATE_TEST(EGLCreateContextAttribsTest, | |
| WithNoFixture(ES2_D3D9()), | |
| WithNoFixture(ES2_D3D11()), | |
| WithNoFixture(ES2_OPENGL()), | |
| WithNoFixture(ES2_VULKAN()), | |
| WithNoFixture(ES3_D3D11()), | |
| WithNoFixture(ES3_OPENGL()), | |
| WithNoFixture(ES3_VULKAN())); |