Index: gpu/gles2_conform_support/egl/thread_state.cc |
diff --git a/gpu/gles2_conform_support/egl/thread_state.cc b/gpu/gles2_conform_support/egl/thread_state.cc |
deleted file mode 100644 |
index 5f2e691e905ad917282f02d13d7f659cbf11ac61..0000000000000000000000000000000000000000 |
--- a/gpu/gles2_conform_support/egl/thread_state.cc |
+++ /dev/null |
@@ -1,199 +0,0 @@ |
-// Copyright (c) 2016 The Chromium 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 "gpu/gles2_conform_support/egl/thread_state.h" |
- |
-#include "base/at_exit.h" |
-#include "base/command_line.h" |
-#include "base/environment.h" |
-#include "base/lazy_instance.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "gpu/command_buffer/client/gles2_lib.h" |
-#include "gpu/command_buffer/common/thread_local.h" |
-#include "gpu/command_buffer/service/gpu_switches.h" |
-#include "gpu/config/gpu_info_collector.h" |
-#include "gpu/config/gpu_util.h" |
-#include "gpu/gles2_conform_support/egl/context.h" |
-#include "gpu/gles2_conform_support/egl/display.h" |
-#include "gpu/gles2_conform_support/egl/surface.h" |
-#include "gpu/gles2_conform_support/egl/test_support.h" |
-#include "ui/gl/gl_context.h" |
-#include "ui/gl/gl_surface.h" |
- |
-// Thread local key for ThreadState instance. Accessed when holding g_egl_lock |
-// only, since the initialization can not be Guaranteed otherwise. Not in |
-// anonymous namespace due to Mac OS X 10.6 linker. See gles2_lib.cc. |
-static gpu::ThreadLocalKey g_egl_thread_state_key; |
- |
-namespace { |
-base::LazyInstance<base::Lock>::Leaky g_egl_lock; |
-int g_egl_active_thread_count; |
- |
-egl::Display* g_egl_default_display; |
- |
-#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. |
-base::AtExitManager* g_exit_manager; |
-#endif |
-} // namespace |
- |
-namespace egl { |
- |
-egl::ThreadState* ThreadState::Get() { |
- base::AutoLock lock(g_egl_lock.Get()); |
- if (g_egl_active_thread_count == 0) { |
-#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY) |
-#if defined(COMPONENT_BUILD) |
- if (!g_command_buffer_gles_has_atexit_manager) |
- g_exit_manager = new base::AtExitManager; |
-#else |
- g_exit_manager = new base::AtExitManager; |
-#endif |
-#endif |
- gles2::Initialize(); |
- |
- if (gfx::GetGLImplementation() == gfx::kGLImplementationNone) { |
- base::CommandLine::StringVector argv; |
- scoped_ptr<base::Environment> env(base::Environment::Create()); |
- std::string env_string; |
- env->GetVar("CHROME_COMMAND_BUFFER_GLES2_ARGS", &env_string); |
-#if defined(OS_WIN) |
- argv = base::SplitString(base::UTF8ToUTF16(env_string), |
- base::kWhitespaceUTF16, base::TRIM_WHITESPACE, |
- base::SPLIT_WANT_NONEMPTY); |
- argv.insert(argv.begin(), base::UTF8ToUTF16("dummy")); |
-#else |
- argv = |
- base::SplitString(env_string, base::kWhitespaceASCII, |
- base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
- argv.insert(argv.begin(), "dummy"); |
-#endif |
- base::CommandLine::Init(0, nullptr); |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
- // Need to call both Init and InitFromArgv, since Windows does not use |
- // argc, argv in CommandLine::Init(argc, argv). |
- command_line->InitFromArgv(argv); |
- if (!command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds)) { |
- gpu::GPUInfo gpu_info; |
- gpu::CollectBasicGraphicsInfo(&gpu_info); |
- gpu::ApplyGpuDriverBugWorkarounds(gpu_info, command_line); |
- } |
- |
- gfx::GLSurface::InitializeOneOff(); |
- } |
- |
- g_egl_default_display = new egl::Display(); |
- g_egl_thread_state_key = gpu::ThreadLocalAlloc(); |
- } |
- egl::ThreadState* thread_state = static_cast<egl::ThreadState*>( |
- gpu::ThreadLocalGetValue(g_egl_thread_state_key)); |
- if (!thread_state) { |
- thread_state = new egl::ThreadState; |
- gpu::ThreadLocalSetValue(g_egl_thread_state_key, thread_state); |
- ++g_egl_active_thread_count; |
- } |
- return thread_state; |
-} |
- |
-void ThreadState::ReleaseThread() { |
- base::AutoLock lock(g_egl_lock.Get()); |
- if (g_egl_active_thread_count == 0) |
- return; |
- |
- egl::ThreadState* thread_state = static_cast<egl::ThreadState*>( |
- gpu::ThreadLocalGetValue(g_egl_thread_state_key)); |
- if (!thread_state) |
- return; |
- |
- --g_egl_active_thread_count; |
- if (g_egl_active_thread_count > 0) { |
- g_egl_default_display->ReleaseCurrent(thread_state); |
- delete thread_state; |
- } else { |
- gpu::ThreadLocalFree(g_egl_thread_state_key); |
- |
- // First delete the display object, so that it drops the possible refs to |
- // current context. |
- delete g_egl_default_display; |
- g_egl_default_display = nullptr; |
- |
- // We can use Surface and Context without lock, since there's no threads |
- // left anymore. Destroy the current context explicitly, in an attempt to |
- // reduce the number of error messages abandoned context would produce. |
- if (thread_state->current_context()) { |
- Context::MakeCurrent(thread_state->current_context(), |
- thread_state->current_surface()->gl_surface(), |
- nullptr, nullptr); |
- } |
- delete thread_state; |
- |
- gles2::Terminate(); |
-#if defined(COMMAND_BUFFER_GLES_LIB_SUPPORT_ONLY) |
-#if defined(COMPONENT_BUILD) |
- if (g_command_buffer_gles_has_atexit_manager) |
- delete g_exit_manager; |
-#else |
- delete g_exit_manager; |
-#endif |
- g_exit_manager = nullptr; |
-#endif |
- } |
-} |
- |
-ThreadState::ThreadState() : error_code_(EGL_SUCCESS) {} |
- |
-ThreadState::~ThreadState() {} |
- |
-EGLint ThreadState::ConsumeErrorCode() { |
- EGLint current_error_code = error_code_; |
- error_code_ = EGL_SUCCESS; |
- return current_error_code; |
-} |
- |
-Display* ThreadState::GetDisplay(EGLDisplay dpy) { |
- if (dpy == g_egl_default_display) |
- return g_egl_default_display; |
- return nullptr; |
-} |
- |
-Display* ThreadState::GetDefaultDisplay() { |
- return g_egl_default_display; |
-} |
- |
-void ThreadState::SetCurrent(Surface* surface, Context* context) { |
- DCHECK((surface == nullptr) == (context == nullptr)); |
- if (current_context_) { |
- current_context_->set_is_current_in_some_thread(false); |
- current_surface_->set_is_current_in_some_thread(false); |
- } |
- current_surface_ = surface; |
- current_context_ = context; |
- if (current_context_) { |
- current_context_->set_is_current_in_some_thread(true); |
- current_surface_->set_is_current_in_some_thread(true); |
- } |
-} |
- |
-ThreadState::AutoCurrentContextRestore::AutoCurrentContextRestore( |
- ThreadState* thread_state) |
- : thread_state_(thread_state) {} |
- |
-ThreadState::AutoCurrentContextRestore::~AutoCurrentContextRestore() { |
- if (Context* current_context = thread_state_->current_context()) { |
- current_context->ApplyCurrentContext( |
- thread_state_->current_surface()->gl_surface()); |
- } else { |
- Context::ApplyContextReleased(); |
- } |
-} |
- |
-void ThreadState::AutoCurrentContextRestore::SetCurrent(Surface* surface, |
- Context* context) { |
- thread_state_->SetCurrent(surface, context); |
-} |
- |
-} // namespace egl |