summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/tests
diff options
context:
space:
mode:
authorzmo <zmo@chromium.org>2016-02-25 11:24:35 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-25 19:26:48 +0000
commit0df7774c8d57adb794693f98733c610715c0879c (patch)
treeb61b8920cb69cbb0301c8185f6670a5299930b66 /gpu/command_buffer/tests
parentaf0f476939fbbad4ed6c32548c974c55fe663900 (diff)
downloadchromium_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.cc580
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