diff options
author | zmo <zmo@chromium.org> | 2016-02-25 11:24:35 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-25 19:26:48 +0000 |
commit | 0df7774c8d57adb794693f98733c610715c0879c (patch) | |
tree | b61b8920cb69cbb0301c8185f6670a5299930b66 /gpu/command_buffer/tests | |
parent | af0f476939fbbad4ed6c32548c974c55fe663900 (diff) | |
download | chromium_src-0df7774c8d57adb794693f98733c610715c0879c.zip chromium_src-0df7774c8d57adb794693f98733c610715c0879c.tar.gz chromium_src-0df7774c8d57adb794693f98733c610715c0879c.tar.bz2 |
Revert of command_buffer_gles2: Implement EGL default Display as a global object (patchset #8 id:140001 of https://codereview.chromium.org/1714883002/ )
Reason for revert:
Broke gles2_conform on mac/linux GPU bots on FYI waterfall
GTFNativeCreateWindow failed
Original issue's description:
> command_buffer_gles2: Implement EGL default Display as a global object
>
> Make EGL Display a global. eglGetDisplay(EGL_DEFAULT_DISPLAY) will
> return the same object.
>
> Store EGL state in a new thread-local object (ThreadState). One
> display, multiple surfaces, multiple contexts.
>
> Fix the currently implemented entry points to return specified errors
> and behave as specified. Notable changes:
> * eglGetDisplay() does not create new displays for each invocation
> * eglTerminate() invalidates the created egl objects but leaves the
> current context intact as specified
> * eglMakeCurrent() is implemented more correctly with refcount semantics
> * eglQueryStrings() works without display for some names
> * eglReleaseThread() is implemeted
> * Config are now separate for pbuffers and windows, so that contexts
> can be created separate from surfaces
> * Context can be made current with different surfaces
> * Catches errors related to context being set current to multiple
> threads
> * Tries to be thread-safe
>
> In the implementation, the Display contains a lock ensuring all thread
> accesses are consistent. All functions using or changing thread-local
> state have explicit egl::ThreadState parameter.
>
> BUG=581634
> CQ_INCLUDE_TRYBOTS=tryserver.chromium.win:win_optional_gpu_tests_rel
>
> Committed: https://crrev.com/de9aa3be41bca094454babbd62907815fad7f5c2
> Cr-Commit-Position: refs/heads/master@{#377535}
TBR=piman@chromium.org,thakis@chromium.org,kkinnunen@nvidia.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=581634
Review URL: https://codereview.chromium.org/1739033002
Cr-Commit-Position: refs/heads/master@{#377641}
Diffstat (limited to 'gpu/command_buffer/tests')
-rw-r--r-- | gpu/command_buffer/tests/egl_test.cc | 580 |
1 files changed, 11 insertions, 569 deletions
diff --git a/gpu/command_buffer/tests/egl_test.cc b/gpu/command_buffer/tests/egl_test.cc index 05465d94..bf7e30e 100644 --- a/gpu/command_buffer/tests/egl_test.cc +++ b/gpu/command_buffer/tests/egl_test.cc @@ -6,589 +6,31 @@ #include "testing/gtest/include/gtest/gtest.h" #include <EGL/egl.h> -#include <GLES2/gl2.h> - -#include "base/bind.h" -#include "base/synchronization/waitable_event.h" -#include "base/threading/thread.h" // This file tests EGL basic interface for command_buffer_gles2, the mode of // command buffer where the code is compiled as a standalone dynamic library and // exposed through EGL API. namespace gpu { -class EGLTest : public testing::Test { - public: - void TearDown() override; -}; - -void EGLTest::TearDown() { - EXPECT_TRUE(eglReleaseThread()); -} - -TEST_F(EGLTest, OnlyReleaseThread) {} - -TEST_F(EGLTest, GetDisplay) { - EGLDisplay display1 = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display1, EGL_NO_DISPLAY); - - EGLDisplay display2 = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_EQ(display1, display2); - - EGLNativeDisplayType invalid_display_type = - reinterpret_cast<EGLNativeDisplayType>(0x1); - EXPECT_NE(invalid_display_type, EGL_DEFAULT_DISPLAY); - EXPECT_EQ(EGL_NO_DISPLAY, eglGetDisplay(invalid_display_type)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - // eglTerminate can be called with uninitialized display. - EXPECT_TRUE(eglTerminate(display1)); -} +using testing::Test; -TEST_F(EGLTest, GetError) { - // GetError returns success. - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - // "calling eglGetError twice without any other intervening EGL calls will - // always return EGL_SUCCESS on the second call" - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_EQ(nullptr, eglQueryString(display, EGL_EXTENSIONS)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - EXPECT_TRUE(eglTerminate(display)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); -} - -TEST_F(EGLTest, Initialize) { +TEST_F(Test, BasicEGLInitialization) { EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); + ASSERT_NE(display, EGL_NO_DISPLAY); // Test for no crash even though passing nullptrs for major, minor. - EXPECT_TRUE(eglInitialize(display, nullptr, nullptr)); + EGLBoolean success = eglInitialize(display, nullptr, nullptr); + ASSERT_TRUE(success); EGLint major = 0; EGLint minor = 0; - EXPECT_TRUE(eglInitialize(display, &major, &minor)); - EXPECT_EQ(major, 1); - EXPECT_EQ(minor, 4); - - EGLDisplay invalid_display = reinterpret_cast<EGLDisplay>(0x1); - EXPECT_FALSE(eglInitialize(invalid_display, nullptr, nullptr)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); -} - -TEST_F(EGLTest, Terminate) { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - - // eglTerminate can be called multiple times without initialization. - EXPECT_TRUE(eglTerminate(display)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_TRUE(eglTerminate(display)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - EXPECT_TRUE(eglInitialize(display, nullptr, nullptr)); - - // eglTerminate can be called multiple times. - EXPECT_TRUE(eglTerminate(display)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_TRUE(eglTerminate(display)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - // After Terminate, an egl call returns not initialized. - EXPECT_EQ(nullptr, eglQueryString(display, EGL_EXTENSIONS)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - - // Re-initialization of same display. - EXPECT_TRUE(eglInitialize(display, nullptr, nullptr)); - EXPECT_NE(nullptr, eglQueryString(display, EGL_EXTENSIONS)); - EXPECT_TRUE(eglTerminate(display)); - - EGLDisplay invalid_display = reinterpret_cast<EGLDisplay>(0x1); - EXPECT_FALSE(eglTerminate(invalid_display)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); -} - -TEST_F(EGLTest, QueryString) { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - EXPECT_EQ(nullptr, eglQueryString(display, EGL_EXTENSIONS)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - EXPECT_STREQ("", eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS)); - - EXPECT_EQ(nullptr, eglQueryString(display, EGL_VERSION)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - EXPECT_STREQ("1.4", eglQueryString(EGL_NO_DISPLAY, EGL_VERSION)); - - EXPECT_EQ(nullptr, eglQueryString(display, EGL_CLIENT_APIS)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - EXPECT_EQ(nullptr, eglQueryString(EGL_NO_DISPLAY, EGL_CLIENT_APIS)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); - EXPECT_EQ(nullptr, eglQueryString(display, EGL_VENDOR)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - EXPECT_EQ(nullptr, eglQueryString(EGL_NO_DISPLAY, EGL_VENDOR)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); - - EXPECT_TRUE(eglInitialize(display, nullptr, nullptr)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - EXPECT_STREQ("", eglQueryString(display, EGL_EXTENSIONS)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_STREQ("1.4", eglQueryString(display, EGL_VERSION)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_STREQ("OpenGL_ES", eglQueryString(display, EGL_CLIENT_APIS)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - EXPECT_STREQ("Google Inc.", eglQueryString(display, EGL_VENDOR)); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); -} - -TEST_F(EGLTest, GetConfigsUninitialized) { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - - EGLint num_config = 0; - const int kConfigsSize = 5; - EGLConfig configs[kConfigsSize] = { - 0, - }; - - EXPECT_FALSE(eglGetConfigs(display, configs, kConfigsSize, &num_config)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - - EXPECT_FALSE(eglGetConfigs(display, configs, kConfigsSize, nullptr)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); -} - -TEST_F(EGLTest, ChooseConfigUninitialized) { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_NONE}; - const int kConfigsSize = 5; - EGLConfig configs[kConfigsSize] = { - 0, - }; - - EXPECT_FALSE(eglChooseConfig(display, attrib_list, configs, kConfigsSize, - &num_config)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); - - EXPECT_FALSE( - eglChooseConfig(display, attrib_list, configs, kConfigsSize, nullptr)); - EXPECT_EQ(EGL_NOT_INITIALIZED, eglGetError()); -} - -class EGLConfigTest : public EGLTest { - public: - void SetUp() override; - - protected: - void CheckConfigsExist(EGLint num_config); - - enum { kConfigsSize = 5 }; - EGLDisplay display_; - EGLConfig configs_[kConfigsSize]; -}; - -void EGLConfigTest::SetUp() { - display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); - ASSERT_NE(display_, EGL_NO_DISPLAY); - EXPECT_TRUE(eglInitialize(display_, nullptr, nullptr)); - memset(configs_, 0, sizeof(configs_)); -} - -void EGLConfigTest::CheckConfigsExist(EGLint num_config) { - EGLint i; - if (num_config > kConfigsSize) - num_config = static_cast<EGLint>(kConfigsSize); - for (i = 0; i < num_config; ++i) - EXPECT_NE(nullptr, configs_[i]); - for (; i < kConfigsSize; ++i) - EXPECT_EQ(nullptr, configs_[i]); -} - -TEST_F(EGLConfigTest, GetConfigsBadNumConfigs) { - EXPECT_FALSE(eglGetConfigs(display_, configs_, kConfigsSize, nullptr)); - EXPECT_EQ(EGL_BAD_PARAMETER, eglGetError()); -} - -TEST_F(EGLConfigTest, GetConfigsNullConfigs) { - EGLint num_config = 0; - EXPECT_TRUE(eglGetConfigs(display_, nullptr, 55, &num_config)); - EXPECT_GT(num_config, 0); -} - -TEST_F(EGLConfigTest, GetConfigsZeroConfigsSize) { - EGLint num_config = 0; - EXPECT_TRUE(eglGetConfigs(display_, configs_, 0, &num_config)); - EXPECT_GT(num_config, 0); - EXPECT_EQ(nullptr, configs_[0]); -} - -TEST_F(EGLConfigTest, GetConfigs) { - EGLint num_config = 0; - EXPECT_TRUE(eglGetConfigs(display_, configs_, kConfigsSize, &num_config)); - EXPECT_GT(num_config, 0); - CheckConfigsExist(num_config); -} - -TEST_F(EGLConfigTest, ChooseConfigBadNumConfigs) { - EGLint attrib_list[] = {EGL_NONE}; - EXPECT_FALSE( - eglChooseConfig(display_, attrib_list, configs_, kConfigsSize, nullptr)); - EXPECT_EQ(EGL_BAD_PARAMETER, eglGetError()); -} - -TEST_F(EGLConfigTest, ChooseConfigNullConfigs) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, nullptr, 55, &num_config)); - EXPECT_GT(num_config, 0); -} - -TEST_F(EGLConfigTest, ChooseConfigZeroConfigsSize) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, configs_, 0, &num_config)); - EXPECT_GT(num_config, 0); - EXPECT_EQ(nullptr, configs_[0]); -} - -TEST_F(EGLConfigTest, ChooseConfig) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, configs_, kConfigsSize, - &num_config)); - EXPECT_GT(num_config, 0); - CheckConfigsExist(num_config); -} - -TEST_F(EGLConfigTest, ChooseConfigInvalidAttrib) { - const EGLint kNotModified = 55; - EGLint num_config = kNotModified; - EGLint invalid_attrib_list[] = {0xABCD}; - EXPECT_FALSE(eglChooseConfig(display_, invalid_attrib_list, configs_, - kConfigsSize, &num_config)); - EXPECT_EQ(EGL_BAD_ATTRIBUTE, eglGetError()); - EXPECT_EQ(kNotModified, num_config); -} - -TEST_F(EGLConfigTest, ChooseConfigWindow) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, configs_, kConfigsSize, - &num_config)); - EXPECT_GT(num_config, 0); - for (int i = 0; i < num_config; ++i) { - EGLint value = EGL_NONE; - eglGetConfigAttrib(display_, configs_[i], EGL_SURFACE_TYPE, &value); - EXPECT_NE(0, value & EGL_WINDOW_BIT); - } -} - -TEST_F(EGLConfigTest, ChooseConfigPBuffer) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, configs_, kConfigsSize, - &num_config)); - EXPECT_GT(num_config, 0); - for (int i = 0; i < num_config; ++i) { - EGLint value = EGL_NONE; - eglGetConfigAttrib(display_, configs_[0], EGL_SURFACE_TYPE, &value); - EXPECT_NE(0, value & EGL_PBUFFER_BIT); - } -} - -TEST_F(EGLConfigTest, ChooseConfigWindowPBufferNotPossible) { - EGLint num_config = 0; - EGLint attrib_list[] = {EGL_SURFACE_TYPE, EGL_PBUFFER_BIT | EGL_WINDOW_BIT, - EGL_NONE}; - EXPECT_TRUE(eglChooseConfig(display_, attrib_list, configs_, kConfigsSize, - &num_config)); - EXPECT_EQ(0, num_config); -} - -TEST_F(EGLConfigTest, ChooseConfigBugExample) { - static const EGLint kConfigAttribs[] = { - EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, - EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, - EGL_SAMPLE_BUFFERS, 1, EGL_SAMPLES, 4, EGL_NONE}; - EGLint num_config = 0; - EXPECT_TRUE(eglChooseConfig(display_, kConfigAttribs, configs_, kConfigsSize, - &num_config)); - - // The EGL attribs are not really implemented at the moment. - EGLint value = EGL_NONE; - EXPECT_TRUE(eglGetConfigAttrib(display_, configs_[0], EGL_RED_SIZE, &value)); - EXPECT_EQ(0, value); -} - -TEST_F(EGLTest, MakeCurrent) { - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_NE(display, EGL_NO_DISPLAY); - // "This is the only case where an uninitialized display may be passed to - // eglMakeCurrent." - EXPECT_TRUE( - eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - EGLDisplay invalid_display = reinterpret_cast<EGLDisplay>(0x1); - EXPECT_FALSE(eglMakeCurrent(invalid_display, EGL_NO_SURFACE, EGL_NO_SURFACE, - EGL_NO_CONTEXT)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); - - EXPECT_TRUE(eglInitialize(display, nullptr, nullptr)); - EXPECT_TRUE( - eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - EXPECT_FALSE(eglMakeCurrent(invalid_display, EGL_NO_SURFACE, EGL_NO_SURFACE, - EGL_NO_CONTEXT)); -} - -class EGLSurfaceTest : public EGLTest { - public: - void SetUp() override; - void CreateSurfaceAndContext(EGLSurface* surface, EGLContext* context); - - protected: - EGLDisplay display_; -}; - -void EGLSurfaceTest::SetUp() { - EGLTest::SetUp(); - display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); - EXPECT_TRUE(eglInitialize(display_, nullptr, nullptr)); -} - -void EGLSurfaceTest::CreateSurfaceAndContext(EGLSurface* surface, - EGLContext* context) { - static const EGLint config_attribs[] = {EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, - EGL_NONE}; - EGLint num_config; - EGLConfig config; - EXPECT_TRUE( - eglChooseConfig(display_, config_attribs, &config, 1, &num_config)); - ASSERT_GT(num_config, 0); - static const EGLint surface_attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, - EGL_NONE}; - *surface = eglCreatePbufferSurface(display_, config, surface_attribs); - static const EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, - EGL_NONE}; - *context = eglCreateContext(display_, config, nullptr, context_attribs); -} - -class EGLMultipleSurfacesContextsTest : public EGLSurfaceTest { - public: - void SetUp() override; - void TearDown() override; - - protected: - EGLSurface surface1_; - EGLSurface surface2_; - EGLContext context1_; - EGLContext context2_; -}; - -void EGLMultipleSurfacesContextsTest::SetUp() { - EGLSurfaceTest::SetUp(); - CreateSurfaceAndContext(&surface1_, &context1_); - CreateSurfaceAndContext(&surface2_, &context2_); - EXPECT_NE(EGL_NO_SURFACE, surface1_); - EXPECT_NE(EGL_NO_SURFACE, surface2_); - EXPECT_NE(surface1_, surface2_); - EXPECT_NE(EGL_NO_CONTEXT, context1_); - EXPECT_NE(EGL_NO_CONTEXT, context2_); - EXPECT_NE(context1_, context2_); -} - -void EGLMultipleSurfacesContextsTest::TearDown() { - EXPECT_TRUE(eglDestroyContext(display_, context1_)); - EXPECT_TRUE(eglDestroySurface(display_, surface1_)); - EXPECT_TRUE(eglDestroyContext(display_, context2_)); - EXPECT_TRUE(eglDestroySurface(display_, surface2_)); - EGLTest::TearDown(); -} - -TEST_F(EGLMultipleSurfacesContextsTest, NoMakeCurrent) {} - -TEST_F(EGLMultipleSurfacesContextsTest, MakeCurrentSurfaces) { - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context1_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context2_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context2_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context1_)); -} - -TEST_F(EGLMultipleSurfacesContextsTest, MakeCurrentSameSurface1) { - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context1_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context2_)); -} - -TEST_F(EGLMultipleSurfacesContextsTest, MakeCurrentSameSurface2) { - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context1_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context1_)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context2_)); -} - -TEST_F(EGLMultipleSurfacesContextsTest, MakeCurrentSurfacesAndReleases) { - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context1_)); - EXPECT_TRUE( - eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context2_)); - EXPECT_TRUE( - eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context2_)); - EXPECT_TRUE( - eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context1_)); - EXPECT_TRUE( - eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); -} - -TEST_F(EGLMultipleSurfacesContextsTest, MakeCurrentSurfaceFails) { - EXPECT_FALSE(eglMakeCurrent(display_, surface1_, surface1_, EGL_NO_CONTEXT)); - EXPECT_EQ(EGL_BAD_CONTEXT, eglGetError()); - EXPECT_FALSE(eglMakeCurrent(display_, surface1_, EGL_NO_SURFACE, context1_)); - EXPECT_EQ(EGL_BAD_SURFACE, eglGetError()); - EXPECT_FALSE(eglMakeCurrent(display_, EGL_NO_SURFACE, surface1_, context1_)); - EXPECT_EQ(EGL_BAD_SURFACE, eglGetError()); - - EGLDisplay invalid_display = reinterpret_cast<EGLDisplay>(0x1); - EGLSurface invalid_surface = reinterpret_cast<EGLSurface>(0x1); - EGLSurface invalid_context = reinterpret_cast<EGLContext>(0x1); - EXPECT_FALSE( - eglMakeCurrent(invalid_display, surface1_, surface1_, context1_)); - EXPECT_EQ(EGL_BAD_DISPLAY, eglGetError()); - EXPECT_FALSE(eglMakeCurrent(display_, surface1_, surface1_, invalid_context)); - EXPECT_EQ(EGL_BAD_CONTEXT, eglGetError()); - EXPECT_FALSE(eglMakeCurrent(display_, surface1_, invalid_surface, context1_)); - EXPECT_EQ(EGL_BAD_SURFACE, eglGetError()); - EXPECT_FALSE(eglMakeCurrent(display_, invalid_surface, surface1_, context1_)); - EXPECT_EQ(EGL_BAD_SURFACE, eglGetError()); - - // Command buffer limitation: - // Different read and draw surfaces fail. - EXPECT_FALSE(eglMakeCurrent(display_, surface1_, surface2_, context1_)); - EXPECT_EQ(EGL_BAD_MATCH, eglGetError()); -} - -TEST_F(EGLMultipleSurfacesContextsTest, CallGLOnMultipleContextNoCrash) { - EXPECT_TRUE(eglMakeCurrent(display_, surface1_, surface1_, context1_)); - - typedef GL_APICALL void(GL_APIENTRY * glEnableProc)(GLenum); - glEnableProc glEnable = - reinterpret_cast<glEnableProc>(eglGetProcAddress("glEnable")); - EXPECT_NE(nullptr, glEnable); - - glEnable(GL_BLEND); - - EXPECT_TRUE(eglMakeCurrent(display_, surface2_, surface2_, context2_)); - glEnable(GL_BLEND); -} - -class EGLThreadTest : public EGLSurfaceTest { - public: - EGLThreadTest(); - void SetUp() override; - void TearDown() override; - void OtherThreadTearDown(base::WaitableEvent*); - void OtherThreadMakeCurrent(EGLSurface surface, - EGLContext context, - EGLBoolean* result, - base::WaitableEvent*); - void OtherThreadGetError(EGLint* result, base::WaitableEvent*); - - protected: - base::Thread other_thread_; -}; - -EGLThreadTest::EGLThreadTest() - : EGLSurfaceTest(), other_thread_("EGLThreadTest thread") {} -void EGLThreadTest::SetUp() { - EGLSurfaceTest::SetUp(); - other_thread_.Start(); -} - -void EGLThreadTest::TearDown() { - base::WaitableEvent completion(true, false); - other_thread_.task_runner()->PostTask( - FROM_HERE, base::Bind(&EGLThreadTest::OtherThreadTearDown, - base::Unretained(this), &completion)); - completion.Wait(); - other_thread_.Stop(); - EGLSurfaceTest::TearDown(); -} - -void EGLThreadTest::OtherThreadTearDown(base::WaitableEvent* completion) { - EXPECT_TRUE(eglReleaseThread()); - completion->Signal(); -} - -void EGLThreadTest::OtherThreadMakeCurrent(EGLSurface surface, - EGLContext context, - EGLBoolean* result, - base::WaitableEvent* completion) { - *result = eglMakeCurrent(display_, surface, surface, context); - completion->Signal(); -} - -void EGLThreadTest::OtherThreadGetError(EGLint* result, - base::WaitableEvent* completion) { - *result = eglGetError(); - completion->Signal(); -} - -TEST_F(EGLThreadTest, OnlyReleaseThreadInOther) {} - -TEST_F(EGLThreadTest, Basic) { - EGLSurface surface; - EGLContext context; - CreateSurfaceAndContext(&surface, &context); - EXPECT_NE(EGL_NO_SURFACE, surface); - EXPECT_NE(EGL_NO_CONTEXT, context); - - EXPECT_TRUE(eglMakeCurrent(display_, surface, surface, context)); - - base::WaitableEvent completion(false, false); - - EGLBoolean result = EGL_FALSE; - other_thread_.task_runner()->PostTask( - FROM_HERE, - base::Bind(&EGLThreadTest::OtherThreadMakeCurrent, base::Unretained(this), - surface, context, &result, &completion)); - completion.Wait(); - EXPECT_FALSE(result); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - EGLint error = EGL_NONE; - other_thread_.task_runner()->PostTask( - FROM_HERE, base::Bind(&EGLThreadTest::OtherThreadGetError, - base::Unretained(this), &error, &completion)); - completion.Wait(); - EXPECT_EQ(EGL_BAD_ACCESS, error); - EXPECT_EQ(EGL_SUCCESS, eglGetError()); - - other_thread_.task_runner()->PostTask( - FROM_HERE, base::Bind(&EGLThreadTest::OtherThreadGetError, - base::Unretained(this), &error, &completion)); - completion.Wait(); - EXPECT_EQ(EGL_SUCCESS, error); - - EXPECT_TRUE( - eglMakeCurrent(display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); - - other_thread_.task_runner()->PostTask( - FROM_HERE, - base::Bind(&EGLThreadTest::OtherThreadMakeCurrent, base::Unretained(this), - surface, context, &result, &completion)); - completion.Wait(); - EXPECT_TRUE(result); - - EXPECT_FALSE(eglMakeCurrent(display_, surface, surface, context)); - EXPECT_EQ(EGL_BAD_ACCESS, eglGetError()); + success = eglInitialize(display, &major, &minor); + ASSERT_TRUE(success); + ASSERT_EQ(major, 1); + ASSERT_EQ(minor, 4); - EXPECT_TRUE(eglDestroySurface(display_, surface)); - EXPECT_TRUE(eglDestroyContext(display_, context)); + success = eglTerminate(display); + ASSERT_TRUE(success); } } // namespace gpu |