1 //
2 // Copyright 2015 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.
5 //
6
7 #include <gtest/gtest.h>
8
9 #include "test_utils/ANGLETest.h"
10
11 using namespace angle;
12
13 class EGLQueryContextTest : public ANGLETest
14 {
15 public:
testSetUp()16 void testSetUp() override
17 {
18 int clientVersion = GetParam().majorVersion;
19
20 EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE};
21 mDisplay = eglGetPlatformDisplayEXT(
22 EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs);
23 EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY);
24 EXPECT_TRUE(eglInitialize(mDisplay, nullptr, nullptr) != EGL_FALSE);
25
26 EGLint ncfg;
27 EGLint cfgattrs[] = {EGL_RED_SIZE,
28 8,
29 EGL_GREEN_SIZE,
30 8,
31 EGL_BLUE_SIZE,
32 8,
33 EGL_RENDERABLE_TYPE,
34 clientVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT,
35 EGL_SURFACE_TYPE,
36 EGL_PBUFFER_BIT,
37 EGL_NONE};
38 EXPECT_TRUE(eglChooseConfig(mDisplay, cfgattrs, &mConfig, 1, &ncfg) != EGL_FALSE);
39 EXPECT_TRUE(ncfg == 1);
40
41 EGLint ctxattrs[] = {EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL_NONE};
42 mContext = eglCreateContext(mDisplay, mConfig, nullptr, ctxattrs);
43 EXPECT_TRUE(mContext != EGL_NO_CONTEXT);
44
45 EGLint surfattrs[] = {EGL_WIDTH, 16, EGL_HEIGHT, 16, EGL_NONE};
46 mSurface = eglCreatePbufferSurface(mDisplay, mConfig, surfattrs);
47 EXPECT_TRUE(mSurface != EGL_NO_SURFACE);
48 }
49
testTearDown()50 void testTearDown() override
51 {
52 if (mDisplay != EGL_NO_DISPLAY)
53 {
54 eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
55 eglDestroyContext(mDisplay, mContext);
56 eglDestroySurface(mDisplay, mSurface);
57 eglTerminate(mDisplay);
58 }
59 ASSERT_EGL_SUCCESS() << "Error during test TearDown";
60 }
61
62 EGLDisplay mDisplay;
63 EGLConfig mConfig;
64 EGLContext mContext;
65 EGLSurface mSurface;
66 };
67
TEST_P(EGLQueryContextTest,GetConfigID)68 TEST_P(EGLQueryContextTest, GetConfigID)
69 {
70 EGLint configId, contextConfigId;
71 EXPECT_TRUE(eglGetConfigAttrib(mDisplay, mConfig, EGL_CONFIG_ID, &configId) != EGL_FALSE);
72 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONFIG_ID, &contextConfigId) != EGL_FALSE);
73 EXPECT_TRUE(configId == contextConfigId);
74 }
75
TEST_P(EGLQueryContextTest,GetClientType)76 TEST_P(EGLQueryContextTest, GetClientType)
77 {
78 EGLint clientType;
79 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &clientType) !=
80 EGL_FALSE);
81 EXPECT_TRUE(clientType == EGL_OPENGL_ES_API);
82 }
83
TEST_P(EGLQueryContextTest,GetClientVersion)84 TEST_P(EGLQueryContextTest, GetClientVersion)
85 {
86 EGLint clientVersion;
87 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_VERSION, &clientVersion) !=
88 EGL_FALSE);
89 EXPECT_GE(clientVersion, GetParam().majorVersion);
90 }
91
TEST_P(EGLQueryContextTest,GetRenderBufferNoSurface)92 TEST_P(EGLQueryContextTest, GetRenderBufferNoSurface)
93 {
94 EGLint renderBuffer;
95 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE);
96 EXPECT_TRUE(renderBuffer == EGL_NONE);
97 }
98
TEST_P(EGLQueryContextTest,GetRenderBufferBoundSurface)99 TEST_P(EGLQueryContextTest, GetRenderBufferBoundSurface)
100 {
101 EGLint renderBuffer, contextRenderBuffer;
102 EXPECT_TRUE(eglQuerySurface(mDisplay, mSurface, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE);
103 EXPECT_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContext) != EGL_FALSE);
104 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &contextRenderBuffer) !=
105 EGL_FALSE);
106 EXPECT_TRUE(renderBuffer == contextRenderBuffer);
107 ASSERT_EGL_SUCCESS();
108 }
109
TEST_P(EGLQueryContextTest,BadDisplay)110 TEST_P(EGLQueryContextTest, BadDisplay)
111 {
112 EGLint val;
113 EXPECT_TRUE(eglQueryContext(EGL_NO_DISPLAY, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) ==
114 EGL_FALSE);
115 EXPECT_TRUE(eglGetError() == EGL_BAD_DISPLAY);
116 }
117
TEST_P(EGLQueryContextTest,NotInitialized)118 TEST_P(EGLQueryContextTest, NotInitialized)
119 {
120 EGLint val;
121 testTearDown();
122 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) == EGL_FALSE);
123 EXPECT_TRUE(eglGetError() == EGL_NOT_INITIALIZED);
124
125 mDisplay = EGL_NO_DISPLAY;
126 mSurface = EGL_NO_SURFACE;
127 mContext = EGL_NO_CONTEXT;
128 }
129
TEST_P(EGLQueryContextTest,BadContext)130 TEST_P(EGLQueryContextTest, BadContext)
131 {
132 EGLint val;
133 EXPECT_TRUE(eglQueryContext(mDisplay, EGL_NO_CONTEXT, EGL_CONTEXT_CLIENT_TYPE, &val) ==
134 EGL_FALSE);
135 EXPECT_TRUE(eglGetError() == EGL_BAD_CONTEXT);
136 }
137
TEST_P(EGLQueryContextTest,BadAttribute)138 TEST_P(EGLQueryContextTest, BadAttribute)
139 {
140 EGLint val;
141 EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_HEIGHT, &val) == EGL_FALSE);
142 EXPECT_TRUE(eglGetError() == EGL_BAD_ATTRIBUTE);
143 }
144
145 ANGLE_INSTANTIATE_TEST(EGLQueryContextTest,
146 WithNoFixture(ES2_D3D9()),
147 WithNoFixture(ES2_D3D11()),
148 WithNoFixture(ES2_OPENGL()),
149 WithNoFixture(ES2_VULKAN()),
150 WithNoFixture(ES3_D3D11()),
151 WithNoFixture(ES3_OPENGL()));
152