1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_ 6#define CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_ 7 8#include <vector> 9 10#include "base/basictypes.h" 11#include "base/compiler_specific.h" 12#include "base/memory/ref_counted.h" 13#include "base/memory/scoped_ptr.h" 14#include "cc/output/compositor_frame.h" 15#include "cc/output/managed_memory_policy.h" 16#include "cc/output/output_surface.h" 17#include "content/public/browser/android/synchronous_compositor.h" 18#include "ipc/ipc_message.h" 19#include "ui/gfx/transform.h" 20 21namespace cc { 22class ContextProvider; 23class CompositorFrameMetadata; 24} 25 26namespace IPC { 27class Message; 28} 29 30namespace content { 31 32class FrameSwapMessageQueue; 33class SynchronousCompositorClient; 34class SynchronousCompositorOutputSurface; 35class WebGraphicsContext3DCommandBufferImpl; 36 37class SynchronousCompositorOutputSurfaceDelegate { 38 public: 39 virtual void DidBindOutputSurface( 40 SynchronousCompositorOutputSurface* output_surface) = 0; 41 virtual void DidDestroySynchronousOutputSurface( 42 SynchronousCompositorOutputSurface* output_surface) = 0; 43 virtual void SetContinuousInvalidate(bool enable) = 0; 44 virtual void DidActivatePendingTree() = 0; 45 46 protected: 47 SynchronousCompositorOutputSurfaceDelegate() {} 48 virtual ~SynchronousCompositorOutputSurfaceDelegate() {} 49}; 50 51// Specialization of the output surface that adapts it to implement the 52// content::SynchronousCompositor public API. This class effects an "inversion 53// of control" - enabling drawing to be orchestrated by the embedding 54// layer, instead of driven by the compositor internals - hence it holds two 55// 'client' pointers (|client_| in the OutputSurface baseclass and 56// GetDelegate()) which represent the consumers of the two roles in plays. 57// This class can be created only on the main thread, but then becomes pinned 58// to a fixed thread when BindToClient is called. 59class SynchronousCompositorOutputSurface 60 : NON_EXPORTED_BASE(public cc::OutputSurface) { 61 public: 62 explicit SynchronousCompositorOutputSurface( 63 int routing_id, 64 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue); 65 virtual ~SynchronousCompositorOutputSurface(); 66 67 // OutputSurface. 68 virtual bool BindToClient(cc::OutputSurfaceClient* surface_client) OVERRIDE; 69 virtual void Reshape(const gfx::Size& size, float scale_factor) OVERRIDE; 70 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE; 71 virtual void SwapBuffers(cc::CompositorFrame* frame) OVERRIDE; 72 73 // Partial SynchronousCompositor API implementation. 74 bool InitializeHwDraw( 75 scoped_refptr<cc::ContextProvider> onscreen_context_provider); 76 void ReleaseHwDraw(); 77 scoped_ptr<cc::CompositorFrame> DemandDrawHw( 78 gfx::Size surface_size, 79 const gfx::Transform& transform, 80 gfx::Rect viewport, 81 gfx::Rect clip, 82 gfx::Rect viewport_rect_for_tile_priority, 83 const gfx::Transform& transform_for_tile_priority); 84 void ReturnResources(const cc::CompositorFrameAck& frame_ack); 85 scoped_ptr<cc::CompositorFrame> DemandDrawSw(SkCanvas* canvas); 86 void SetMemoryPolicy(const SynchronousCompositorMemoryPolicy& policy); 87 void GetMessagesToDeliver(ScopedVector<IPC::Message>* messages); 88 89 private: 90 class SoftwareDevice; 91 friend class SoftwareDevice; 92 93 void InvokeComposite(const gfx::Transform& transform, 94 gfx::Rect viewport, 95 gfx::Rect clip, 96 gfx::Rect viewport_rect_for_tile_priority, 97 gfx::Transform transform_for_tile_priority, 98 bool hardware_draw); 99 bool CalledOnValidThread() const; 100 SynchronousCompositorOutputSurfaceDelegate* GetDelegate(); 101 102 int routing_id_; 103 bool needs_begin_frame_; 104 bool invoking_composite_; 105 106 gfx::Transform cached_hw_transform_; 107 gfx::Rect cached_hw_viewport_; 108 gfx::Rect cached_hw_clip_; 109 gfx::Rect cached_hw_viewport_rect_for_tile_priority_; 110 gfx::Transform cached_hw_transform_for_tile_priority_; 111 112 // Only valid (non-NULL) during a DemandDrawSw() call. 113 SkCanvas* current_sw_canvas_; 114 115 cc::ManagedMemoryPolicy memory_policy_; 116 117 cc::OutputSurfaceClient* output_surface_client_; 118 scoped_ptr<cc::CompositorFrame> frame_holder_; 119 120 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_; 121 122 DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorOutputSurface); 123}; 124 125} // namespace content 126 127#endif // CONTENT_BROWSER_ANDROID_IN_PROCESS_SYNCHRONOUS_COMPOSITOR_OUTPUT_SURFACE_H_ 128