| Index: gpu/gles2_conform_support/egl/display.cc
|
| diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
|
| index bf63108662beb6f4b25b7e14e37bc10084b8b783..e5cc1178bcdef3223e5c53f4b6fdb5e53b7f0e33 100644
|
| --- a/gpu/gles2_conform_support/egl/display.cc
|
| +++ b/gpu/gles2_conform_support/egl/display.cc
|
| @@ -31,41 +31,60 @@ const int32_t kTransferBufferSize = 512 * 1024;
|
| }
|
|
|
| namespace egl {
|
| -#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| +
|
| // egl::Display is used for comformance tests and command_buffer_gles. We only
|
| // need the exit manager for the command_buffer_gles library.
|
| // TODO(hendrikw): Find a cleaner solution for this.
|
| namespace {
|
| -base::LazyInstance<base::Lock>::Leaky g_exit_manager_lock;
|
| -int g_exit_manager_use_count;
|
| +base::LazyInstance<base::Lock>::Leaky g_init_lock;
|
| +int g_init_count;
|
| +
|
| +#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| base::AtExitManager* g_exit_manager;
|
| -void RefAtExitManager() {
|
| - base::AutoLock lock(g_exit_manager_lock.Get());
|
| +#endif
|
| +
|
| +void InitGlobal() {
|
| + base::AutoLock lock(g_init_lock.Get());
|
| + if (g_init_count == 0) {
|
| + gles2::Initialize();
|
| + }
|
| +
|
| +#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| #if defined(COMPONENT_BUILD)
|
| if (g_command_buffer_gles_has_atexit_manager) {
|
| + ++g_init_count;
|
| return;
|
| }
|
| #endif
|
| - if (g_exit_manager_use_count == 0) {
|
| + if (g_init_count == 0) {
|
| g_exit_manager = new base::AtExitManager;
|
| }
|
| - ++g_exit_manager_use_count;
|
| +#endif
|
| +
|
| + ++g_init_count;
|
| +
|
| }
|
| -void ReleaseAtExitManager() {
|
| - base::AutoLock lock(g_exit_manager_lock.Get());
|
| +void ReleaseGlobal() {
|
| + base::AutoLock lock(g_init_lock.Get());
|
| + --g_init_count;
|
| + if (g_init_count == 0) {
|
| + gles2::Terminate();
|
| + }
|
| +
|
| +#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| #if defined(COMPONENT_BUILD)
|
| if (g_command_buffer_gles_has_atexit_manager) {
|
| return;
|
| }
|
| #endif
|
| - --g_exit_manager_use_count;
|
| - if (g_exit_manager_use_count == 0) {
|
| + if (g_init_count == 0) {
|
| delete g_exit_manager;
|
| g_exit_manager = nullptr;
|
| }
|
| -}
|
| -}
|
| #endif
|
| +}
|
| +} // namespace
|
| +
|
|
|
| Display::Display(EGLNativeDisplayType display_id)
|
| : display_id_(display_id),
|
| @@ -74,20 +93,18 @@ Display::Display(EGLNativeDisplayType display_id)
|
| create_offscreen_width_(0),
|
| create_offscreen_height_(0),
|
| next_fence_sync_release_(1) {
|
| -#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| - RefAtExitManager();
|
| -#endif
|
| +
|
| + InitGlobal();
|
| +
|
| }
|
|
|
| Display::~Display() {
|
| - gles2::Terminate();
|
| -#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY)
|
| - ReleaseAtExitManager();
|
| -#endif
|
| +
|
| + ReleaseGlobal();
|
| +
|
| }
|
|
|
| bool Display::Initialize() {
|
| - gles2::Initialize();
|
| is_initialized_ = true;
|
| return true;
|
| }
|
|
|