diff options
Diffstat (limited to 'content/browser/compositor/reflector_impl.h')
-rw-r--r-- | content/browser/compositor/reflector_impl.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/content/browser/compositor/reflector_impl.h b/content/browser/compositor/reflector_impl.h new file mode 100644 index 0000000..c5df1e2 --- /dev/null +++ b/content/browser/compositor/reflector_impl.h @@ -0,0 +1,125 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_COMPOSITOR_REFLECTOR_IMPL_H_ +#define CONTENT_BROWSER_COMPOSITOR_REFLECTOR_IMPL_H_ + +#include "base/id_map.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "content/browser/compositor/image_transport_factory.h" +#include "ui/compositor/reflector.h" +#include "ui/gfx/size.h" + +namespace base { class MessageLoopProxy; } + +namespace gfx { class Rect; } + +namespace ui { +class Compositor; +class Layer; +} + +namespace content { + +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>, + public ui::Reflector { + public: + ReflectorImpl( + ui::Compositor* mirrored_compositor, + ui::Layer* mirroring_layer, + IDMap<BrowserCompositorOutputSurface>* output_surface_map, + int surface_id); + + ui::Compositor* mirrored_compositor() { + return mirrored_compositor_; + } + + void InitOnImplThread(); + void Shutdown(); + void ShutdownOnImplThread(); + + // This must be called on ImplThread, or before the surface is passed to + // ImplThread. + void AttachToOutputSurface(BrowserCompositorOutputSurface* surface); + + // 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. + void OnSwapBuffers(); + + // Called in |BrowserCompositorOutputSurface::PostSubBuffer| copy + // the sub image given by |rect| to the texture.This must be called + // on ImplThread. + void OnPostSubBuffer(gfx::Rect rect); + + // Create a shared texture that will be used to copy the content of + // mirrored compositor to the mirroring compositor. This must be + // called before the reflector is attached to OutputSurface to avoid + // race with ImplThread accessing |texture_id_|. + void CreateSharedTexture(); + + // Called when the source surface is bound and available. This must + // be called on ImplThread. + void OnSourceSurfaceReady(int surface_id); + + private: + virtual ~ReflectorImpl(); + + void UpdateTextureSizeOnMainThread(gfx::Size size); + + // Request full redraw on mirroring compositor. + void FullRedrawOnMainThread(gfx::Size size); + + void UpdateSubBufferOnMainThread(gfx::Size size, gfx::Rect rect); + + // Request full redraw on mirrored compositor so that + // the full content will be copied to mirroring compositor. + void FullRedrawContentOnMainThread(); + + // This exists just to hold a reference to a ReflectorImpl in a post task, + // 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_; + 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_; + scoped_refptr<base::MessageLoopProxy> impl_message_loop_; + scoped_refptr<base::MessageLoopProxy> main_message_loop_; + int surface_id_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_COMPOSITOR_REFLECTOR_IMPL_H_ |