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_PUBLIC_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_H_ 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define CONTENT_PUBLIC_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/ref_counted.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/common/content_export.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/service/in_process_command_buffer.h" 11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/gfx/rect.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ui/gfx/size.h" 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SkCanvas; 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace cc { 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CompositorFrame; 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class CompositorFrameAck; 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace gfx { 22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class Transform; 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}; 24b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace gpu { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GLInProcessContext; 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content { 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SynchronousCompositorClient; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class WebContents; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)struct CONTENT_EXPORT SynchronousCompositorMemoryPolicy { 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Memory limit for rendering and pre-rendering. 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t bytes_limit; 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Limit of number of GL resources used for rendering and pre-rendering. 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t num_resources_limit; 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SynchronousCompositorMemoryPolicy(); 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool operator==(const SynchronousCompositorMemoryPolicy& other) const; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool operator!=(const SynchronousCompositorMemoryPolicy& other) const; 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Interface for embedders that wish to direct compositing operations 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// synchronously under their own control. Only meaningful when the 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// kEnableSyncrhonousRendererCompositor flag is specified. 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CONTENT_EXPORT SynchronousCompositor { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Must be called once per WebContents instance. Will create the compositor 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // instance as needed, but only if |client| is non-NULL. 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void SetClientForWebContents(WebContents* contents, 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SynchronousCompositorClient* client); 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Allows changing or resetting the client to NULL (this must be used if 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the client is being deleted prior to the DidDestroyCompositor() call 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // being received by the client). Ownership of |client| remains with 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the caller. 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetClient(SynchronousCompositorClient* client) = 0; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void SetGpuService( 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<gpu::InProcessCommandBuffer::Service> service); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // By default, synchronous compopsitor records the full layer, not only 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // what is inside and around the view port. This can be used to switch 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // between this record-full-layer behavior and normal record-around-viewport 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // behavior. 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void SetRecordFullDocument(bool record_full_document); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Synchronously initialize compositor for hardware draw. Can only be called 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // while compositor is in software only mode, either after compositor is 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // first created or after ReleaseHwDraw is called. It is invalid to 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // DemandDrawHw before this returns true. 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool InitializeHwDraw() = 0; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Reverse of InitializeHwDraw above. Can only be called while hardware draw 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // is already initialized. Brings compositor back to software only mode and 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // releases all hardware resources. 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ReleaseHwDraw() = 0; 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // "On demand" hardware draw. The content is first clipped to |damage_area|, 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // then transformed through |transform|, and finally clipped to |view_size|. 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual scoped_ptr<cc::CompositorFrame> DemandDrawHw( 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Size surface_size, 87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const gfx::Transform& transform, 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Rect viewport, 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Rect clip, 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::Rect viewport_rect_for_tile_priority, 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::Transform& transform_for_tile_priority) = 0; 92b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For delegated rendering, return resources from parent compositor to this. 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Note that all resources must be returned before ReleaseHwDraw. 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void ReturnResources(const cc::CompositorFrameAck& frame_ack) = 0; 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // "On demand" SW draw, into the supplied canvas (observing the transform 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // and clip set there-in). 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual bool DemandDrawSw(SkCanvas* canvas) = 0; 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Set the memory limit policy of this compositor. 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetMemoryPolicy( 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const SynchronousCompositorMemoryPolicy& policy) = 0; 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Should be called by the embedder after the embedder had modified the 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // scroll offset of the root layer (as returned by 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // SynchronousCompositorClient::GetTotalRootLayerScrollOffset). 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void DidChangeRootLayerScrollOffset() = 0; 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~SynchronousCompositor() {} 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif // CONTENT_PUBLIC_BROWSER_ANDROID_SYNCHRONOUS_COMPOSITOR_H_ 117