diff options
Diffstat (limited to 'content/browser')
12 files changed, 62 insertions, 60 deletions
diff --git a/content/browser/compositor/browser_compositor_output_surface.cc b/content/browser/compositor/browser_compositor_output_surface.cc index 30ff485..ff09ab7 100644 --- a/content/browser/compositor/browser_compositor_output_surface.cc +++ b/content/browser/compositor/browser_compositor_output_surface.cc @@ -7,11 +7,9 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/location.h" -#include "base/message_loop/message_loop_proxy.h" #include "base/strings/string_number_conversions.h" #include "content/browser/compositor/reflector_impl.h" #include "content/common/gpu/client/context_provider_command_buffer.h" -#include "ui/compositor/compositor.h" #include "ui/compositor/compositor_switches.h" namespace content { @@ -20,13 +18,11 @@ BrowserCompositorOutputSurface::BrowserCompositorOutputSurface( const scoped_refptr<ContextProviderCommandBuffer>& context_provider, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor) + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager) : OutputSurface(context_provider), surface_id_(surface_id), output_surface_map_(output_surface_map), - compositor_message_loop_(compositor_message_loop), - compositor_(compositor) { + vsync_manager_(vsync_manager) { Initialize(); } @@ -34,13 +30,11 @@ BrowserCompositorOutputSurface::BrowserCompositorOutputSurface( scoped_ptr<cc::SoftwareOutputDevice> software_device, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor) + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager) : OutputSurface(software_device.Pass()), surface_id_(surface_id), output_surface_map_(output_surface_map), - compositor_message_loop_(compositor_message_loop), - compositor_(compositor) { + vsync_manager_(vsync_manager) { Initialize(); } @@ -49,6 +43,7 @@ BrowserCompositorOutputSurface::~BrowserCompositorOutputSurface() { if (!HasClient()) return; output_surface_map_->Remove(surface_id_); + vsync_manager_->RemoveObserver(this); } void BrowserCompositorOutputSurface::Initialize() { @@ -77,6 +72,7 @@ bool BrowserCompositorOutputSurface::BindToClient( output_surface_map_->AddWithID(this, surface_id_); if (reflector_) reflector_->OnSourceSurfaceReady(surface_id_); + vsync_manager_->AddObserver(this); return true; } @@ -92,11 +88,15 @@ void BrowserCompositorOutputSurface::OnUpdateVSyncParameters( base::TimeDelta interval) { DCHECK(CalledOnValidThread()); DCHECK(HasClient()); - OnVSyncParametersChanged(timebase, interval); - compositor_message_loop_->PostTask( - FROM_HERE, - base::Bind(&ui::Compositor::OnUpdateVSyncParameters, - compositor_, timebase, interval)); + CommitVSyncParameters(timebase, interval); +} + +void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu( + base::TimeTicks timebase, + base::TimeDelta interval) { + DCHECK(CalledOnValidThread()); + DCHECK(HasClient()); + vsync_manager_->UpdateVSyncParameters(timebase, interval); } void BrowserCompositorOutputSurface::SetReflector(ReflectorImpl* reflector) { diff --git a/content/browser/compositor/browser_compositor_output_surface.h b/content/browser/compositor/browser_compositor_output_surface.h index bf0e366..7c26b083 100644 --- a/content/browser/compositor/browser_compositor_output_surface.h +++ b/content/browser/compositor/browser_compositor_output_surface.h @@ -6,19 +6,15 @@ #define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OUTPUT_SURFACE_H_ #include "base/id_map.h" -#include "base/memory/weak_ptr.h" #include "base/threading/non_thread_safe.h" #include "cc/output/output_surface.h" #include "content/common/content_export.h" - -namespace base { class MessageLoopProxy; } +#include "ui/compositor/compositor_vsync_manager.h" namespace cc { class SoftwareOutputDevice; } -namespace ui { class Compositor; } - namespace content { class ContextProviderCommandBuffer; class ReflectorImpl; @@ -26,6 +22,7 @@ class WebGraphicsContext3DCommandBufferImpl; class CONTENT_EXPORT BrowserCompositorOutputSurface : public cc::OutputSurface, + public ui::CompositorVSyncManager::Observer, public base::NonThreadSafe { public: virtual ~BrowserCompositorOutputSurface(); @@ -34,8 +31,12 @@ class CONTENT_EXPORT BrowserCompositorOutputSurface virtual bool BindToClient(cc::OutputSurfaceClient* client) OVERRIDE; virtual void Reshape(const gfx::Size& size, float scale_factor) OVERRIDE; - void OnUpdateVSyncParameters(base::TimeTicks timebase, - base::TimeDelta interval); + // ui::CompositorOutputSurface::Observer implementation. + virtual void OnUpdateVSyncParameters(base::TimeTicks timebase, + base::TimeDelta interval) OVERRIDE; + + void OnUpdateVSyncParametersFromGpu(base::TimeTicks tiembase, + base::TimeDelta interval); void SetReflector(ReflectorImpl* reflector); @@ -45,22 +46,19 @@ class CONTENT_EXPORT BrowserCompositorOutputSurface const scoped_refptr<ContextProviderCommandBuffer>& context, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor); + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager); // Constructor used by the software implementation. BrowserCompositorOutputSurface( scoped_ptr<cc::SoftwareOutputDevice> software_device, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor); + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager); int surface_id_; IDMap<BrowserCompositorOutputSurface>* output_surface_map_; - scoped_refptr<base::MessageLoopProxy> compositor_message_loop_; - base::WeakPtr<ui::Compositor> compositor_; + scoped_refptr<ui::CompositorVSyncManager> vsync_manager_; scoped_refptr<ReflectorImpl> reflector_; private: diff --git a/content/browser/compositor/browser_compositor_output_surface_proxy.cc b/content/browser/compositor/browser_compositor_output_surface_proxy.cc index d95c9b0..27fe55a 100644 --- a/content/browser/compositor/browser_compositor_output_surface_proxy.cc +++ b/content/browser/compositor/browser_compositor_output_surface_proxy.cc @@ -53,6 +53,6 @@ BrowserCompositorOutputSurfaceProxy::OnUpdateVSyncParametersOnCompositorThread( base::TimeDelta interval) { BrowserCompositorOutputSurface* surface = surface_map_->Lookup(surface_id); if (surface) - surface->OnUpdateVSyncParameters(timebase, interval); + surface->OnUpdateVSyncParametersFromGpu(timebase, interval); } } // namespace content diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc index 17c4780..32a43fd 100644 --- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc +++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc @@ -15,13 +15,11 @@ GpuBrowserCompositorOutputSurface::GpuBrowserCompositorOutputSurface( const scoped_refptr<ContextProviderCommandBuffer>& context, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor) + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager) : BrowserCompositorOutputSurface(context, surface_id, output_surface_map, - compositor_message_loop, - compositor) {} + vsync_manager) {} GpuBrowserCompositorOutputSurface::~GpuBrowserCompositorOutputSurface() {} diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.h b/content/browser/compositor/gpu_browser_compositor_output_surface.h index c677839..a773ad5 100644 --- a/content/browser/compositor/gpu_browser_compositor_output_surface.h +++ b/content/browser/compositor/gpu_browser_compositor_output_surface.h @@ -7,6 +7,10 @@ #include "content/browser/compositor/browser_compositor_output_surface.h" +namespace ui { +class CompositorVSyncManager; +} + namespace content { // Adapts a WebGraphicsContext3DCommandBufferImpl into a @@ -19,8 +23,7 @@ class GpuBrowserCompositorOutputSurface const scoped_refptr<ContextProviderCommandBuffer>& context, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor); + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager); virtual ~GpuBrowserCompositorOutputSurface(); diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index d97fdc1..d72958b 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc @@ -217,8 +217,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( CreateSoftwareOutputDevice(compositor), per_compositor_data_[compositor]->surface_id, &output_surface_map_, - base::MessageLoopProxy::current().get(), - compositor->AsWeakPtr())); + compositor->vsync_manager())); return surface.PassAs<cc::OutputSurface>(); } @@ -237,8 +236,7 @@ scoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( context_provider, per_compositor_data_[compositor]->surface_id, &output_surface_map_, - base::MessageLoopProxy::current().get(), - compositor->AsWeakPtr())); + compositor->vsync_manager())); if (data->reflector.get()) { data->reflector->CreateSharedTexture(); data->reflector->AttachToOutputSurface(surface.get()); diff --git a/content/browser/compositor/software_browser_compositor_output_surface.cc b/content/browser/compositor/software_browser_compositor_output_surface.cc index 4767e22..369fe93 100644 --- a/content/browser/compositor/software_browser_compositor_output_surface.cc +++ b/content/browser/compositor/software_browser_compositor_output_surface.cc @@ -21,13 +21,11 @@ SoftwareBrowserCompositorOutputSurface::SoftwareBrowserCompositorOutputSurface( scoped_ptr<cc::SoftwareOutputDevice> software_device, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor) + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager) : BrowserCompositorOutputSurface(software_device.Pass(), surface_id, output_surface_map, - compositor_message_loop, - compositor), + vsync_manager), output_surface_proxy_(surface_proxy) {} SoftwareBrowserCompositorOutputSurface:: diff --git a/content/browser/compositor/software_browser_compositor_output_surface.h b/content/browser/compositor/software_browser_compositor_output_surface.h index 88bf9a9..788d9da 100644 --- a/content/browser/compositor/software_browser_compositor_output_surface.h +++ b/content/browser/compositor/software_browser_compositor_output_surface.h @@ -8,16 +8,15 @@ #include "base/memory/weak_ptr.h" #include "content/browser/compositor/browser_compositor_output_surface.h" #include "content/common/content_export.h" -#include "ui/compositor/compositor.h" - -namespace base { -class MessageLoopProxy; -} namespace cc { class SoftwareOutputDevice; } +namespace ui { +class CompositorVSyncManager; +} + namespace content { class BrowserCompositorOutputSurfaceProxy; @@ -30,8 +29,7 @@ class CONTENT_EXPORT SoftwareBrowserCompositorOutputSurface scoped_ptr<cc::SoftwareOutputDevice> software_device, int surface_id, IDMap<BrowserCompositorOutputSurface>* output_surface_map, - base::MessageLoopProxy* compositor_message_loop, - base::WeakPtr<ui::Compositor> compositor); + const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager); virtual ~SoftwareBrowserCompositorOutputSurface(); diff --git a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc index 047346f..3f48d21 100644 --- a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc +++ b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc @@ -7,6 +7,7 @@ #include "content/browser/compositor/browser_compositor_output_surface_proxy.h" #include "content/browser/compositor/software_browser_compositor_output_surface.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/compositor/compositor.h" #include "ui/compositor/test/context_factories_for_test.h" #include "ui/gfx/vsync_provider.h" @@ -79,6 +80,8 @@ class SoftwareBrowserCompositorOutputSurfaceTest : public testing::Test { SoftwareBrowserCompositorOutputSurfaceTest:: SoftwareBrowserCompositorOutputSurfaceTest() { + // |message_loop_| is not used, but the main thread still has to exist for the + // compositor to use. message_loop_.reset(new base::MessageLoopForUI); } @@ -114,8 +117,7 @@ SoftwareBrowserCompositorOutputSurfaceTest::CreateSurface( device.Pass(), 1, &surface_map_, - compositor_->GetCompositorMessageLoop(), - compositor_->AsWeakPtr())); + compositor_->vsync_manager())); } TEST_F(SoftwareBrowserCompositorOutputSurfaceTest, NoVSyncProvider) { diff --git a/content/browser/renderer_host/media/desktop_capture_device_aura.cc b/content/browser/renderer_host/media/desktop_capture_device_aura.cc index 877ce82..5669bce 100644 --- a/content/browser/renderer_host/media/desktop_capture_device_aura.cc +++ b/content/browser/renderer_host/media/desktop_capture_device_aura.cc @@ -113,9 +113,6 @@ class DesktopVideoCaptureMachine virtual void OnCompositingAborted(ui::Compositor* compositor) OVERRIDE {} virtual void OnCompositingLockStateChanged( ui::Compositor* compositor) OVERRIDE {} - virtual void OnUpdateVSyncParameters(ui::Compositor* compositor, - base::TimeTicks timebase, - base::TimeDelta interval) OVERRIDE {} private: // Captures a frame. diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 38bae4a..1c66023 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -3229,7 +3229,6 @@ void RenderWidgetHostViewAura::OnCompositingLockStateChanged( } void RenderWidgetHostViewAura::OnUpdateVSyncParameters( - ui::Compositor* compositor, base::TimeTicks timebase, base::TimeDelta interval) { if (IsShowing()) { @@ -3530,6 +3529,10 @@ void RenderWidgetHostViewAura::AddedToRootWindow() { legacy_render_widget_host_HWND_->UpdateParent( reinterpret_cast<HWND>(GetNativeViewId())); #endif + + ui::Compositor* compositor = GetCompositor(); + if (compositor) + compositor->vsync_manager()->AddObserver(this); } void RenderWidgetHostViewAura::RemovingFromRootWindow() { @@ -3553,8 +3556,12 @@ void RenderWidgetHostViewAura::RemovingFromRootWindow() { RunOnCommitCallbacks(); resize_lock_.reset(); host_->WasResized(); - if (compositor && compositor->HasObserver(this)) - compositor->RemoveObserver(this); + + if (compositor) { + if (compositor->HasObserver(this)) + compositor->RemoveObserver(this); + compositor->vsync_manager()->RemoveObserver(this); + } #if defined(OS_WIN) // Update the legacy window's parent temporarily to the desktop window. It diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 995aaf6..7c6605c 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -37,6 +37,7 @@ #include "ui/base/ime/text_input_client.h" #include "ui/compositor/compositor.h" #include "ui/compositor/compositor_observer.h" +#include "ui/compositor/compositor_vsync_manager.h" #include "ui/gfx/display_observer.h" #include "ui/gfx/rect.h" #include "webkit/common/cursors/webcursor.h" @@ -79,6 +80,7 @@ class ResizeLock; class CONTENT_EXPORT RenderWidgetHostViewAura : public RenderWidgetHostViewBase, public ui::CompositorObserver, + public ui::CompositorVSyncManager::Observer, public ui::TextInputClient, public gfx::DisplayObserver, public aura::RootWindowObserver, @@ -372,8 +374,9 @@ class CONTENT_EXPORT RenderWidgetHostViewAura virtual void OnCompositingAborted(ui::Compositor* compositor) OVERRIDE; virtual void OnCompositingLockStateChanged( ui::Compositor* compositor) OVERRIDE; - virtual void OnUpdateVSyncParameters(ui::Compositor* compositor, - base::TimeTicks timebase, + + // Overridden from ui::CompositorVSyncManager::Observer + virtual void OnUpdateVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval) OVERRIDE; private: |