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

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: addressed comments from #7 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 CompositorDepsProvider::current()->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(int32_t render_widget_id,
92 BlimpRenderWidgetDelegate* delegate)
93 : render_widget_id_(render_widget_id), delegate_(delegate) {
94 DCHECK(delegate_);
95
96 CompositorDepsProvider* compositor_deps_provider =
97 CompositorDepsProvider::current();
98
99 compositor_ = base::MakeUnique<BlimpCompositor>(
100 compositor_deps_provider->GetTaskGraphRunner(),
101 compositor_deps_provider->GetGpuMemoryBufferManager(),
102 BlobImageSerializationProcessor::current(),
103 compositor_deps_provider->GetLayerTreeSettings(),
104 compositor_deps_provider->GetCompositorTaskRunner(), this);
105
106 if (compositor_deps_provider->use_internal_display()) {
107 direct_rendering_deps_ = base::MakeUnique<DirectRenderingDeps>(this);
108 }
109 }
110
111 BlimpRenderWidget::~BlimpRenderWidget() {}
112
113 int32_t BlimpRenderWidget::GetId() const {
114 return render_widget_id_;
115 }
116
117 void BlimpRenderWidget::SetAcceleratedWidget(gfx::AcceleratedWidget widget) {
118 DCHECK(direct_rendering_deps_);
119 direct_rendering_deps_->SetAcceleratedWidget(widget);
120 }
121
122 void BlimpRenderWidget::SetVisible(bool visible) {
123 if (direct_rendering_deps_) {
124 direct_rendering_deps_->SetVisible(visible);
125 } else {
126 compositor_->SetVisible(visible);
127 }
128 }
129
130 // Move to the BlimpRenderWidgetView.
131 bool BlimpRenderWidget::OnTouchEvent(const ui::MotionEvent& motion_event) {
132 if (compositor_->input_manager()) {
133 return compositor_->input_manager()->OnTouchEvent(motion_event);
134 }
135 return false;
136 }
137
138 void BlimpRenderWidget::OnCompositorMessageReceived(
139 std::unique_ptr<cc::proto::CompositorMessage> message) {
140 compositor_->OnCompositorMessageReceived(std::move(message));
141 }
142
143 void BlimpRenderWidget::DidCompleteSwapBuffers() {
144 delegate_->CompositorDidCompleteSwapBuffers();
145 }
146
147 void BlimpRenderWidget::DidCommitAndDrawFrame() {
148 BlimpStats::GetInstance()->Add(BlimpStats::EventType::COMMIT, 1);
149 }
150
151 void BlimpRenderWidget::SendWebGestureEvent(
152 const blink::WebGestureEvent& gesture_event) {
153 delegate_->SendWebGestureEvent(this, gesture_event);
154 }
155
156 void BlimpRenderWidget::SendCompositorMessage(
157 const cc::proto::CompositorMessage& message) {
158 delegate_->SendCompositorMessage(this, message);
159 }
160
161 void BlimpRenderWidget::RequestOutputSurface() {
162 if (direct_rendering_deps_) {
163 direct_rendering_deps_->RequestOutputSurface();
164 }
165
166 // TODO(khushalsagar): Add support for delegated rendering.
167 }
168
169 } // namespace client
170 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698