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