root_frame_sink_proxy.cc 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Copyright 2019 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. #include "android_webview/browser/gfx/root_frame_sink_proxy.h"
  5. #include <utility>
  6. #include "android_webview/browser/gfx/root_frame_sink.h"
  7. #include "android_webview/browser/gfx/viz_compositor_thread_runner_webview.h"
  8. #include "base/memory/raw_ptr.h"
  9. namespace android_webview {
  10. class RootFrameSinkProxy::RootFrameSinkClientImpl : public RootFrameSinkClient {
  11. public:
  12. RootFrameSinkClientImpl(RootFrameSinkProxy* owner) : owner_(owner) {}
  13. ~RootFrameSinkClientImpl() override = default;
  14. // RootFrameSinkClient implementation
  15. void SetNeedsBeginFrames(bool needs_begin_frame) override {
  16. owner_->SetNeedsBeginFramesOnViz(needs_begin_frame);
  17. }
  18. void Invalidate() override { owner_->InvalidateOnViz(); }
  19. void ReturnResources(viz::FrameSinkId frame_sink_id,
  20. uint32_t layer_tree_frame_sink_id,
  21. std::vector<viz::ReturnedResource> resources) override {
  22. owner_->ReturnResourcesOnViz(frame_sink_id, layer_tree_frame_sink_id,
  23. std::move(resources));
  24. }
  25. void OnCompositorFrameTransitionDirectiveProcessed(
  26. viz::FrameSinkId frame_sink_id,
  27. uint32_t layer_tree_frame_sink_id,
  28. uint32_t sequence_id) override {
  29. owner_->OnCompositorFrameTransitionDirectiveProcessedOnViz(
  30. frame_sink_id, layer_tree_frame_sink_id, sequence_id);
  31. }
  32. private:
  33. const raw_ptr<RootFrameSinkProxy> owner_;
  34. };
  35. // static
  36. scoped_refptr<RootFrameSink> RootFrameSinkProxy::GetRootFrameSinkHelper(
  37. base::WeakPtr<RootFrameSinkProxy> proxy) {
  38. DCHECK(VizCompositorThreadRunnerWebView::GetInstance()
  39. ->task_runner()
  40. ->BelongsToCurrentThread());
  41. if (proxy)
  42. return proxy->without_gpu_;
  43. return nullptr;
  44. }
  45. RootFrameSinkProxy::RootFrameSinkProxy(
  46. const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
  47. RootFrameSinkProxyClient* client,
  48. viz::BeginFrameSource* begin_frame_source)
  49. : ui_task_runner_(ui_task_runner),
  50. viz_task_runner_(
  51. VizCompositorThreadRunnerWebView::GetInstance()->task_runner()),
  52. client_(client),
  53. begin_frame_source_(begin_frame_source) {
  54. DETACH_FROM_THREAD(viz_thread_checker_);
  55. viz_task_runner_->PostTask(
  56. FROM_HERE, base::BindOnce(&RootFrameSinkProxy::InitializeOnViz,
  57. base::Unretained(this)));
  58. }
  59. void RootFrameSinkProxy::InitializeOnViz() {
  60. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  61. root_frame_sink_client_ = std::make_unique<RootFrameSinkClientImpl>(this);
  62. without_gpu_ =
  63. base::MakeRefCounted<RootFrameSink>(root_frame_sink_client_.get());
  64. }
  65. RootFrameSinkProxy::~RootFrameSinkProxy() {
  66. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  67. VizCompositorThreadRunnerWebView::GetInstance()->PostTaskAndBlock(
  68. FROM_HERE, base::BindOnce(&RootFrameSinkProxy::DestroyOnViz,
  69. base::Unretained(this)));
  70. if (observing_bfs_)
  71. begin_frame_source_->RemoveObserver(this);
  72. }
  73. void RootFrameSinkProxy::DestroyOnViz() {
  74. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  75. without_gpu_->DettachClient();
  76. without_gpu_.reset();
  77. weak_ptr_factory_on_viz_.InvalidateWeakPtrs();
  78. root_frame_sink_client_.reset();
  79. }
  80. void RootFrameSinkProxy::SetNeedsBeginFramesOnViz(bool needs_begin_frames) {
  81. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  82. ui_task_runner_->PostTask(
  83. FROM_HERE,
  84. base::BindOnce(&RootFrameSinkProxy::SetNeedsBeginFramesOnUI,
  85. weak_ptr_factory_.GetWeakPtr(), needs_begin_frames));
  86. }
  87. void RootFrameSinkProxy::SetNeedsBeginFramesOnUI(bool needs_begin_frames) {
  88. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  89. if (observing_bfs_ == needs_begin_frames)
  90. return;
  91. observing_bfs_ = needs_begin_frames;
  92. if (needs_begin_frames)
  93. begin_frame_source_->AddObserver(this);
  94. else
  95. begin_frame_source_->RemoveObserver(this);
  96. }
  97. void RootFrameSinkProxy::InvalidateOnViz() {
  98. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  99. ui_task_runner_->PostTask(FROM_HERE,
  100. base::BindOnce(&RootFrameSinkProxy::InvalidateOnUI,
  101. weak_ptr_factory_.GetWeakPtr()));
  102. }
  103. void RootFrameSinkProxy::InvalidateOnUI() {
  104. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  105. client_->Invalidate();
  106. }
  107. void RootFrameSinkProxy::AddChildFrameSinkId(
  108. const viz::FrameSinkId& frame_sink_id) {
  109. DCHECK_NE(frame_sink_id.client_id(), 0u);
  110. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  111. viz_task_runner_->PostTask(
  112. FROM_HERE,
  113. base::BindOnce(&RootFrameSinkProxy::AddChildFrameSinkIdOnViz,
  114. weak_ptr_factory_on_viz_.GetWeakPtr(), frame_sink_id));
  115. }
  116. void RootFrameSinkProxy::AddChildFrameSinkIdOnViz(
  117. const viz::FrameSinkId& frame_sink_id) {
  118. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  119. without_gpu_->AddChildFrameSinkId(frame_sink_id);
  120. }
  121. void RootFrameSinkProxy::RemoveChildFrameSinkId(
  122. const viz::FrameSinkId& frame_sink_id) {
  123. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  124. viz_task_runner_->PostTask(
  125. FROM_HERE,
  126. base::BindOnce(&RootFrameSinkProxy::RemoveChildFrameSinkIdOnViz,
  127. weak_ptr_factory_on_viz_.GetWeakPtr(), frame_sink_id));
  128. }
  129. void RootFrameSinkProxy::RemoveChildFrameSinkIdOnViz(
  130. const viz::FrameSinkId& frame_sink_id) {
  131. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  132. without_gpu_->RemoveChildFrameSinkId(frame_sink_id);
  133. }
  134. void RootFrameSinkProxy::OnInputEvent() {
  135. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  136. had_input_event_ = true;
  137. }
  138. bool RootFrameSinkProxy::BeginFrame(const viz::BeginFrameArgs& args) {
  139. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  140. bool invalidate = false;
  141. VizCompositorThreadRunnerWebView::GetInstance()->PostTaskAndBlock(
  142. FROM_HERE, base::BindOnce(&RootFrameSinkProxy::BeginFrameOnViz,
  143. base::Unretained(this), args, had_input_event_,
  144. &invalidate));
  145. had_input_event_ = false;
  146. return invalidate;
  147. }
  148. void RootFrameSinkProxy::BeginFrameOnViz(const viz::BeginFrameArgs& args,
  149. bool had_input_event,
  150. bool* invalidate) {
  151. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  152. *invalidate = without_gpu_->BeginFrame(args, had_input_event);
  153. }
  154. void RootFrameSinkProxy::SetBeginFrameSourcePausedOnViz(bool paused) {
  155. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  156. without_gpu_->SetBeginFrameSourcePaused(paused);
  157. }
  158. RootFrameSinkGetter RootFrameSinkProxy::GetRootFrameSinkCallback() {
  159. return base::BindRepeating(&RootFrameSinkProxy::GetRootFrameSinkHelper,
  160. weak_ptr_factory_on_viz_.GetWeakPtr());
  161. }
  162. void RootFrameSinkProxy::OnBeginFrameSourcePausedChanged(bool paused) {
  163. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  164. viz_task_runner_->PostTask(
  165. FROM_HERE,
  166. base::BindOnce(&RootFrameSinkProxy::SetBeginFrameSourcePausedOnViz,
  167. weak_ptr_factory_on_viz_.GetWeakPtr(), paused));
  168. }
  169. bool RootFrameSinkProxy::OnBeginFrameDerivedImpl(
  170. const viz::BeginFrameArgs& args) {
  171. DCHECK(client_);
  172. if (BeginFrame(args))
  173. client_->Invalidate();
  174. return true;
  175. }
  176. void RootFrameSinkProxy::ReturnResourcesOnUI(
  177. viz::FrameSinkId frame_sink_id,
  178. uint32_t layer_tree_frame_sink_id,
  179. std::vector<viz::ReturnedResource> resources) {
  180. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  181. client_->ReturnResourcesFromViz(frame_sink_id, layer_tree_frame_sink_id,
  182. std::move(resources));
  183. }
  184. void RootFrameSinkProxy::ReturnResourcesOnViz(
  185. viz::FrameSinkId frame_sink_id,
  186. uint32_t layer_tree_frame_sink_id,
  187. std::vector<viz::ReturnedResource> resources) {
  188. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  189. ui_task_runner_->PostTask(
  190. FROM_HERE,
  191. base::BindOnce(&RootFrameSinkProxy::ReturnResourcesOnUI,
  192. weak_ptr_factory_.GetWeakPtr(), frame_sink_id,
  193. layer_tree_frame_sink_id, std::move(resources)));
  194. }
  195. void RootFrameSinkProxy::OnCompositorFrameTransitionDirectiveProcessedOnUI(
  196. viz::FrameSinkId frame_sink_id,
  197. uint32_t layer_tree_frame_sink_id,
  198. uint32_t sequence_id) {
  199. DCHECK_CALLED_ON_VALID_THREAD(ui_thread_checker_);
  200. client_->OnCompositorFrameTransitionDirectiveProcessed(
  201. frame_sink_id, layer_tree_frame_sink_id, sequence_id);
  202. }
  203. void RootFrameSinkProxy::OnCompositorFrameTransitionDirectiveProcessedOnViz(
  204. viz::FrameSinkId frame_sink_id,
  205. uint32_t layer_tree_frame_sink_id,
  206. uint32_t sequence_id) {
  207. DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
  208. ui_task_runner_->PostTask(
  209. FROM_HERE,
  210. base::BindOnce(&RootFrameSinkProxy::
  211. OnCompositorFrameTransitionDirectiveProcessedOnUI,
  212. weak_ptr_factory_.GetWeakPtr(), frame_sink_id,
  213. layer_tree_frame_sink_id, sequence_id));
  214. }
  215. } // namespace android_webview