Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Unified Diff: ui/gl/gl_context.cc

Issue 2629633003: Refactor GL bindings so there is no global GLApi or DriverGL. (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gl/gl_context.h ('k') | ui/gl/gl_context_cgl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gl/gl_context.cc
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc
index 609d131f03cdb075b5b293b500abb15afda5acac..3c1d61a0455e8b3b4fe90d68c5f0f2ad4ce1033e 100644
--- a/ui/gl/gl_context.cc
+++ b/ui/gl/gl_context.cc
@@ -45,7 +45,9 @@ void GLContext::ScopedReleaseCurrent::Cancel() {
}
GLContext::GLContext(GLShareGroup* share_group)
- : share_group_(share_group),
+ : static_bindings_initialized_(false),
+ dynamic_bindings_initialized_(false),
+ share_group_(share_group),
current_virtual_context_(nullptr),
state_dirtied_externally_(false),
swap_interval_(1),
@@ -60,9 +62,16 @@ GLContext::~GLContext() {
share_group_->RemoveContext(this);
if (GetCurrent() == this) {
SetCurrent(nullptr);
+ SetCurrentGL(nullptr);
}
}
+GLApi* GLContext::CreateGLApi(DriverGL* driver) {
+ real_gl_api_ = new RealGLApi;
+ real_gl_api_->Initialize(driver);
+ return real_gl_api_;
+}
+
void GLContext::SetSafeToForceGpuSwitch() {
}
@@ -76,20 +85,22 @@ void GLContext::SetUnbindFboOnMakeCurrent() {
std::string GLContext::GetExtensions() {
DCHECK(IsCurrent(nullptr));
- return GetGLExtensionsFromCurrentContext();
+ return GetGLExtensionsFromCurrentContext(gl_api_.get());
}
std::string GLContext::GetGLVersion() {
DCHECK(IsCurrent(nullptr));
- const char *version =
- reinterpret_cast<const char*>(glGetString(GL_VERSION));
+ DCHECK(gl_api_ != nullptr);
+ const char* version =
+ reinterpret_cast<const char*>(gl_api_->glGetStringFn(GL_VERSION));
return std::string(version ? version : "");
}
std::string GLContext::GetGLRenderer() {
DCHECK(IsCurrent(nullptr));
- const char *renderer =
- reinterpret_cast<const char*>(glGetString(GL_RENDERER));
+ DCHECK(gl_api_ != nullptr);
+ const char* renderer =
+ reinterpret_cast<const char*>(gl_api_->glGetStringFn(GL_RENDERER));
return std::string(renderer ? renderer : "");
}
@@ -97,6 +108,36 @@ YUVToRGBConverter* GLContext::GetYUVToRGBConverter() {
return nullptr;
}
+CurrentGL* GLContext::GetCurrentGL() {
+ if (!static_bindings_initialized_) {
+ driver_gl_.reset(new DriverGL);
+ driver_gl_->InitializeStaticBindings();
+
+ gl_api_.reset(CreateGLApi(driver_gl_.get()));
+ GLApi* final_api = gl_api_.get();
+
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableGPUServiceTracing)) {
+ trace_gl_api_.reset(new TraceGLApi(final_api));
+ final_api = trace_gl_api_.get();
+ }
+
+ if (GetDebugGLBindingsInitializedGL()) {
+ debug_gl_api_.reset(new DebugGLApi(final_api));
+ final_api = debug_gl_api_.get();
+ }
+
+ current_gl_.reset(new CurrentGL);
+ current_gl_->Driver = driver_gl_.get();
+ current_gl_->Api = final_api;
+ current_gl_->Version = version_info_.get();
+
+ static_bindings_initialized_ = true;
+ }
+
+ return current_gl_.get();
+}
+
bool GLContext::HasExtension(const char* name) {
std::string extensions = GetExtensions();
extensions += " ";
@@ -109,10 +150,12 @@ bool GLContext::HasExtension(const char* name) {
const GLVersionInfo* GLContext::GetVersionInfo() {
if (!version_info_) {
- std::string version = GetGLVersion();
- std::string renderer = GetGLRenderer();
- version_info_ = base::MakeUnique<GLVersionInfo>(
- version.c_str(), renderer.c_str(), GetExtensions().c_str());
+ version_info_ = GenerateGLVersionInfo();
+
+ // current_gl_ may be null for virtual contexts
+ if (current_gl_) {
+ current_gl_->Version = version_info_.get();
+ }
}
return version_info_.get();
}
@@ -131,6 +174,7 @@ bool GLContext::LosesAllContextsOnContextLost() {
case kGLImplementationAppleGL:
return false;
case kGLImplementationMockGL:
+ case kGLImplementationStubGL:
return false;
default:
NOTREACHED();
@@ -146,14 +190,20 @@ GLContext* GLContext::GetRealCurrent() {
return current_real_context_.Pointer()->Get();
}
+std::unique_ptr<gl::GLVersionInfo> GLContext::GenerateGLVersionInfo() {
+ return base::MakeUnique<GLVersionInfo>(
+ GetGLVersion().c_str(), GetGLRenderer().c_str(), GetExtensions().c_str());
+}
+
void GLContext::SetCurrent(GLSurface* surface) {
current_context_.Pointer()->Set(surface ? this : nullptr);
GLSurface::SetCurrent(surface);
// Leave the real GL api current so that unit tests work correctly.
// TODO(sievers): Remove this, but needs all gpu_unittest classes
// to create and make current a context.
- if (!surface && GetGLImplementation() != kGLImplementationMockGL) {
- SetGLApiToNoContext();
+ if (!surface && GetGLImplementation() != kGLImplementationMockGL &&
+ GetGLImplementation() != kGLImplementationStubGL) {
+ SetCurrentGL(nullptr);
}
}
@@ -181,7 +231,16 @@ bool GLContext::WasAllocatedUsingRobustnessExtension() {
void GLContext::InitializeDynamicBindings() {
DCHECK(IsCurrent(nullptr));
- InitializeDynamicGLBindingsGL(this);
+ DCHECK(static_bindings_initialized_);
+ if (!dynamic_bindings_initialized_) {
+ if (real_gl_api_) {
+ real_gl_api_->InitializeFilteredExtensions();
+ real_gl_api_->set_version(GenerateGLVersionInfo());
+ }
+
+ driver_gl_->InitializeDynamicBindings(GetVersionInfo(), GetExtensions());
+ dynamic_bindings_initialized_ = true;
+ }
}
bool GLContext::MakeVirtuallyCurrent(
@@ -247,8 +306,8 @@ void GLContext::OnReleaseVirtuallyCurrent(GLContext* virtual_context) {
current_virtual_context_ = nullptr;
}
-void GLContext::SetRealGLApi() {
- SetGLToRealGLApi();
+void GLContext::BindGLApi() {
+ SetCurrentGL(GetCurrentGL());
}
GLContextReal::GLContextReal(GLShareGroup* share_group)
« no previous file with comments | « ui/gl/gl_context.h ('k') | ui/gl/gl_context_cgl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698