Hash :
f0607639
Author :
Date :
2019-03-15T16:00:21
DisplayWGL: Allow MakeCurrent(null). Previously we would ignore unsetting calls to MakeCurrent. But this would prevent ANGLE from unsetting driver state on the current thread. Fix this by checking for 0/null explicitly in DisplayWGL::makeCurrent. This turned up when running test configs without recreating the Display. Bug: angleproject:3261 Change-Id: I7f747dc7649a06f019f1b89655cb71dd3b151aa0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1520992 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
//
// Copyright (c) 2015 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.
//
#include <gtest/gtest.h>
#include "test_utils/ANGLETest.h"
using namespace angle;
class EGLQueryContextTest : public EGLTest, public testing::WithParamInterface<PlatformParameters>
{
public:
void SetUp() override
{
EGLTest::SetUp();
int clientVersion = GetParam().majorVersion;
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_TRUE(eglInitialize(mDisplay, nullptr, nullptr) != EGL_FALSE);
EGLint ncfg;
EGLint cfgattrs[] = {EGL_RED_SIZE,
8,
EGL_GREEN_SIZE,
8,
EGL_BLUE_SIZE,
8,
EGL_RENDERABLE_TYPE,
clientVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT,
EGL_SURFACE_TYPE,
EGL_PBUFFER_BIT,
EGL_NONE};
EXPECT_TRUE(eglChooseConfig(mDisplay, cfgattrs, &mConfig, 1, &ncfg) != EGL_FALSE);
EXPECT_TRUE(ncfg == 1);
EGLint ctxattrs[] = {EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL_NONE};
mContext = eglCreateContext(mDisplay, mConfig, nullptr, ctxattrs);
EXPECT_TRUE(mContext != EGL_NO_CONTEXT);
EGLint surfattrs[] = {EGL_WIDTH, 16, EGL_HEIGHT, 16, EGL_NONE};
mSurface = eglCreatePbufferSurface(mDisplay, mConfig, surfattrs);
EXPECT_TRUE(mSurface != EGL_NO_SURFACE);
}
void TearDown() override
{
if (mDisplay != EGL_NO_DISPLAY)
{
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(mDisplay, mContext);
eglDestroySurface(mDisplay, mSurface);
eglTerminate(mDisplay);
}
ASSERT_EGL_SUCCESS() << "Error during test TearDown";
}
EGLDisplay mDisplay;
EGLConfig mConfig;
EGLContext mContext;
EGLSurface mSurface;
};
TEST_P(EGLQueryContextTest, GetConfigID)
{
EGLint configId, contextConfigId;
EXPECT_TRUE(eglGetConfigAttrib(mDisplay, mConfig, EGL_CONFIG_ID, &configId) != EGL_FALSE);
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONFIG_ID, &contextConfigId) != EGL_FALSE);
EXPECT_TRUE(configId == contextConfigId);
}
TEST_P(EGLQueryContextTest, GetClientType)
{
EGLint clientType;
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &clientType) !=
EGL_FALSE);
EXPECT_TRUE(clientType == EGL_OPENGL_ES_API);
}
TEST_P(EGLQueryContextTest, GetClientVersion)
{
EGLint clientVersion;
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_VERSION, &clientVersion) !=
EGL_FALSE);
EXPECT_TRUE(clientVersion == GetParam().majorVersion);
}
TEST_P(EGLQueryContextTest, GetRenderBufferNoSurface)
{
EGLint renderBuffer;
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE);
EXPECT_TRUE(renderBuffer == EGL_NONE);
}
TEST_P(EGLQueryContextTest, GetRenderBufferBoundSurface)
{
EGLint renderBuffer, contextRenderBuffer;
EXPECT_TRUE(eglQuerySurface(mDisplay, mSurface, EGL_RENDER_BUFFER, &renderBuffer) != EGL_FALSE);
EXPECT_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContext) != EGL_FALSE);
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_RENDER_BUFFER, &contextRenderBuffer) !=
EGL_FALSE);
EXPECT_TRUE(renderBuffer == contextRenderBuffer);
ASSERT_EGL_SUCCESS();
}
TEST_P(EGLQueryContextTest, BadDisplay)
{
EGLint val;
EXPECT_TRUE(eglQueryContext(EGL_NO_DISPLAY, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) ==
EGL_FALSE);
EXPECT_TRUE(eglGetError() == EGL_BAD_DISPLAY);
}
TEST_P(EGLQueryContextTest, NotInitialized)
{
EGLint val;
TearDown();
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_CONTEXT_CLIENT_TYPE, &val) == EGL_FALSE);
EXPECT_TRUE(eglGetError() == EGL_NOT_INITIALIZED);
mDisplay = EGL_NO_DISPLAY;
mSurface = EGL_NO_SURFACE;
mContext = EGL_NO_CONTEXT;
}
TEST_P(EGLQueryContextTest, BadContext)
{
EGLint val;
EXPECT_TRUE(eglQueryContext(mDisplay, EGL_NO_CONTEXT, EGL_CONTEXT_CLIENT_TYPE, &val) ==
EGL_FALSE);
EXPECT_TRUE(eglGetError() == EGL_BAD_CONTEXT);
}
TEST_P(EGLQueryContextTest, BadAttribute)
{
EGLint val;
EXPECT_TRUE(eglQueryContext(mDisplay, mContext, EGL_HEIGHT, &val) == EGL_FALSE);
EXPECT_TRUE(eglGetError() == EGL_BAD_ATTRIBUTE);
}
ANGLE_INSTANTIATE_TEST(EGLQueryContextTest,
ES2_D3D9(),
ES2_D3D11(),
ES2_D3D11_FL9_3(),
ES2_OPENGL(),
ES2_VULKAN(),
ES3_D3D11(),
ES3_OPENGL());