OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/renderer_host/render_widget_host_view_android.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_android.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "cc/layers/surface_layer.h" | 27 #include "cc/layers/surface_layer.h" |
28 #include "cc/output/compositor_frame.h" | 28 #include "cc/output/compositor_frame.h" |
29 #include "cc/output/copy_output_request.h" | 29 #include "cc/output/copy_output_request.h" |
30 #include "cc/output/copy_output_result.h" | 30 #include "cc/output/copy_output_result.h" |
31 #include "cc/output/latency_info_swap_promise.h" | 31 #include "cc/output/latency_info_swap_promise.h" |
32 #include "cc/resources/single_release_callback.h" | 32 #include "cc/resources/single_release_callback.h" |
33 #include "cc/surfaces/surface.h" | 33 #include "cc/surfaces/surface.h" |
34 #include "cc/surfaces/surface_hittest.h" | 34 #include "cc/surfaces/surface_hittest.h" |
35 #include "cc/surfaces/surface_manager.h" | 35 #include "cc/surfaces/surface_manager.h" |
36 #include "cc/trees/layer_tree_host.h" | 36 #include "cc/trees/layer_tree_host.h" |
37 #include "components/display_compositor/gl_helper.h" | 37 #include "components/viz/display_compositor/gl_helper.h" |
38 #include "content/browser/accessibility/browser_accessibility_manager_android.h" | 38 #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
39 #include "content/browser/android/composited_touch_handle_drawable.h" | 39 #include "content/browser/android/composited_touch_handle_drawable.h" |
40 #include "content/browser/android/content_view_core_impl.h" | 40 #include "content/browser/android/content_view_core_impl.h" |
41 #include "content/browser/android/ime_adapter_android.h" | 41 #include "content/browser/android/ime_adapter_android.h" |
42 #include "content/browser/android/overscroll_controller_android.h" | 42 #include "content/browser/android/overscroll_controller_android.h" |
43 #include "content/browser/android/selection_popup_controller.h" | 43 #include "content/browser/android/selection_popup_controller.h" |
44 #include "content/browser/android/synchronous_compositor_host.h" | 44 #include "content/browser/android/synchronous_compositor_host.h" |
45 #include "content/browser/compositor/surface_utils.h" | 45 #include "content/browser/compositor/surface_utils.h" |
46 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 46 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
47 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 47 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 } | 121 } |
122 }; | 122 }; |
123 | 123 |
124 using base::android::ApplicationState; | 124 using base::android::ApplicationState; |
125 using base::android::ApplicationStatusListener; | 125 using base::android::ApplicationStatusListener; |
126 | 126 |
127 class GLHelperHolder { | 127 class GLHelperHolder { |
128 public: | 128 public: |
129 static GLHelperHolder* Create(); | 129 static GLHelperHolder* Create(); |
130 | 130 |
131 display_compositor::GLHelper* gl_helper() { return gl_helper_.get(); } | 131 viz::GLHelper* gl_helper() { return gl_helper_.get(); } |
132 bool IsLost() { | 132 bool IsLost() { |
133 if (!gl_helper_) | 133 if (!gl_helper_) |
134 return true; | 134 return true; |
135 return provider_->ContextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR; | 135 return provider_->ContextGL()->GetGraphicsResetStatusKHR() != GL_NO_ERROR; |
136 } | 136 } |
137 | 137 |
138 void ReleaseIfPossible(); | 138 void ReleaseIfPossible(); |
139 | 139 |
140 private: | 140 private: |
141 GLHelperHolder(); | 141 GLHelperHolder(); |
142 void Initialize(); | 142 void Initialize(); |
143 void OnContextLost(); | 143 void OnContextLost(); |
144 void OnApplicationStatusChanged(ApplicationState new_state); | 144 void OnApplicationStatusChanged(ApplicationState new_state); |
145 | 145 |
146 scoped_refptr<ui::ContextProviderCommandBuffer> provider_; | 146 scoped_refptr<ui::ContextProviderCommandBuffer> provider_; |
147 std::unique_ptr<display_compositor::GLHelper> gl_helper_; | 147 std::unique_ptr<viz::GLHelper> gl_helper_; |
148 | 148 |
149 // Set to |false| if there are only stopped activities (or none). | 149 // Set to |false| if there are only stopped activities (or none). |
150 bool has_running_or_paused_activities_; | 150 bool has_running_or_paused_activities_; |
151 | 151 |
152 std::unique_ptr<ApplicationStatusListener> app_status_listener_; | 152 std::unique_ptr<ApplicationStatusListener> app_status_listener_; |
153 | 153 |
154 DISALLOW_COPY_AND_ASSIGN(GLHelperHolder); | 154 DISALLOW_COPY_AND_ASSIGN(GLHelperHolder); |
155 }; | 155 }; |
156 | 156 |
157 GLHelperHolder::GLHelperHolder() | 157 GLHelperHolder::GLHelperHolder() |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 attributes, nullptr, | 211 attributes, nullptr, |
212 ui::command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT); | 212 ui::command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT); |
213 if (!provider_->BindToCurrentThread()) | 213 if (!provider_->BindToCurrentThread()) |
214 return; | 214 return; |
215 provider_->ContextGL()->TraceBeginCHROMIUM( | 215 provider_->ContextGL()->TraceBeginCHROMIUM( |
216 "gpu_toplevel", | 216 "gpu_toplevel", |
217 base::StringPrintf("CmdBufferImageTransportFactory-%p", provider_.get()) | 217 base::StringPrintf("CmdBufferImageTransportFactory-%p", provider_.get()) |
218 .c_str()); | 218 .c_str()); |
219 provider_->SetLostContextCallback( | 219 provider_->SetLostContextCallback( |
220 base::Bind(&GLHelperHolder::OnContextLost, base::Unretained(this))); | 220 base::Bind(&GLHelperHolder::OnContextLost, base::Unretained(this))); |
221 gl_helper_.reset(new display_compositor::GLHelper( | 221 gl_helper_.reset( |
222 provider_->ContextGL(), provider_->ContextSupport())); | 222 new viz::GLHelper(provider_->ContextGL(), provider_->ContextSupport())); |
223 | 223 |
224 // Unretained() is safe because |this| owns the following two callbacks. | 224 // Unretained() is safe because |this| owns the following two callbacks. |
225 app_status_listener_.reset(new ApplicationStatusListener(base::Bind( | 225 app_status_listener_.reset(new ApplicationStatusListener(base::Bind( |
226 &GLHelperHolder::OnApplicationStatusChanged, base::Unretained(this)))); | 226 &GLHelperHolder::OnApplicationStatusChanged, base::Unretained(this)))); |
227 } | 227 } |
228 | 228 |
229 void GLHelperHolder::ReleaseIfPossible() { | 229 void GLHelperHolder::ReleaseIfPossible() { |
230 if (!has_running_or_paused_activities_ && !g_pending_readback_lock) { | 230 if (!has_running_or_paused_activities_ && !g_pending_readback_lock) { |
231 gl_helper_.reset(); | 231 gl_helper_.reset(); |
232 provider_ = nullptr; | 232 provider_ = nullptr; |
(...skipping 28 matching lines...) Expand all Loading... |
261 delete g_readback_helper_holder; | 261 delete g_readback_helper_holder; |
262 g_readback_helper_holder = nullptr; | 262 g_readback_helper_holder = nullptr; |
263 } | 263 } |
264 | 264 |
265 if (!g_readback_helper_holder) | 265 if (!g_readback_helper_holder) |
266 g_readback_helper_holder = GLHelperHolder::Create(); | 266 g_readback_helper_holder = GLHelperHolder::Create(); |
267 | 267 |
268 return g_readback_helper_holder; | 268 return g_readback_helper_holder; |
269 } | 269 } |
270 | 270 |
271 display_compositor::GLHelper* GetPostReadbackGLHelper() { | 271 viz::GLHelper* GetPostReadbackGLHelper() { |
272 bool create_if_necessary = true; | 272 bool create_if_necessary = true; |
273 return GetPostReadbackGLHelperHolder(create_if_necessary)->gl_helper(); | 273 return GetPostReadbackGLHelperHolder(create_if_necessary)->gl_helper(); |
274 } | 274 } |
275 | 275 |
276 void ReleaseGLHelper() { | 276 void ReleaseGLHelper() { |
277 bool create_if_necessary = false; | 277 bool create_if_necessary = false; |
278 GLHelperHolder* holder = GetPostReadbackGLHelperHolder(create_if_necessary); | 278 GLHelperHolder* holder = GetPostReadbackGLHelperHolder(create_if_necessary); |
279 | 279 |
280 if (holder) { | 280 if (holder) { |
281 holder->ReleaseIfPossible(); | 281 holder->ReleaseIfPossible(); |
282 } | 282 } |
283 } | 283 } |
284 | 284 |
285 void CopyFromCompositingSurfaceFinished( | 285 void CopyFromCompositingSurfaceFinished( |
286 const ReadbackRequestCallback& callback, | 286 const ReadbackRequestCallback& callback, |
287 std::unique_ptr<cc::SingleReleaseCallback> release_callback, | 287 std::unique_ptr<cc::SingleReleaseCallback> release_callback, |
288 std::unique_ptr<SkBitmap> bitmap, | 288 std::unique_ptr<SkBitmap> bitmap, |
289 const base::TimeTicks& start_time, | 289 const base::TimeTicks& start_time, |
290 scoped_refptr<PendingReadbackLock> readback_lock, | 290 scoped_refptr<PendingReadbackLock> readback_lock, |
291 bool result) { | 291 bool result) { |
292 TRACE_EVENT0( | 292 TRACE_EVENT0( |
293 "cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceFinished"); | 293 "cc", "RenderWidgetHostViewAndroid::CopyFromCompositingSurfaceFinished"); |
294 gpu::SyncToken sync_token; | 294 gpu::SyncToken sync_token; |
295 if (result) { | 295 if (result) { |
296 display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); | 296 viz::GLHelper* gl_helper = GetPostReadbackGLHelper(); |
297 if (gl_helper) | 297 if (gl_helper) |
298 gl_helper->GenerateSyncToken(&sync_token); | 298 gl_helper->GenerateSyncToken(&sync_token); |
299 } | 299 } |
300 | 300 |
301 // PostTask() to make sure the |readback_lock| is released. Also do this | 301 // PostTask() to make sure the |readback_lock| is released. Also do this |
302 // synchronous GPU operation in a clean callstack. | 302 // synchronous GPU operation in a clean callstack. |
303 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 303 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
304 base::Bind(&ReleaseGLHelper)); | 304 base::Bind(&ReleaseGLHelper)); |
305 | 305 |
306 const bool lost_resource = !sync_token.HasData(); | 306 const bool lost_resource = !sync_token.HasData(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 TRACE_EVENT0("cc", | 355 TRACE_EVENT0("cc", |
356 "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); | 356 "RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult"); |
357 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) | 357 if (!result->HasTexture() || result->IsEmpty() || result->size().IsEmpty()) |
358 return; | 358 return; |
359 cc::TextureMailbox texture_mailbox; | 359 cc::TextureMailbox texture_mailbox; |
360 std::unique_ptr<cc::SingleReleaseCallback> release_callback; | 360 std::unique_ptr<cc::SingleReleaseCallback> release_callback; |
361 result->TakeTexture(&texture_mailbox, &release_callback); | 361 result->TakeTexture(&texture_mailbox, &release_callback); |
362 DCHECK(texture_mailbox.IsTexture()); | 362 DCHECK(texture_mailbox.IsTexture()); |
363 if (!texture_mailbox.IsTexture()) | 363 if (!texture_mailbox.IsTexture()) |
364 return; | 364 return; |
365 display_compositor::GLHelper* gl_helper = GetPostReadbackGLHelper(); | 365 viz::GLHelper* gl_helper = GetPostReadbackGLHelper(); |
366 if (!gl_helper) | 366 if (!gl_helper) |
367 return; | 367 return; |
368 if (!gl_helper->IsReadbackConfigSupported(color_type)) | 368 if (!gl_helper->IsReadbackConfigSupported(color_type)) |
369 color_type = kRGBA_8888_SkColorType; | 369 color_type = kRGBA_8888_SkColorType; |
370 | 370 |
371 gfx::Size output_size_in_pixel; | 371 gfx::Size output_size_in_pixel; |
372 if (dst_size_in_pixel.IsEmpty()) | 372 if (dst_size_in_pixel.IsEmpty()) |
373 output_size_in_pixel = result->size(); | 373 output_size_in_pixel = result->size(); |
374 else | 374 else |
375 output_size_in_pixel = dst_size_in_pixel; | 375 output_size_in_pixel = dst_size_in_pixel; |
(...skipping 11 matching lines...) Expand all Loading... |
387 uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); | 387 uint8_t* pixels = static_cast<uint8_t*>(bitmap->getPixels()); |
388 | 388 |
389 ignore_result(scoped_callback_runner.Release()); | 389 ignore_result(scoped_callback_runner.Release()); |
390 | 390 |
391 gl_helper->CropScaleReadbackAndCleanMailbox( | 391 gl_helper->CropScaleReadbackAndCleanMailbox( |
392 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), | 392 texture_mailbox.mailbox(), texture_mailbox.sync_token(), result->size(), |
393 gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type, | 393 gfx::Rect(result->size()), output_size_in_pixel, pixels, color_type, |
394 base::Bind(&CopyFromCompositingSurfaceFinished, callback, | 394 base::Bind(&CopyFromCompositingSurfaceFinished, callback, |
395 base::Passed(&release_callback), base::Passed(&bitmap), | 395 base::Passed(&release_callback), base::Passed(&bitmap), |
396 start_time, readback_lock), | 396 start_time, readback_lock), |
397 display_compositor::GLHelper::SCALER_QUALITY_GOOD); | 397 viz::GLHelper::SCALER_QUALITY_GOOD); |
398 } | 398 } |
399 | 399 |
400 void RecordToolTypeForActionDown(const ui::MotionEventAndroid& event) { | 400 void RecordToolTypeForActionDown(const ui::MotionEventAndroid& event) { |
401 ui::MotionEventAndroid::Action action = event.GetAction(); | 401 ui::MotionEventAndroid::Action action = event.GetAction(); |
402 if (action == ui::MotionEventAndroid::ACTION_DOWN || | 402 if (action == ui::MotionEventAndroid::ACTION_DOWN || |
403 action == ui::MotionEventAndroid::ACTION_POINTER_DOWN || | 403 action == ui::MotionEventAndroid::ACTION_POINTER_DOWN || |
404 action == ui::MotionEventAndroid::ACTION_BUTTON_PRESS) { | 404 action == ui::MotionEventAndroid::ACTION_BUTTON_PRESS) { |
405 UMA_HISTOGRAM_ENUMERATION("Event.AndroidActionDown.ToolType", | 405 UMA_HISTOGRAM_ENUMERATION("Event.AndroidActionDown.ToolType", |
406 event.GetToolType(0), | 406 event.GetToolType(0), |
407 ui::MotionEventAndroid::TOOL_TYPE_LAST + 1); | 407 ui::MotionEventAndroid::TOOL_TYPE_LAST + 1); |
(...skipping 1815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2223 | 2223 |
2224 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); | 2224 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); |
2225 if (!compositor) | 2225 if (!compositor) |
2226 return; | 2226 return; |
2227 | 2227 |
2228 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( | 2228 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( |
2229 overscroll_refresh_handler, compositor, view_.GetDipScale()); | 2229 overscroll_refresh_handler, compositor, view_.GetDipScale()); |
2230 } | 2230 } |
2231 | 2231 |
2232 } // namespace content | 2232 } // namespace content |
OLD | NEW |