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

Unified Diff: ui/gl/gl_share_group.cc

Issue 1652873002: Android: Use virtualized context only for those with compatible config (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 4 years, 10 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
Index: ui/gl/gl_share_group.cc
diff --git a/ui/gl/gl_share_group.cc b/ui/gl/gl_share_group.cc
index dd424a54fe947915e80b36636ae440891387357d..67e9480ad5bc4f4f730ea358fb2760fdd24c15dd 100644
--- a/ui/gl/gl_share_group.cc
+++ b/ui/gl/gl_share_group.cc
@@ -11,7 +11,11 @@
namespace gfx {
GLShareGroup::GLShareGroup()
- : shared_context_(NULL)
+ : shared_contexts_(
+ make_scoped_ptr(new std::map<GLSurface::Format,
+ scoped_refptr<GLContext>>())),
+ active_context_(nullptr),
+ format_(GLSurface::GetDefaultFormat())
#if defined(OS_MACOSX)
, renderer_id_(-1)
#endif
@@ -24,8 +28,6 @@ void GLShareGroup::AddContext(GLContext* context) {
void GLShareGroup::RemoveContext(GLContext* context) {
contexts_.erase(context);
- if (shared_context_ == context)
- shared_context_ = NULL;
}
void* GLShareGroup::GetHandle() {
@@ -37,23 +39,36 @@ void* GLShareGroup::GetHandle() {
}
GLContext* GLShareGroup::GetContext() {
- for (ContextSet::iterator it = contexts_.begin();
- it != contexts_.end();
- ++it) {
- if ((*it)->GetHandle())
- return *it;
+ for (auto context : contexts_) {
+ if (context->GetFormat() == format_ && context->GetHandle())
+ return context;
}
return NULL;
}
-void GLShareGroup::SetSharedContext(GLContext* context) {
- DCHECK(contexts_.find(context) != contexts_.end());
- shared_context_ = context;
+void GLShareGroup::UpdateActiveSharedContext(GLSurface* surface,
+ GpuPreference preference) {
+ GLSurface::Format format = surface->GetFormat();
+ scoped_refptr<GLContext> context;
+ auto it = shared_contexts_->find(format);
+ if (it == shared_contexts_->end()) {
+ // The shared context with the matched config not found. Create a new one.
+ context = GLContext::CreateGLContext(this, surface, preference);
+ if (context.get()) {
+ shared_contexts_->insert({format, context});
+ } else {
+ LOG(ERROR) << "Failed to create GLContext.";
+ return;
+ }
+ } else {
+ context = it->second;
+ }
+ active_context_ = context.get();
}
GLContext* GLShareGroup::GetSharedContext() {
- return shared_context_;
+ return active_context_;
}
#if defined(OS_MACOSX)

Powered by Google App Engine
This is Rietveld 408576698