| 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..e20e4b92a9758bddf1b80d7002feaa697e2ef040 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_;
|
| -
|
| - // Must be accessed only on ImplThread.
|
| - IDMap<BrowserCompositorOutputSurface>* output_surface_map_;
|
| - scoped_ptr<GLHelper> gl_helper_;
|
| -
|
| - // 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& GetMain();
|
| + ImplThreadData& GetImpl();
|
| +
|
| + // Must be accessed only on ImplThread, through GetImpl().
|
| + ImplThreadData impl_unsafe_;
|
| +
|
| + // Must be accessed only on MainThread, through GetMain().
|
| + MainThreadData main_unsafe_;
|
| +
|
| + // Can be accessed on both.
|
| scoped_refptr<base::MessageLoopProxy> impl_message_loop_;
|
| scoped_refptr<base::MessageLoopProxy> main_message_loop_;
|
| int surface_id_;
|
|
|