summaryrefslogtreecommitdiffstats
path: root/content/renderer/android/synchronous_compositor_proxy.h
blob: 4d3db9ce6298e6a5ce3f49a25fa78eb18bc4fa3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_H_
#define CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_H_

#include <stddef.h>
#include <stdint.h>

#include "base/macros.h"
#include "content/common/input/input_event_ack_state.h"
#include "content/renderer/android/synchronous_compositor_external_begin_frame_source.h"
#include "content/renderer/android/synchronous_compositor_output_surface.h"
#include "content/renderer/input/input_handler_manager_client.h"
#include "ui/events/blink/synchronous_input_handler_proxy.h"
#include "ui/gfx/geometry/scroll_offset.h"
#include "ui/gfx/geometry/size_f.h"

namespace IPC {
class Message;
class Sender;
}  // namespace IPC

namespace blink {
class WebInputEvent;
}  // namespace blink

namespace cc {
class CompositorFrame;
}  // namespace cc

namespace content {

class SynchronousCompositorOutputSurface;
struct SyncCompositorCommonBrowserParams;
struct SyncCompositorCommonRendererParams;
struct SyncCompositorDemandDrawHwParams;
struct SyncCompositorDemandDrawSwParams;
struct SyncCompositorSetSharedMemoryParams;

class SynchronousCompositorProxy
    : public ui::SynchronousInputHandler,
      public SynchronousCompositorExternalBeginFrameSourceClient,
      public SynchronousCompositorOutputSurfaceClient {
 public:
  SynchronousCompositorProxy(
      int routing_id,
      IPC::Sender* sender,
      SynchronousCompositorOutputSurface* output_surface,
      SynchronousCompositorExternalBeginFrameSource* begin_frame_source,
      ui::SynchronousInputHandlerProxy* input_handler_proxy,
      InputHandlerManagerClient::Handler* handler);
  ~SynchronousCompositorProxy() override;

  // ui::SynchronousInputHandler overrides.
  void SetNeedsSynchronousAnimateInput() override;
  void UpdateRootLayerState(const gfx::ScrollOffset& total_scroll_offset,
                            const gfx::ScrollOffset& max_scroll_offset,
                            const gfx::SizeF& scrollable_size,
                            float page_scale_factor,
                            float min_page_scale_factor,
                            float max_page_scale_factor) override;

  // SynchronousCompositorExternalBeginFrameSourceClient overrides.
  void OnNeedsBeginFramesChange(bool needs_begin_frames) override;

  // SynchronousCompositorOutputSurfaceClient overrides.
  void Invalidate() override;
  void SwapBuffers(cc::CompositorFrame* frame) override;

  void OnMessageReceived(const IPC::Message& message);
  bool Send(IPC::Message* message);
  void DidOverscroll(const DidOverscrollParams& did_overscroll_params);

 private:
  struct SharedMemoryWithSize;

  void ProcessCommonParams(
      const SyncCompositorCommonBrowserParams& common_params);
  void PopulateCommonParams(SyncCompositorCommonRendererParams* params);

  // IPC handlers.
  void HandleInputEvent(
      const SyncCompositorCommonBrowserParams& common_params,
      const blink::WebInputEvent* event,
      SyncCompositorCommonRendererParams* common_renderer_params,
      InputEventAckState* ack);
  void BeginFrame(const SyncCompositorCommonBrowserParams& common_params,
                  const cc::BeginFrameArgs& args,
                  SyncCompositorCommonRendererParams* common_renderer_params);
  void OnComputeScroll(const SyncCompositorCommonBrowserParams& common_params,
                       base::TimeTicks animation_time);
  void DemandDrawHw(const SyncCompositorCommonBrowserParams& common_params,
                    const SyncCompositorDemandDrawHwParams& params,
                    IPC::Message* reply_message);
  void SetSharedMemory(
      const SyncCompositorCommonBrowserParams& common_params,
      const SyncCompositorSetSharedMemoryParams& params,
      bool* success,
      SyncCompositorCommonRendererParams* common_renderer_params);
  void ZeroSharedMemory();
  void DemandDrawSw(const SyncCompositorCommonBrowserParams& common_params,
                    const SyncCompositorDemandDrawSwParams& params,
                    IPC::Message* reply_message);

  void SwapBuffersHw(cc::CompositorFrame* frame);
  void SendDemandDrawHwReply(cc::CompositorFrame* frame,
                             IPC::Message* reply_message);
  void DoDemandDrawSw(const SyncCompositorDemandDrawSwParams& params);
  void SwapBuffersSw(cc::CompositorFrame* frame);
  void SendDemandDrawSwReply(bool success,
                             cc::CompositorFrame* frame,
                             IPC::Message* reply_message);
  void DidActivatePendingTree();
  void DeliverMessages();
  void SendAsyncRendererStateIfNeeded();

  const int routing_id_;
  IPC::Sender* const sender_;
  SynchronousCompositorOutputSurface* const output_surface_;
  SynchronousCompositorExternalBeginFrameSource* const begin_frame_source_;
  ui::SynchronousInputHandlerProxy* const input_handler_proxy_;
  InputHandlerManagerClient::Handler* const input_handler_;
  bool inside_receive_;
  IPC::Message* hardware_draw_reply_;
  IPC::Message* software_draw_reply_;

  // From browser.
  size_t bytes_limit_;
  scoped_ptr<SharedMemoryWithSize> software_draw_shm_;

  // To browser.
  uint32_t version_;
  gfx::ScrollOffset total_scroll_offset_;  // Modified by both.
  gfx::ScrollOffset max_scroll_offset_;
  gfx::SizeF scrollable_size_;
  float page_scale_factor_;
  float min_page_scale_factor_;
  float max_page_scale_factor_;
  bool need_animate_scroll_;
  bool need_invalidate_;
  bool need_begin_frame_;
  bool did_activate_pending_tree_;

  DISALLOW_COPY_AND_ASSIGN(SynchronousCompositorProxy);
};

}  // namespace content

#endif  // CONTENT_RENDERER_ANDROID_SYNCHRONOUS_COMPOSITOR_PROXY_H_