blob: 4a1b7b53d378777f8c05e403e0d688d178215e7f [file] [log] [blame]
//
// 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()));