OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/view_manager/display_manager.h" | 5 #include "components/view_manager/display_manager.h" |
6 | 6 |
7 #include "base/numerics/safe_conversions.h" | 7 #include "base/numerics/safe_conversions.h" |
8 #include "components/view_manager/display_manager_factory.h" | 8 #include "components/view_manager/display_manager_factory.h" |
9 #include "components/view_manager/gles2/gpu_state.h" | 9 #include "components/view_manager/gles2/gpu_state.h" |
10 #include "components/view_manager/native_viewport/onscreen_context_provider.h" | |
11 #include "components/view_manager/public/interfaces/gpu.mojom.h" | 10 #include "components/view_manager/public/interfaces/gpu.mojom.h" |
12 #include "components/view_manager/public/interfaces/quads.mojom.h" | 11 #include "components/view_manager/public/interfaces/quads.mojom.h" |
13 #include "components/view_manager/public/interfaces/surfaces.mojom.h" | 12 #include "components/view_manager/public/interfaces/surfaces.mojom.h" |
14 #include "components/view_manager/server_view.h" | 13 #include "components/view_manager/server_view.h" |
| 14 #include "components/view_manager/surfaces/surfaces_state.h" |
15 #include "components/view_manager/view_coordinate_conversions.h" | 15 #include "components/view_manager/view_coordinate_conversions.h" |
16 #include "mojo/application/public/cpp/application_connection.h" | 16 #include "mojo/application/public/cpp/application_connection.h" |
17 #include "mojo/application/public/cpp/application_impl.h" | 17 #include "mojo/application/public/cpp/application_impl.h" |
18 #include "mojo/converters/geometry/geometry_type_converters.h" | 18 #include "mojo/converters/geometry/geometry_type_converters.h" |
19 #include "mojo/converters/input_events/input_events_type_converters.h" | 19 #include "mojo/converters/input_events/input_events_type_converters.h" |
20 #include "mojo/converters/input_events/mojo_extended_key_event_data.h" | 20 #include "mojo/converters/input_events/mojo_extended_key_event_data.h" |
21 #include "mojo/converters/surfaces/surfaces_type_converters.h" | 21 #include "mojo/converters/surfaces/surfaces_type_converters.h" |
22 #include "mojo/converters/surfaces/surfaces_utils.h" | 22 #include "mojo/converters/surfaces/surfaces_utils.h" |
23 #include "mojo/converters/transform/transform_type_converters.h" | 23 #include "mojo/converters/transform/transform_type_converters.h" |
24 #include "ui/events/event.h" | 24 #include "ui/events/event.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 | 97 |
98 } // namespace | 98 } // namespace |
99 | 99 |
100 // static | 100 // static |
101 DisplayManagerFactory* DisplayManager::factory_ = nullptr; | 101 DisplayManagerFactory* DisplayManager::factory_ = nullptr; |
102 | 102 |
103 // static | 103 // static |
104 DisplayManager* DisplayManager::Create( | 104 DisplayManager* DisplayManager::Create( |
105 bool is_headless, | 105 bool is_headless, |
106 mojo::ApplicationImpl* app_impl, | 106 mojo::ApplicationImpl* app_impl, |
107 const scoped_refptr<gles2::GpuState>& gpu_state) { | 107 const scoped_refptr<gles2::GpuState>& gpu_state, |
108 if (factory_) | 108 const scoped_refptr<surfaces::SurfacesState>& surfaces_state) { |
109 return factory_->CreateDisplayManager(is_headless, app_impl, gpu_state); | 109 if (factory_) { |
110 return new DefaultDisplayManager(is_headless, app_impl, gpu_state); | 110 return factory_->CreateDisplayManager(is_headless, |
| 111 app_impl, |
| 112 gpu_state, |
| 113 surfaces_state); |
| 114 } |
| 115 return new DefaultDisplayManager(is_headless, |
| 116 app_impl, |
| 117 gpu_state, |
| 118 surfaces_state); |
111 } | 119 } |
112 | 120 |
113 DefaultDisplayManager::DefaultDisplayManager( | 121 DefaultDisplayManager::DefaultDisplayManager( |
114 bool is_headless, | 122 bool is_headless, |
115 mojo::ApplicationImpl* app_impl, | 123 mojo::ApplicationImpl* app_impl, |
116 const scoped_refptr<gles2::GpuState>& gpu_state) | 124 const scoped_refptr<gles2::GpuState>& gpu_state, |
| 125 const scoped_refptr<surfaces::SurfacesState>& surfaces_state) |
117 : is_headless_(is_headless), | 126 : is_headless_(is_headless), |
118 app_impl_(app_impl), | 127 app_impl_(app_impl), |
119 gpu_state_(gpu_state), | 128 gpu_state_(gpu_state), |
| 129 surfaces_state_(surfaces_state), |
120 delegate_(nullptr), | 130 delegate_(nullptr), |
121 draw_timer_(false, false), | 131 draw_timer_(false, false), |
122 frame_pending_(false), | 132 frame_pending_(false), |
123 context_provider_( | |
124 new native_viewport::OnscreenContextProvider(gpu_state)), | |
125 weak_factory_(this) { | 133 weak_factory_(this) { |
126 metrics_.size_in_pixels = mojo::Size::New(); | 134 metrics_.size_in_pixels = mojo::Size::New(); |
127 metrics_.size_in_pixels->width = 800; | 135 metrics_.size_in_pixels->width = 800; |
128 metrics_.size_in_pixels->height = 600; | 136 metrics_.size_in_pixels->height = 600; |
129 } | 137 } |
130 | 138 |
131 void DefaultDisplayManager::Init(DisplayManagerDelegate* delegate) { | 139 void DefaultDisplayManager::Init(DisplayManagerDelegate* delegate) { |
132 delegate_ = delegate; | 140 delegate_ = delegate; |
133 | 141 |
134 gfx::Rect bounds(metrics_.size_in_pixels.To<gfx::Size>()); | 142 gfx::Rect bounds(metrics_.size_in_pixels.To<gfx::Size>()); |
135 if (is_headless_) { | 143 if (is_headless_) { |
136 platform_window_.reset(new ui::StubWindow(this)); | 144 platform_window_.reset(new ui::StubWindow(this)); |
137 } else { | 145 } else { |
138 #if defined(OS_WIN) | 146 #if defined(OS_WIN) |
139 platform_window_.reset(new ui::WinWindow(this, bounds)); | 147 platform_window_.reset(new ui::WinWindow(this, bounds)); |
140 #elif defined(USE_X11) | 148 #elif defined(USE_X11) |
141 platform_window_.reset(new ui::X11Window(this)); | 149 platform_window_.reset(new ui::X11Window(this)); |
142 #elif defined(OS_ANDROID) | 150 #elif defined(OS_ANDROID) |
143 platform_window_.reset(new ui::PlatformWindowAndroid(this)); | 151 platform_window_.reset(new ui::PlatformWindowAndroid(this)); |
144 #else | 152 #else |
145 NOTREACHED() << "Unsupported platform"; | 153 NOTREACHED() << "Unsupported platform"; |
146 #endif | 154 #endif |
147 } | 155 } |
148 platform_window_->SetBounds(bounds); | 156 platform_window_->SetBounds(bounds); |
149 platform_window_->Show(); | 157 platform_window_->Show(); |
150 | |
151 mojo::ContextProviderPtr context_provider; | |
152 context_provider_->Bind(GetProxy(&context_provider).Pass()); | |
153 mojo::DisplayFactoryPtr display_factory; | |
154 mojo::URLRequestPtr request(mojo::URLRequest::New()); | |
155 request->url = mojo::String::From("mojo:surfaces_service"); | |
156 app_impl_->ConnectToService(request.Pass(), &display_factory); | |
157 // TODO(fsamuel): We should indicate to the delegate that this object failed | |
158 // to initialize. | |
159 if (!display_factory) | |
160 return; | |
161 display_factory->Create(context_provider.Pass(), | |
162 nullptr, // returner - we never submit resources. | |
163 GetProxy(&display_)); | |
164 } | 158 } |
165 | 159 |
166 DefaultDisplayManager::~DefaultDisplayManager() { | 160 DefaultDisplayManager::~DefaultDisplayManager() { |
167 // Destroy before |platform_window_| because this will destroy | |
168 // CommandBufferDriver objects that contain child windows. Otherwise if this | |
169 // class destroys its window first, X errors will occur. | |
170 context_provider_.reset(); | |
171 | |
172 // Destroy the PlatformWindow early on as it may call us back during | 161 // Destroy the PlatformWindow early on as it may call us back during |
173 // destruction and we want to be in a known state. | 162 // destruction and we want to be in a known state. |
174 platform_window_.reset(); | 163 platform_window_.reset(); |
175 } | 164 } |
176 | 165 |
177 void DefaultDisplayManager::SchedulePaint(const ServerView* view, | 166 void DefaultDisplayManager::SchedulePaint(const ServerView* view, |
178 const gfx::Rect& bounds) { | 167 const gfx::Rect& bounds) { |
179 DCHECK(view); | 168 DCHECK(view); |
180 if (!view->IsDrawn()) | 169 if (!view->IsDrawn()) |
181 return; | 170 return; |
(...skipping 19 matching lines...) Expand all Loading... |
201 gfx::Rect rect(metrics_.size_in_pixels.To<gfx::Size>()); | 190 gfx::Rect rect(metrics_.size_in_pixels.To<gfx::Size>()); |
202 auto pass = mojo::CreateDefaultPass(1, rect); | 191 auto pass = mojo::CreateDefaultPass(1, rect); |
203 pass->damage_rect = Rect::From(dirty_rect_); | 192 pass->damage_rect = Rect::From(dirty_rect_); |
204 | 193 |
205 DrawViewTree(pass.get(), delegate_->GetRootView(), gfx::Vector2d(), 1.0f); | 194 DrawViewTree(pass.get(), delegate_->GetRootView(), gfx::Vector2d(), 1.0f); |
206 | 195 |
207 auto frame = mojo::Frame::New(); | 196 auto frame = mojo::Frame::New(); |
208 frame->passes.push_back(pass.Pass()); | 197 frame->passes.push_back(pass.Pass()); |
209 frame->resources.resize(0u); | 198 frame->resources.resize(0u); |
210 frame_pending_ = true; | 199 frame_pending_ = true; |
211 if (display_) { | 200 if (top_level_display_client_) { |
212 display_->SubmitFrame(frame.Pass(), | 201 top_level_display_client_->SubmitFrame( |
213 base::Bind(&DefaultDisplayManager::DidDraw, | 202 frame.Pass(), |
214 weak_factory_.GetWeakPtr())); | 203 base::Bind(&DefaultDisplayManager::DidDraw, base::Unretained(this))); |
215 } | 204 } |
216 dirty_rect_ = gfx::Rect(); | 205 dirty_rect_ = gfx::Rect(); |
217 } | 206 } |
218 | 207 |
219 void DefaultDisplayManager::DidDraw() { | 208 void DefaultDisplayManager::DidDraw() { |
220 frame_pending_ = false; | 209 frame_pending_ = false; |
221 if (!dirty_rect_.IsEmpty()) | 210 if (!dirty_rect_.IsEmpty()) |
222 WantToDraw(); | 211 WantToDraw(); |
223 } | 212 } |
224 | 213 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 void DefaultDisplayManager::OnWindowStateChanged( | 315 void DefaultDisplayManager::OnWindowStateChanged( |
327 ui::PlatformWindowState new_state) { | 316 ui::PlatformWindowState new_state) { |
328 } | 317 } |
329 | 318 |
330 void DefaultDisplayManager::OnLostCapture() { | 319 void DefaultDisplayManager::OnLostCapture() { |
331 } | 320 } |
332 | 321 |
333 void DefaultDisplayManager::OnAcceleratedWidgetAvailable( | 322 void DefaultDisplayManager::OnAcceleratedWidgetAvailable( |
334 gfx::AcceleratedWidget widget, | 323 gfx::AcceleratedWidget widget, |
335 float device_pixel_ratio) { | 324 float device_pixel_ratio) { |
336 context_provider_->SetAcceleratedWidget(widget); | 325 top_level_display_client_.reset( |
| 326 new surfaces::TopLevelDisplayClient(widget, gpu_state_, surfaces_state_)); |
337 UpdateMetrics(metrics_.size_in_pixels.To<gfx::Size>(), device_pixel_ratio); | 327 UpdateMetrics(metrics_.size_in_pixels.To<gfx::Size>(), device_pixel_ratio); |
338 } | 328 } |
339 | 329 |
340 void DefaultDisplayManager::OnActivationChanged(bool active) { | 330 void DefaultDisplayManager::OnActivationChanged(bool active) { |
341 } | 331 } |
342 | 332 |
343 } // namespace view_manager | 333 } // namespace view_manager |
OLD | NEW |