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

Unified Diff: content/browser/renderer_host/image_transport_factory.cc

Issue 12212007: cc: Route offscreen context creation for compositor to the browser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Restart with GrContext owned in cc Created 7 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: content/browser/renderer_host/image_transport_factory.cc
diff --git a/content/browser/renderer_host/image_transport_factory.cc b/content/browser/renderer_host/image_transport_factory.cc
index ba45309f8d990cfe0539c320d0291f8b06491df1..2db28ba792cd0fb94e68e314b3909bcad1f72136 100644
--- a/content/browser/renderer_host/image_transport_factory.cc
+++ b/content/browser/renderer_host/image_transport_factory.cc
@@ -372,7 +372,8 @@ class GpuProcessTransportFactory
public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
public:
GpuProcessTransportFactory()
- : ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) {
+ : lost_context_callbacks_(0),
+ ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)) {
output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy();
}
@@ -423,8 +424,9 @@ class GpuProcessTransportFactory
CreateSharedContextLazy();
gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
gfx::kNullPluginWindow, true);
- handle.parent_gpu_process_id = shared_context_->GetGPUProcessID();
- handle.parent_client_id = shared_context_->GetChannelID();
+ handle.parent_gpu_process_id =
+ shared_context_main_thread_->GetGPUProcessID();
+ handle.parent_client_id = shared_context_main_thread_->GetChannelID();
return handle;
}
@@ -435,10 +437,10 @@ class GpuProcessTransportFactory
virtual scoped_refptr<ui::Texture> CreateTransportClient(
float device_scale_factor) {
- if (!shared_context_.get())
+ if (!shared_context_main_thread_.get())
return NULL;
scoped_refptr<ImageTransportClientTexture> image(
- new ImageTransportClientTexture(shared_context_.get(),
+ new ImageTransportClientTexture(shared_context_main_thread_.get(),
device_scale_factor));
return image;
}
@@ -447,11 +449,13 @@ class GpuProcessTransportFactory
const gfx::Size& size,
float device_scale_factor,
unsigned int texture_id) OVERRIDE {
- if (!shared_context_.get())
+ if (!shared_context_main_thread_.get())
return NULL;
- scoped_refptr<OwnedTexture> image(
- new OwnedTexture(shared_context_.get(), size, device_scale_factor,
- texture_id));
+ scoped_refptr<OwnedTexture> image(new OwnedTexture(
+ shared_context_main_thread_.get(),
+ size,
+ device_scale_factor,
+ texture_id));
return image;
}
@@ -462,16 +466,16 @@ class GpuProcessTransportFactory
CreateOffscreenContext();
if (!context_for_thread)
return NULL;
- gl_helper_.reset(new GLHelper(shared_context_.get(),
+ gl_helper_.reset(new GLHelper(shared_context_main_thread_.get(),
context_for_thread));
}
return gl_helper_.get();
}
virtual uint32 InsertSyncPoint() OVERRIDE {
- if (!shared_context_.get())
+ if (!shared_context_main_thread_.get())
return 0;
- return shared_context_->insertSyncPoint();
+ return shared_context_main_thread_->insertSyncPoint();
}
virtual void AddObserver(ImageTransportFactoryObserver* observer) {
@@ -485,9 +489,17 @@ class GpuProcessTransportFactory
// WebGraphicsContextLostCallback implementation, called for the shared
// context.
virtual void onContextLost() {
+ // Wait until we get the callback for each of our shared contexts.
+ ++lost_context_callbacks_;
+ int expected_callbacks = (shared_context_main_thread_ ? 1 : 0) +
+ (shared_context_compositor_thread_ ? 1 : 0);
+ DCHECK(expected_callbacks);
+ if (lost_context_callbacks_ < expected_callbacks)
+ return;
+
MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&GpuProcessTransportFactory::OnLostSharedContext,
+ base::Bind(&GpuProcessTransportFactory::OnLostSharedContexts,
callback_factory_.GetWeakPtr()));
}
@@ -560,31 +572,57 @@ class GpuProcessTransportFactory
return context.release();
}
+ virtual WebKit::WebGraphicsContext3D* OffscreenContextForMainThread()
+ OVERRIDE {
+ CreateSharedContextLazy();
+ return shared_context_main_thread_.get();
+ }
+
+ virtual WebKit::WebGraphicsContext3D* OffscreenContextForCompositorThread()
+ OVERRIDE {
+ if (shared_context_compositor_thread_)
+ return shared_context_compositor_thread_.get();
+
+ shared_context_compositor_thread_.reset(CreateOffscreenContext());
+ if (!shared_context_compositor_thread_->makeContextCurrent())
+ shared_context_compositor_thread_.reset();
+ if (!shared_context_compositor_thread_)
+ return NULL;
+
+ shared_context_compositor_thread_->setContextLostCallback(this);
+ return shared_context_compositor_thread_.get();
+ }
+
void CreateSharedContextLazy() {
- if (shared_context_.get())
+ if (shared_context_main_thread_.get())
return;
- shared_context_.reset(CreateOffscreenContext());
- if (!shared_context_.get()) {
+ shared_context_main_thread_.reset(CreateOffscreenContext());
+ if (!shared_context_main_thread_.get()) {
// If we can't recreate contexts, we won't be able to show the UI. Better
// crash at this point.
LOG(FATAL) << "Failed to initialize UI shared context.";
}
- if (!shared_context_->makeContextCurrent()) {
+ if (!shared_context_main_thread_->makeContextCurrent()) {
// If we can't recreate contexts, we won't be able to show the UI. Better
// crash at this point.
LOG(FATAL) << "Failed to make UI shared context current.";
}
- shared_context_->setContextLostCallback(this);
+ shared_context_main_thread_->setContextLostCallback(this);
}
- void OnLostSharedContext() {
+ void OnLostSharedContexts() {
// Keep old resources around while we call the observers, but ensure that
// new resources are created if needed.
- scoped_ptr<WebGraphicsContext3DCommandBufferImpl> old_shared_context(
- shared_context_.release());
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
+ old_shared_context_main_thread(shared_context_main_thread_.release());
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
+ old_shared_context_compositor_thread(
+ shared_context_compositor_thread_.release());
scoped_ptr<GLHelper> old_helper(gl_helper_.release());
+ lost_context_callbacks_ = 0;
+
FOR_EACH_OBSERVER(ImageTransportFactoryObserver,
observer_list_,
OnLostResources());
@@ -592,7 +630,10 @@ class GpuProcessTransportFactory
typedef std::map<ui::Compositor*, PerCompositorData*> PerCompositorDataMap;
PerCompositorDataMap per_compositor_data_;
- scoped_ptr<WebGraphicsContext3DCommandBufferImpl> shared_context_;
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl> shared_context_main_thread_;
+ scoped_ptr<WebGraphicsContext3DCommandBufferImpl>
+ shared_context_compositor_thread_;
+ int lost_context_callbacks_;
scoped_ptr<GLHelper> gl_helper_;
ObserverList<ImageTransportFactoryObserver> observer_list_;
base::WeakPtrFactory<GpuProcessTransportFactory> callback_factory_;

Powered by Google App Engine
This is Rietveld 408576698