Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1081)

Side by Side Diff: blimp/client/core/render_widget/blimp_render_widget.cc

Issue 2241623002: blimp: Move compositing, input and render widget feature to client/core. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moar gn fix Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #include "blimp/client/core/render_widget/blimp_render_widget.h"
6
7 #include "base/logging.h"
8 #include "blimp/client/core/compositor/blob_image_serialization_processor.h"
9 #include "blimp/client/core/compositor/compositor_deps_provider.h"
10 #include "blimp/client/core/render_widget/blimp_render_widget_delegate.h"
11 #include "blimp/net/blimp_stats.h"
12 #include "cc/proto/compositor_message.pb.h"
13
14 namespace blimp {
15 namespace client {
16
17 class BlimpRenderWidget::DirectRenderingDeps {
18 public:
19 explicit DirectRenderingDeps(BlimpRenderWidget* render_widget)
20 : render_widget_(render_widget),
21 window_(gfx::kNullAcceleratedWidget),
22 visible_(false),
23 output_surface_request_pending_(false) {
24 DCHECK(render_widget_);
25 }
26
27 ~DirectRenderingDeps() = default;
28
29 void SetAcceleratedWidget(gfx::AcceleratedWidget widget) {
30 if (widget == gfx::kNullAcceleratedWidget &&
31 window_ == gfx::kNullAcceleratedWidget) {
32 return;
33 }
34
35 // If we did not have a widget, the compositor should not be visible.
36 DCHECK(window_ != gfx::kNullAcceleratedWidget ||
37 !render_widget_->compositor_->IsVisible());
38
39 // Release any references to the old widget.
40 UpdateVisibility(false);
41
42 window_ = widget;
43 UpdateVisibility(visible_ && window_ != gfx::kNullAcceleratedWidget);
44 }
45
46 void SetVisible(bool visible) {
47 visible_ = visible;
48 UpdateVisibility(visible_ && window_ != gfx::kNullAcceleratedWidget);
49 }
50
51 void RequestOutputSurface() {
52 DCHECK(!output_surface_request_pending_);
53 output_surface_request_pending_ = true;
54 HandlePendingOutputSurfaceRequest();
55 }
56
57 private:
58 void HandlePendingOutputSurfaceRequest() {
59 if (!output_surface_request_pending_) {
60 return;
61 }
62
63 render_widget_->compositor_->SetOutputSurface(
64 render_widget_->compositor_deps_provider_->CreateDelegatedOutputSurface(
65 window_));
66
67 output_surface_request_pending_ = false;
68 }
69
70 void UpdateVisibility(bool visible) {
71 if (visible) {
72 render_widget_->compositor_->SetVisible(true);
73 HandlePendingOutputSurfaceRequest();
74 } else {
75 render_widget_->compositor_->SetVisible(false);
76 render_widget_->compositor_->ReleaseOutputSurface();
77 }
78 }
79
80 BlimpRenderWidget* render_widget_;
81
82 gfx::AcceleratedWidget window_;
83 bool visible_;
84
85 // Whether there is an OutputSurface request pending from the current
86 // compositor. Becomes |true| if RequestOutputSurface is called, and |false|
87 // if compositor is deleted or we succeed in creating an OutputSurface.
88 bool output_surface_request_pending_;
89 };
90
91 BlimpRenderWidget::BlimpRenderWidget(
92 int32_t render_widget_id,
93 CompositorDepsProvider* compositor_deps_provider,
94 BlimpRenderWidgetDelegate* delegate)
95 : render_widget_id_(render_widget_id),
96 compositor_deps_provider_(compositor_deps_provider),
97 delegate_(delegate) {
98 DCHECK(delegate_);
99
100 compositor_ = base::MakeUnique<BlimpCompositor>(
101 compositor_deps_provider->GetTaskGraphRunner(),
102 compositor_deps_provider_->GetGpuMemoryBufferManager(),
103 BlobImageSerializationProcessor::current(),
104 compositor_deps_provider_->GetLayerTreeSettings(),
105 compositor_deps_provider_->GetCompositorTaskRunner(), this);
106
107 if (compositor_deps_provider_->use_internal_display()) {
108 direct_rendering_deps_ = base::MakeUnique<DirectRenderingDeps>(this);
109 }
110 }
111
112 BlimpRenderWidget::~BlimpRenderWidget() {}
113
114 int32_t BlimpRenderWidget::GetId() const {
115 return render_widget_id_;
116 }
117
118 void BlimpRenderWidget::SetAcceleratedWidget(gfx::AcceleratedWidget widget) {
119 DCHECK(direct_rendering_deps_);
120 direct_rendering_deps_->SetAcceleratedWidget(widget);
121 }
122
123 void BlimpRenderWidget::SetVisible(bool visible) {
124 if (direct_rendering_deps_) {
125 direct_rendering_deps_->SetVisible(visible);
126 } else {
127 compositor_->SetVisible(visible);
128 }
129 }
130
131 // Move to the BlimpRenderWidgetView.
132 bool BlimpRenderWidget::OnTouchEvent(const ui::MotionEvent& motion_event) {
133 if (compositor_->input_manager()) {
134 return compositor_->input_manager()->OnTouchEvent(motion_event);
135 }
136 return false;
137 }
138
139 void BlimpRenderWidget::OnCompositorMessageReceived(
140 std::unique_ptr<cc::proto::CompositorMessage> message) {
141 compositor_->OnCompositorMessageReceived(std::move(message));
142 }
143
144 void BlimpRenderWidget::DidCompleteSwapBuffers() {
145 delegate_->CompositorDidCompleteSwapBuffers();
146 }
147
148 void BlimpRenderWidget::DidCommitAndDrawFrame() {
149 BlimpStats::GetInstance()->Add(BlimpStats::EventType::COMMIT, 1);
150 }
151
152 void BlimpRenderWidget::SendWebGestureEvent(
153 const blink::WebGestureEvent& gesture_event) {
154 delegate_->SendWebGestureEvent(this, gesture_event);
155 }
156
157 void BlimpRenderWidget::SendCompositorMessage(
158 const cc::proto::CompositorMessage& message) {
159 delegate_->SendCompositorMessage(this, message);
160 }
161
162 void BlimpRenderWidget::RequestOutputSurface() {
163 if (direct_rendering_deps_) {
164 direct_rendering_deps_->RequestOutputSurface();
165 }
166
167 // TODO(khushalsagar): Add support for delegated rendering.
168 }
169
170 } // namespace client
171 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698