1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/ref_counted.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/output/compositor_frame.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/output/managed_memory_policy.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/output/output_surface.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/android/synchronous_compositor.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ipc/ipc_message.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/transform.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)namespace cc {
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ContextProvider;
235e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)class CompositorFrameMetadata;
245e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)}
255e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace IPC {
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Message;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FrameSwapMessageQueue;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SynchronousCompositorClient;
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SynchronousCompositorOutputSurface;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebGraphicsContext3DCommandBufferImpl;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SynchronousCompositorOutputSurfaceDelegate {
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)   virtual void DidBindOutputSurface(
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) = 0;
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void DidDestroySynchronousOutputSurface(
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SynchronousCompositorOutputSurface* output_surface) = 0;
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void SetContinuousInvalidate(bool enable) = 0;
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void DidActivatePendingTree() = 0;
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorOutputSurfaceDelegate() {}
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~SynchronousCompositorOutputSurfaceDelegate() {}
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Specialization of the output surface that adapts it to implement the
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// content::SynchronousCompositor public API. This class effects an "inversion
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// of control" - enabling drawing to be  orchestrated by the embedding
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// layer, instead of driven by the compositor internals - hence it holds two
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 'client' pointers (|client_| in the OutputSurface baseclass and
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// GetDelegate()) which represent the consumers of the two roles in plays.
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class can be created only on the main thread, but then becomes pinned
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to a fixed thread when BindToClient is called.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SynchronousCompositorOutputSurface
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    : NON_EXPORTED_BASE(public cc::OutputSurface) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit SynchronousCompositorOutputSurface(
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int routing_id,
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~SynchronousCompositorOutputSurface();
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // OutputSurface.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool BindToClient(cc::OutputSurfaceClient* surface_client) OVERRIDE;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Reshape(const gfx::Size& size, float scale_factor) OVERRIDE;
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetNeedsBeginFrame(bool enable) OVERRIDE;
715e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Partial SynchronousCompositor API implementation.
74bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  bool InitializeHwDraw(
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      scoped_refptr<cc::ContextProvider> onscreen_context_provider);
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void ReleaseHwDraw();
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_ptr<cc::CompositorFrame> DemandDrawHw(
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Size surface_size,
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::Transform& transform,
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Rect viewport,
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Rect clip,
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      gfx::Rect viewport_rect_for_tile_priority,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const gfx::Transform& transform_for_tile_priority);
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void ReturnResources(const cc::CompositorFrameAck& frame_ack);
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> DemandDrawSw(SkCanvas* canvas);
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetMemoryPolicy(const SynchronousCompositorMemoryPolicy& policy);
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void GetMessagesToDeliver(ScopedVector<IPC::Message>* messages);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  class SoftwareDevice;
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  friend class SoftwareDevice;
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void InvokeComposite(const gfx::Transform& transform,
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       gfx::Rect viewport,
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       gfx::Rect clip,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       gfx::Rect viewport_rect_for_tile_priority,
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       gfx::Transform transform_for_tile_priority,
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       bool hardware_draw);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool CalledOnValidThread() const;
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SynchronousCompositorOutputSurfaceDelegate* GetDelegate();
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int routing_id_;
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool needs_begin_frame_;
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool invoking_composite_;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Transform cached_hw_transform_;
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect cached_hw_viewport_;
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Rect cached_hw_clip_;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Rect cached_hw_viewport_rect_for_tile_priority_;
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Transform cached_hw_transform_for_tile_priority_;
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Only valid (non-NULL) during a DemandDrawSw() call.
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SkCanvas* current_sw_canvas_;
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  cc::ManagedMemoryPolicy memory_policy_;
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  cc::OutputSurfaceClient* output_surface_client_;
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> frame_holder_;
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorOutputSurface);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace content
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_
128