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

Unified Diff: ui/compositor/compositor.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: Android build 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: ui/compositor/compositor.cc
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 372a03910313456f9e57e6ca6348674909ddb4ee..b7625983f43d9780d090aa40e05eb8c2c5df3a16 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -24,10 +24,12 @@
#include "ui/compositor/dip_util.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/test_web_graphics_context_3d.h"
+#include "ui/gl/context_provider.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_switches.h"
+#include "webkit/gpu/grcontext_for_webgraphicscontext3d.h"
#include "webkit/gpu/webgraphicscontext3d_in_process_impl.h"
#if defined(OS_CHROMEOS)
@@ -70,6 +72,22 @@ class PendingSwap {
DISALLOW_COPY_AND_ASSIGN(PendingSwap);
};
+class NullContextProvider : public ui::ContextProvider {
+ public:
+ virtual bool InitializeOnMainThread() OVERRIDE { return true; }
+ virtual bool BindToCurrentThread() OVERRIDE { return false; }
+ virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE { return NULL; }
+ virtual class GrContext* GrContext() OVERRIDE { return NULL; }
+ virtual void VerifyContexts() OVERRIDE {}
+ protected:
piman 2013/02/21 22:49:48 nit: blank line before 'protected:'
danakj 2013/02/22 01:56:31 Done.
+ virtual ~NullContextProvider() {}
+};
+
+static scoped_refptr<NullContextProvider>
piman 2013/02/21 22:49:48 You can't have non-POD as globals. Use Singletons?
danakj 2013/02/22 01:56:31 Oh right, POD only.. I used a Singleton class that
+ g_test_offscreen_contexts_main_thread;
+static scoped_refptr<NullContextProvider>
+ g_test_offscreen_contexts_compositor_thread;
+
} // namespace
namespace ui {
@@ -122,6 +140,67 @@ WebKit::WebGraphicsContext3D* DefaultContextFactory::CreateOffscreenContext() {
return CreateContextCommon(NULL, true);
}
+class DefaultContextFactory::DefaultContextProvider
+ : public ui::ContextProvider {
+ public:
+ DefaultContextProvider(ContextFactory* factory)
+ : factory_(factory),
+ destroyed_(false) {}
+
+ virtual bool InitializeOnMainThread() OVERRIDE {
+ context3d_.reset(factory_->CreateOffscreenContext());
+ return !!context3d_;
+ }
+
+ virtual bool BindToCurrentThread() {
+ return context3d_->makeContextCurrent();
+ }
+
+ virtual WebKit::WebGraphicsContext3D* Context3d() { return context3d_.get(); }
+
+ virtual class GrContext* GrContext() {
+ if (!gr_context_) {
+ gr_context_.reset(
+ new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get()));
+ }
+ return gr_context_->get();
+ }
+
+ virtual void VerifyContexts() OVERRIDE {
+ if (!context3d_ || context3d_->isContextLost())
+ destroyed_ = true;
piman 2013/02/21 22:49:48 same here wrt thread safety
danakj 2013/02/22 01:56:31 Done.
+ }
+
+ bool destroyed() const { return destroyed_; }
+
+ protected:
+ virtual ~DefaultContextProvider() {}
+
+ private:
+ ContextFactory* factory_;
+ bool destroyed_;
+ scoped_ptr<WebKit::WebGraphicsContext3D> context3d_;
+ scoped_ptr<webkit::gpu::GrContextForWebGraphicsContext3D> gr_context_;
+};
+
+scoped_refptr<ui::ContextProvider>
+DefaultContextFactory::OffscreenContextProviderForMainThread() {
+ if (!offscreen_contexts_main_thread_ ||
+ !offscreen_contexts_main_thread_->destroyed()) {
+ offscreen_contexts_main_thread_ = new DefaultContextProvider(this);
+ }
+ return offscreen_contexts_main_thread_;
+}
+
+scoped_refptr<ui::ContextProvider>
+DefaultContextFactory::OffscreenContextProviderForCompositorThread() {
+ if (!offscreen_contexts_compositor_thread_ ||
+ !offscreen_contexts_compositor_thread_->destroyed()) {
+ offscreen_contexts_compositor_thread_ = new DefaultContextProvider(this);
+ }
+ return offscreen_contexts_compositor_thread_;
+}
+
void DefaultContextFactory::RemoveCompositor(Compositor* compositor) {
}
@@ -518,6 +597,27 @@ void Compositor::scheduleComposite() {
ScheduleDraw();
}
+scoped_refptr<ui::ContextProvider>
+Compositor::OffscreenContextProviderForMainThread() {
+ if (g_test_compositor_enabled) {
+ if (!g_test_offscreen_contexts_main_thread)
+ g_test_offscreen_contexts_main_thread = new NullContextProvider;
+ return g_test_offscreen_contexts_main_thread;
+ }
+ return ContextFactory::GetInstance()->OffscreenContextProviderForMainThread();
+}
+
+scoped_refptr<ui::ContextProvider>
+Compositor::OffscreenContextProviderForCompositorThread() {
+ if (g_test_compositor_enabled) {
+ if (!g_test_offscreen_contexts_compositor_thread)
+ g_test_offscreen_contexts_compositor_thread = new NullContextProvider;
+ return g_test_offscreen_contexts_compositor_thread;
+ }
+ return ContextFactory::GetInstance()->
+ OffscreenContextProviderForCompositorThread();
+}
+
scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
if (!compositor_lock_) {
compositor_lock_ = new CompositorLock(this);

Powered by Google App Engine
This is Rietveld 408576698