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