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; |
} |