Chromium Code Reviews| Index: content/browser/compositor/reflector_impl.h |
| diff --git a/content/browser/compositor/reflector_impl.h b/content/browser/compositor/reflector_impl.h |
| index 82c1f467d9f38da5a88ba04fdf7195dc6dfb26c3..7a1597ad6b61f6fcf0ac136ad16e5f9a16cac82e 100644 |
| --- a/content/browser/compositor/reflector_impl.h |
| +++ b/content/browser/compositor/reflector_impl.h |
| @@ -10,6 +10,7 @@ |
| #include "base/memory/weak_ptr.h" |
| #include "base/synchronization/lock.h" |
| #include "content/browser/compositor/image_transport_factory.h" |
| +#include "gpu/command_buffer/common/mailbox_holder.h" |
| #include "ui/compositor/reflector.h" |
| #include "ui/gfx/size.h" |
| @@ -24,12 +25,12 @@ class Layer; |
| namespace content { |
| +class OwnedMailbox; |
| class BrowserCompositorOutputSurface; |
| // A reflector implementation that copies the framebuffer content |
| // to the texture, then draw it onto the mirroring compositor. |
| -class ReflectorImpl : public ImageTransportFactoryObserver, |
| - public base::SupportsWeakPtr<ReflectorImpl>, |
| +class ReflectorImpl : public base::SupportsWeakPtr<ReflectorImpl>, |
| public ui::Reflector { |
| public: |
| ReflectorImpl( |
| @@ -39,10 +40,10 @@ class ReflectorImpl : public ImageTransportFactoryObserver, |
| int surface_id); |
| ui::Compositor* mirrored_compositor() { |
| - return mirrored_compositor_; |
| + return GetMain().mirrored_compositor; |
| } |
| - void InitOnImplThread(); |
| + void InitOnImplThread(const gpu::MailboxHolder& mailbox_holder); |
| void Shutdown(); |
| void ShutdownOnImplThread(); |
| @@ -53,13 +54,6 @@ class ReflectorImpl : public ImageTransportFactoryObserver, |
| // ui::Reflector implementation. |
| virtual void OnMirroringCompositorResized() OVERRIDE; |
| - // ImageTransportFactoryObsever implementation. |
| - virtual void OnLostResources() OVERRIDE; |
| - |
| - // Called when the output surface's size has changed. |
| - // This must be called on ImplThread. |
| - void OnReshape(gfx::Size size); |
| - |
| // Called in |BrowserCompositorOutputSurface::SwapBuffers| to copy |
| // the full screen image to the |texture_id_|. This must be called |
| // on ImplThread. |
| @@ -78,12 +72,36 @@ class ReflectorImpl : public ImageTransportFactoryObserver, |
| // Called when the source surface is bound and available. This must |
| // be called on ImplThread. |
| - void OnSourceSurfaceReady(int surface_id); |
| + void OnSourceSurfaceReady(BrowserCompositorOutputSurface* surface); |
| + |
| + void DetachFromOutputSurface(); |
| private: |
| + struct MainThreadData { |
| + MainThreadData(ui::Compositor* mirrored_compositor, |
| + ui::Layer* mirroring_layer); |
| + ~MainThreadData(); |
| + scoped_refptr<OwnedMailbox> mailbox; |
| + bool needs_set_mailbox; |
| + ui::Compositor* mirrored_compositor; |
| + ui::Layer* mirroring_layer; |
| + }; |
| + |
| + struct ImplThreadData { |
| + explicit ImplThreadData( |
| + IDMap<BrowserCompositorOutputSurface>* output_surface_map); |
| + ~ImplThreadData(); |
| + IDMap<BrowserCompositorOutputSurface>* output_surface_map; |
| + BrowserCompositorOutputSurface* output_surface; |
| + scoped_ptr<GLHelper> gl_helper; |
| + unsigned texture_id; |
| + gpu::MailboxHolder mailbox_holder; |
| + }; |
| + |
| virtual ~ReflectorImpl(); |
| void AttachToOutputSurfaceOnImplThread( |
| + const gpu::MailboxHolder& mailbox_holder, |
| BrowserCompositorOutputSurface* surface); |
| void UpdateTextureSizeOnMainThread(gfx::Size size); |
| @@ -101,25 +119,16 @@ class ReflectorImpl : public ImageTransportFactoryObserver, |
| // so the ReflectorImpl gets deleted when the function returns. |
| static void DeleteOnMainThread(scoped_refptr<ReflectorImpl> reflector) {} |
| - // These variables are initialized on MainThread before |
| - // the reflector is attached to the output surface. Once |
| - // attached, they must be accessed only on ImplThraed unless |
| - // the context is lost. When the context is lost, these |
| - // will be re-ininitiailzed when the new output-surface |
| - // is created on MainThread. |
| - int texture_id_; |
| - base::Lock texture_lock_; |
| - gfx::Size texture_size_; |
| + MainThreadData& GetMain(); |
| + ImplThreadData& GetImpl(); |
| // Must be accessed only on ImplThread. |
| - IDMap<BrowserCompositorOutputSurface>* output_surface_map_; |
| - scoped_ptr<GLHelper> gl_helper_; |
| + ImplThreadData impl_; |
|
danakj
2014/04/09 17:30:00
name this impl_unsafe_ or something, to make it cl
piman
2014/04/09 22:14:38
Done.
|
| // Must be accessed only on MainThread. |
| - ui::Compositor* mirrored_compositor_; |
| - ui::Compositor* mirroring_compositor_; |
| - ui::Layer* mirroring_layer_; |
| - scoped_refptr<ui::Texture> shared_texture_; |
| + MainThreadData main_; |
| + |
| + // Can be accessed on both. |
| scoped_refptr<base::MessageLoopProxy> impl_message_loop_; |
| scoped_refptr<base::MessageLoopProxy> main_message_loop_; |
| int surface_id_; |