| 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_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 | 315 |
| 316 if (event.type() == ui::ET_GESTURE_BEGIN) { | 316 if (event.type() == ui::ET_GESTURE_BEGIN) { |
| 317 const ui::GestureEvent& gesture = | 317 const ui::GestureEvent& gesture = |
| 318 static_cast<const ui::GestureEvent&>(event); | 318 static_cast<const ui::GestureEvent&>(event); |
| 319 return gesture.details().touch_points() == 1; | 319 return gesture.details().touch_points() == 1; |
| 320 } | 320 } |
| 321 | 321 |
| 322 return false; | 322 return false; |
| 323 } | 323 } |
| 324 | 324 |
| 325 // Swap ack for the renderer when kCompositeToMailbox is enabled. | |
| 326 void SendCompositorFrameAck( | |
| 327 int32 route_id, | |
| 328 uint32 output_surface_id, | |
| 329 int renderer_host_id, | |
| 330 const gpu::Mailbox& received_mailbox, | |
| 331 const gfx::Size& received_size, | |
| 332 bool skip_frame, | |
| 333 const scoped_refptr<ui::Texture>& texture_to_produce) { | |
| 334 cc::CompositorFrameAck ack; | |
| 335 ack.gl_frame_data.reset(new cc::GLFrameData()); | |
| 336 DCHECK(!texture_to_produce.get() || !skip_frame); | |
| 337 if (texture_to_produce.get()) { | |
| 338 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper(); | |
| 339 ack.gl_frame_data->mailbox = texture_to_produce->Produce(); | |
| 340 ack.gl_frame_data->size = texture_to_produce->size(); | |
| 341 ack.gl_frame_data->sync_point = | |
| 342 gl_helper ? gl_helper->InsertSyncPoint() : 0; | |
| 343 } else if (skip_frame) { | |
| 344 // Skip the frame, i.e. tell the producer to reuse the same buffer that | |
| 345 // we just received. | |
| 346 ack.gl_frame_data->size = received_size; | |
| 347 ack.gl_frame_data->mailbox = received_mailbox; | |
| 348 } | |
| 349 | |
| 350 RenderWidgetHostImpl::SendSwapCompositorFrameAck( | |
| 351 route_id, output_surface_id, renderer_host_id, ack); | |
| 352 } | |
| 353 | |
| 354 void AcknowledgeBufferForGpu( | |
| 355 int32 route_id, | |
| 356 int gpu_host_id, | |
| 357 const gpu::Mailbox& received_mailbox, | |
| 358 bool skip_frame, | |
| 359 const scoped_refptr<ui::Texture>& texture_to_produce) { | |
| 360 AcceleratedSurfaceMsg_BufferPresented_Params ack; | |
| 361 uint32 sync_point = 0; | |
| 362 DCHECK(!texture_to_produce.get() || !skip_frame); | |
| 363 if (texture_to_produce.get()) { | |
| 364 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper(); | |
| 365 ack.mailbox = texture_to_produce->Produce(); | |
| 366 sync_point = gl_helper ? gl_helper->InsertSyncPoint() : 0; | |
| 367 } else if (skip_frame) { | |
| 368 ack.mailbox = received_mailbox; | |
| 369 ack.sync_point = 0; | |
| 370 } | |
| 371 | |
| 372 ack.sync_point = sync_point; | |
| 373 RenderWidgetHostImpl::AcknowledgeBufferPresent( | |
| 374 route_id, gpu_host_id, ack); | |
| 375 } | |
| 376 | |
| 377 } // namespace | 325 } // namespace |
| 378 | 326 |
| 379 // We need to watch for mouse events outside a Web Popup or its parent | 327 // We need to watch for mouse events outside a Web Popup or its parent |
| 380 // and dismiss the popup for certain events. | 328 // and dismiss the popup for certain events. |
| 381 class RenderWidgetHostViewAura::EventFilterForPopupExit | 329 class RenderWidgetHostViewAura::EventFilterForPopupExit |
| 382 : public ui::EventHandler { | 330 : public ui::EventHandler { |
| 383 public: | 331 public: |
| 384 explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva) | 332 explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva) |
| 385 : rwhva_(rwhva) { | 333 : rwhva_(rwhva) { |
| 386 DCHECK(rwhva_); | 334 DCHECK(rwhva_); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 popup_child_host_view_(NULL), | 421 popup_child_host_view_(NULL), |
| 474 is_loading_(false), | 422 is_loading_(false), |
| 475 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 423 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
| 476 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), | 424 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), |
| 477 can_compose_inline_(true), | 425 can_compose_inline_(true), |
| 478 has_composition_text_(false), | 426 has_composition_text_(false), |
| 479 accept_return_character_(false), | 427 accept_return_character_(false), |
| 480 last_output_surface_id_(0), | 428 last_output_surface_id_(0), |
| 481 pending_delegated_ack_count_(0), | 429 pending_delegated_ack_count_(0), |
| 482 skipped_frames_(false), | 430 skipped_frames_(false), |
| 483 last_swapped_surface_scale_factor_(1.f), | 431 last_swapped_software_frame_scale_factor_(1.f), |
| 484 paint_canvas_(NULL), | 432 paint_canvas_(NULL), |
| 485 synthetic_move_sent_(false), | 433 synthetic_move_sent_(false), |
| 486 accelerated_compositing_state_changed_(false), | |
| 487 can_lock_compositor_(YES), | 434 can_lock_compositor_(YES), |
| 488 cursor_visibility_state_in_renderer_(UNKNOWN), | 435 cursor_visibility_state_in_renderer_(UNKNOWN), |
| 489 touch_editing_client_(NULL), | 436 touch_editing_client_(NULL), |
| 490 delegated_frame_evictor_(new DelegatedFrameEvictor(this)), | 437 delegated_frame_evictor_(new DelegatedFrameEvictor(this)), |
| 491 weak_ptr_factory_(this) { | 438 weak_ptr_factory_(this) { |
| 492 host_->SetView(this); | 439 host_->SetView(this); |
| 493 window_observer_.reset(new WindowObserver(this)); | 440 window_observer_.reset(new WindowObserver(this)); |
| 494 aura::client::SetTooltipText(window_, &tooltip_); | 441 aura::client::SetTooltipText(window_, &tooltip_); |
| 495 aura::client::SetActivationDelegate(window_, this); | 442 aura::client::SetActivationDelegate(window_, this); |
| 496 aura::client::SetActivationChangeObserver(window_, this); | 443 aura::client::SetActivationChangeObserver(window_, this); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 delegated_frame_evictor_->SetVisible(true); | 559 delegated_frame_evictor_->SetVisible(true); |
| 613 | 560 |
| 614 aura::Window* root = window_->GetRootWindow(); | 561 aura::Window* root = window_->GetRootWindow(); |
| 615 if (root) { | 562 if (root) { |
| 616 aura::client::CursorClient* cursor_client = | 563 aura::client::CursorClient* cursor_client = |
| 617 aura::client::GetCursorClient(root); | 564 aura::client::GetCursorClient(root); |
| 618 if (cursor_client) | 565 if (cursor_client) |
| 619 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); | 566 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); |
| 620 } | 567 } |
| 621 | 568 |
| 622 if (!current_surface_.get() && host_->is_accelerated_compositing_active() && | 569 if (host_->is_accelerated_compositing_active() && |
| 623 !released_front_lock_.get()) { | 570 !released_front_lock_.get()) { |
| 624 ui::Compositor* compositor = GetCompositor(); | 571 ui::Compositor* compositor = GetCompositor(); |
| 625 if (compositor) | 572 if (compositor) |
| 626 released_front_lock_ = compositor->GetCompositorLock(); | 573 released_front_lock_ = compositor->GetCompositorLock(); |
| 627 } | 574 } |
| 628 | 575 |
| 629 #if defined(OS_WIN) | 576 #if defined(OS_WIN) |
| 630 if (legacy_render_widget_host_HWND_) { | 577 if (legacy_render_widget_host_HWND_) { |
| 631 // Reparent the legacy Chrome_RenderWidgetHostHWND window to the parent | 578 // Reparent the legacy Chrome_RenderWidgetHostHWND window to the parent |
| 632 // window before reparenting any plugins. This ensures that the plugin | 579 // window before reparenting any plugins. This ensures that the plugin |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 #else | 671 #else |
| 725 if (resize_lock_) | 672 if (resize_lock_) |
| 726 return false; | 673 return false; |
| 727 | 674 |
| 728 if (host_->should_auto_resize()) | 675 if (host_->should_auto_resize()) |
| 729 return false; | 676 return false; |
| 730 if (!host_->is_accelerated_compositing_active()) | 677 if (!host_->is_accelerated_compositing_active()) |
| 731 return false; | 678 return false; |
| 732 | 679 |
| 733 gfx::Size desired_size = window_->bounds().size(); | 680 gfx::Size desired_size = window_->bounds().size(); |
| 734 if (desired_size == current_frame_size_) | 681 if (desired_size == current_frame_size_in_dip_) |
| 735 return false; | 682 return false; |
| 736 | 683 |
| 737 aura::WindowTreeHost* host = window_->GetHost(); | 684 aura::WindowTreeHost* host = window_->GetHost(); |
| 738 if (!host) | 685 if (!host) |
| 739 return false; | 686 return false; |
| 740 | 687 |
| 741 ui::Compositor* compositor = host->compositor(); | 688 ui::Compositor* compositor = host->compositor(); |
| 742 if (!compositor) | 689 if (!compositor) |
| 743 return false; | 690 return false; |
| 744 | 691 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 const gfx::Range& range, | 910 const gfx::Range& range, |
| 964 const std::vector<gfx::Rect>& character_bounds) { | 911 const std::vector<gfx::Rect>& character_bounds) { |
| 965 composition_character_bounds_ = character_bounds; | 912 composition_character_bounds_ = character_bounds; |
| 966 } | 913 } |
| 967 | 914 |
| 968 void RenderWidgetHostViewAura::DidUpdateBackingStore( | 915 void RenderWidgetHostViewAura::DidUpdateBackingStore( |
| 969 const gfx::Rect& scroll_rect, | 916 const gfx::Rect& scroll_rect, |
| 970 const gfx::Vector2d& scroll_delta, | 917 const gfx::Vector2d& scroll_delta, |
| 971 const std::vector<gfx::Rect>& copy_rects, | 918 const std::vector<gfx::Rect>& copy_rects, |
| 972 const std::vector<ui::LatencyInfo>& latency_info) { | 919 const std::vector<ui::LatencyInfo>& latency_info) { |
| 973 if (accelerated_compositing_state_changed_) | |
| 974 UpdateExternalTexture(); | |
| 975 | |
| 976 for (size_t i = 0; i < latency_info.size(); i++) | 920 for (size_t i = 0; i < latency_info.size(); i++) |
| 977 software_latency_info_.push_back(latency_info[i]); | 921 software_latency_info_.push_back(latency_info[i]); |
| 978 | 922 |
| 979 // Use the state of the RenderWidgetHost and not the window as the two may | 923 // Use the state of the RenderWidgetHost and not the window as the two may |
| 980 // differ. In particular if the window is hidden but the renderer isn't and we | 924 // differ. In particular if the window is hidden but the renderer isn't and we |
| 981 // ignore the update and the window is made visible again the layer isn't | 925 // ignore the update and the window is made visible again the layer isn't |
| 982 // marked as dirty and we show the wrong thing. | 926 // marked as dirty and we show the wrong thing. |
| 983 // We do this after UpdateExternalTexture() so that when we become visible | |
| 984 // we're not drawing a stale texture. | |
| 985 if (host_->is_hidden()) | 927 if (host_->is_hidden()) |
| 986 return; | 928 return; |
| 987 | 929 |
| 988 gfx::Rect clip_rect; | 930 gfx::Rect clip_rect; |
| 989 if (paint_canvas_) { | 931 if (paint_canvas_) { |
| 990 SkRect sk_clip_rect; | 932 SkRect sk_clip_rect; |
| 991 if (paint_canvas_->sk_canvas()->getClipBounds(&sk_clip_rect)) | 933 if (paint_canvas_->sk_canvas()->getClipBounds(&sk_clip_rect)) |
| 992 clip_rect = gfx::ToEnclosingRect(gfx::SkRectToRectF(sk_clip_rect)); | 934 clip_rect = gfx::ToEnclosingRect(gfx::SkRectToRectF(sk_clip_rect)); |
| 993 } | 935 } |
| 994 | 936 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { | 1137 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { |
| 1196 frame_subscriber_ = subscriber.Pass(); | 1138 frame_subscriber_ = subscriber.Pass(); |
| 1197 } | 1139 } |
| 1198 | 1140 |
| 1199 void RenderWidgetHostViewAura::EndFrameSubscription() { | 1141 void RenderWidgetHostViewAura::EndFrameSubscription() { |
| 1200 idle_frame_subscriber_textures_.clear(); | 1142 idle_frame_subscriber_textures_.clear(); |
| 1201 frame_subscriber_.reset(); | 1143 frame_subscriber_.reset(); |
| 1202 } | 1144 } |
| 1203 | 1145 |
| 1204 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() { | 1146 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() { |
| 1205 // Delay processing the state change until we either get a software frame if | |
| 1206 // switching to software mode or receive a buffers swapped notification | |
| 1207 // if switching to accelerated mode. | |
| 1208 // Sometimes (e.g. on a page load) the renderer will spuriously disable then | |
| 1209 // re-enable accelerated compositing, causing us to flash. | |
| 1210 // TODO(piman): factor the enable/disable accelerated compositing message into | |
| 1211 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have | |
| 1212 // fewer inconsistent temporary states. | |
| 1213 accelerated_compositing_state_changed_ = true; | |
| 1214 } | 1147 } |
| 1215 | 1148 |
| 1216 void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id, | 1149 void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id, |
| 1217 int route_id) { | 1150 int route_id) { |
| 1218 } | 1151 } |
| 1219 | 1152 |
| 1220 bool RenderWidgetHostViewAura::ShouldSkipFrame(gfx::Size size_in_dip) const { | 1153 bool RenderWidgetHostViewAura::ShouldSkipFrame(gfx::Size size_in_dip) const { |
| 1221 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || | 1154 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || |
| 1222 can_lock_compositor_ == NO_PENDING_COMMIT || | 1155 can_lock_compositor_ == NO_PENDING_COMMIT || |
| 1223 !resize_lock_.get()) | 1156 !resize_lock_.get()) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1258 } | 1191 } |
| 1259 if (legacy_render_widget_host_HWND_) { | 1192 if (legacy_render_widget_host_HWND_) { |
| 1260 legacy_render_widget_host_HWND_->SetBounds( | 1193 legacy_render_widget_host_HWND_->SetBounds( |
| 1261 window_->GetBoundsInRootWindow()); | 1194 window_->GetBoundsInRootWindow()); |
| 1262 } | 1195 } |
| 1263 } | 1196 } |
| 1264 #endif | 1197 #endif |
| 1265 } | 1198 } |
| 1266 | 1199 |
| 1267 void RenderWidgetHostViewAura::CheckResizeLock() { | 1200 void RenderWidgetHostViewAura::CheckResizeLock() { |
| 1268 if (!resize_lock_ || resize_lock_->expected_size() != current_frame_size_) | 1201 if (!resize_lock_ || |
| 1202 resize_lock_->expected_size() != current_frame_size_in_dip_) |
| 1269 return; | 1203 return; |
| 1270 | 1204 |
| 1271 // Since we got the size we were looking for, unlock the compositor. But delay | 1205 // Since we got the size we were looking for, unlock the compositor. But delay |
| 1272 // the release of the lock until we've kicked a frame with the new texture, to | 1206 // the release of the lock until we've kicked a frame with the new texture, to |
| 1273 // avoid resizing the UI before we have a chance to draw a "good" frame. | 1207 // avoid resizing the UI before we have a chance to draw a "good" frame. |
| 1274 resize_lock_->UnlockCompositor(); | 1208 resize_lock_->UnlockCompositor(); |
| 1275 ui::Compositor* compositor = GetCompositor(); | 1209 ui::Compositor* compositor = GetCompositor(); |
| 1276 if (compositor) { | 1210 if (compositor) { |
| 1277 if (!compositor->HasObserver(this)) | 1211 if (!compositor->HasObserver(this)) |
| 1278 compositor->AddObserver(this); | 1212 compositor->AddObserver(this); |
| 1279 } | 1213 } |
| 1280 } | 1214 } |
| 1281 | 1215 |
| 1282 void RenderWidgetHostViewAura::UpdateExternalTexture() { | |
| 1283 // Delay processing accelerated compositing state change till here where we | |
| 1284 // act upon the state change. (Clear the external texture if switching to | |
| 1285 // software mode or set the external texture if going to accelerated mode). | |
| 1286 if (accelerated_compositing_state_changed_) | |
| 1287 accelerated_compositing_state_changed_ = false; | |
| 1288 | |
| 1289 bool is_compositing_active = host_->is_accelerated_compositing_active(); | |
| 1290 if (is_compositing_active && current_surface_.get()) { | |
| 1291 window_->layer()->SetExternalTexture(current_surface_.get()); | |
| 1292 current_frame_size_ = ConvertSizeToDIP( | |
| 1293 current_surface_->device_scale_factor(), current_surface_->size()); | |
| 1294 CheckResizeLock(); | |
| 1295 software_frame_manager_->DiscardCurrentFrame(); | |
| 1296 } else if (is_compositing_active && | |
| 1297 software_frame_manager_->HasCurrentFrame()) { | |
| 1298 cc::TextureMailbox mailbox; | |
| 1299 scoped_ptr<cc::SingleReleaseCallback> callback; | |
| 1300 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback); | |
| 1301 window_->layer()->SetTextureMailbox(mailbox, | |
| 1302 callback.Pass(), | |
| 1303 last_swapped_surface_scale_factor_); | |
| 1304 current_frame_size_ = ConvertSizeToDIP(last_swapped_surface_scale_factor_, | |
| 1305 mailbox.shared_memory_size()); | |
| 1306 CheckResizeLock(); | |
| 1307 } else { | |
| 1308 window_->layer()->SetShowPaintedContent(); | |
| 1309 resize_lock_.reset(); | |
| 1310 host_->WasResized(); | |
| 1311 software_frame_manager_->DiscardCurrentFrame(); | |
| 1312 } | |
| 1313 } | |
| 1314 | |
| 1315 bool RenderWidgetHostViewAura::SwapBuffersPrepare( | |
| 1316 const gfx::Rect& surface_rect, | |
| 1317 float surface_scale_factor, | |
| 1318 const gfx::Rect& damage_rect, | |
| 1319 const gpu::Mailbox& mailbox, | |
| 1320 const BufferPresentedCallback& ack_callback) { | |
| 1321 if (last_swapped_surface_size_ != surface_rect.size()) { | |
| 1322 // The surface could have shrunk since we skipped an update, in which | |
| 1323 // case we can expect a full update. | |
| 1324 DLOG_IF(ERROR, damage_rect != surface_rect) << "Expected full damage rect"; | |
| 1325 skipped_damage_.setEmpty(); | |
| 1326 last_swapped_surface_size_ = surface_rect.size(); | |
| 1327 last_swapped_surface_scale_factor_ = surface_scale_factor; | |
| 1328 } | |
| 1329 | |
| 1330 if (ShouldSkipFrame(ConvertSizeToDIP(surface_scale_factor, | |
| 1331 surface_rect.size())) || | |
| 1332 mailbox.IsZero()) { | |
| 1333 skipped_damage_.op(RectToSkIRect(damage_rect), SkRegion::kUnion_Op); | |
| 1334 ack_callback.Run(true, scoped_refptr<ui::Texture>()); | |
| 1335 return false; | |
| 1336 } | |
| 1337 | |
| 1338 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
| 1339 current_surface_ = | |
| 1340 factory->CreateTransportClient(surface_scale_factor); | |
| 1341 if (!current_surface_.get()) { | |
| 1342 LOG(ERROR) << "Failed to create ImageTransport texture"; | |
| 1343 ack_callback.Run(true, scoped_refptr<ui::Texture>()); | |
| 1344 return false; | |
| 1345 } | |
| 1346 | |
| 1347 current_surface_->Consume(mailbox, surface_rect.size()); | |
| 1348 released_front_lock_ = NULL; | |
| 1349 UpdateExternalTexture(); | |
| 1350 | |
| 1351 return true; | |
| 1352 } | |
| 1353 | |
| 1354 void RenderWidgetHostViewAura::SwapBuffersCompleted( | |
| 1355 const BufferPresentedCallback& ack_callback, | |
| 1356 const scoped_refptr<ui::Texture>& texture_to_return) { | |
| 1357 ui::Compositor* compositor = GetCompositor(); | |
| 1358 if (!compositor) { | |
| 1359 ack_callback.Run(false, texture_to_return); | |
| 1360 } else { | |
| 1361 AddOnCommitCallbackAndDisableLocks( | |
| 1362 base::Bind(ack_callback, false, texture_to_return)); | |
| 1363 } | |
| 1364 | |
| 1365 DidReceiveFrameFromRenderer(); | |
| 1366 } | |
| 1367 | |
| 1368 void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() { | 1216 void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() { |
| 1369 if (frame_subscriber() && CanCopyToVideoFrame()) { | 1217 if (frame_subscriber() && CanCopyToVideoFrame()) { |
| 1370 const base::TimeTicks present_time = base::TimeTicks::Now(); | 1218 const base::TimeTicks present_time = base::TimeTicks::Now(); |
| 1371 scoped_refptr<media::VideoFrame> frame; | 1219 scoped_refptr<media::VideoFrame> frame; |
| 1372 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1220 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| 1373 if (frame_subscriber()->ShouldCaptureFrame(present_time, | 1221 if (frame_subscriber()->ShouldCaptureFrame(present_time, |
| 1374 &frame, &callback)) { | 1222 &frame, &callback)) { |
| 1375 CopyFromCompositingSurfaceToVideoFrame( | 1223 CopyFromCompositingSurfaceToVideoFrame( |
| 1376 gfx::Rect(current_frame_size_), | 1224 gfx::Rect(current_frame_size_in_dip_), |
| 1377 frame, | 1225 frame, |
| 1378 base::Bind(callback, present_time)); | 1226 base::Bind(callback, present_time)); |
| 1379 } | 1227 } |
| 1380 } | 1228 } |
| 1381 } | 1229 } |
| 1382 | 1230 |
| 1383 #if defined(OS_WIN) | 1231 #if defined(OS_WIN) |
| 1384 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects( | 1232 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects( |
| 1385 const std::vector<gfx::Rect>& rects) { | 1233 const std::vector<gfx::Rect>& rects) { |
| 1386 // Check this before setting constrained_rects_, so that next time they're set | 1234 // Check this before setting constrained_rects_, so that next time they're set |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1399 params.cutout_rects = constrained_rects_; | 1247 params.cutout_rects = constrained_rects_; |
| 1400 params.geometry = &plugin_window_moves_; | 1248 params.geometry = &plugin_window_moves_; |
| 1401 LPARAM lparam = reinterpret_cast<LPARAM>(¶ms); | 1249 LPARAM lparam = reinterpret_cast<LPARAM>(¶ms); |
| 1402 EnumChildWindows(parent, SetCutoutRectsCallback, lparam); | 1250 EnumChildWindows(parent, SetCutoutRectsCallback, lparam); |
| 1403 } | 1251 } |
| 1404 #endif | 1252 #endif |
| 1405 | 1253 |
| 1406 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( | 1254 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( |
| 1407 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, | 1255 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, |
| 1408 int gpu_host_id) { | 1256 int gpu_host_id) { |
| 1409 BufferPresentedCallback ack_callback = base::Bind( | 1257 // Oldschool composited mode is no longer supported. |
| 1410 &AcknowledgeBufferForGpu, | |
| 1411 params_in_pixel.route_id, | |
| 1412 gpu_host_id, | |
| 1413 params_in_pixel.mailbox); | |
| 1414 BuffersSwapped(params_in_pixel.size, | |
| 1415 gfx::Rect(params_in_pixel.size), | |
| 1416 params_in_pixel.scale_factor, | |
| 1417 params_in_pixel.mailbox, | |
| 1418 params_in_pixel.latency_info, | |
| 1419 ack_callback); | |
| 1420 } | 1258 } |
| 1421 | 1259 |
| 1422 void RenderWidgetHostViewAura::SwapDelegatedFrame( | 1260 void RenderWidgetHostViewAura::SwapDelegatedFrame( |
| 1423 uint32 output_surface_id, | 1261 uint32 output_surface_id, |
| 1424 scoped_ptr<cc::DelegatedFrameData> frame_data, | 1262 scoped_ptr<cc::DelegatedFrameData> frame_data, |
| 1425 float frame_device_scale_factor, | 1263 float frame_device_scale_factor, |
| 1426 const std::vector<ui::LatencyInfo>& latency_info) { | 1264 const std::vector<ui::LatencyInfo>& latency_info) { |
| 1427 DCHECK_NE(0u, frame_data->render_pass_list.size()); | 1265 DCHECK_NE(0u, frame_data->render_pass_list.size()); |
| 1428 | 1266 |
| 1429 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); | 1267 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 if (!resource_collection_) { | 1327 if (!resource_collection_) { |
| 1490 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 1328 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
| 1491 resource_collection_->SetClient(this); | 1329 resource_collection_->SetClient(this); |
| 1492 } | 1330 } |
| 1493 // If the physical frame size changes, we need a new |frame_provider_|. If | 1331 // If the physical frame size changes, we need a new |frame_provider_|. If |
| 1494 // the physical frame size is the same, but the size in DIP changed, we | 1332 // the physical frame size is the same, but the size in DIP changed, we |
| 1495 // need to adjust the scale at which the frames will be drawn, and we do | 1333 // need to adjust the scale at which the frames will be drawn, and we do |
| 1496 // this by making a new |frame_provider_| also to ensure the scale change | 1334 // this by making a new |frame_provider_| also to ensure the scale change |
| 1497 // is presented in sync with the new frame content. | 1335 // is presented in sync with the new frame content. |
| 1498 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size() || | 1336 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size() || |
| 1499 frame_size_in_dip != current_frame_size_) { | 1337 frame_size_in_dip != current_frame_size_in_dip_) { |
| 1500 frame_provider_ = new cc::DelegatedFrameProvider( | 1338 frame_provider_ = new cc::DelegatedFrameProvider( |
| 1501 resource_collection_.get(), frame_data.Pass()); | 1339 resource_collection_.get(), frame_data.Pass()); |
| 1502 window_->layer()->SetShowDelegatedContent(frame_provider_.get(), | 1340 window_->layer()->SetShowDelegatedContent(frame_provider_.get(), |
| 1503 frame_size_in_dip); | 1341 frame_size_in_dip); |
| 1504 } else { | 1342 } else { |
| 1505 frame_provider_->SetFrameData(frame_data.Pass()); | 1343 frame_provider_->SetFrameData(frame_data.Pass()); |
| 1506 } | 1344 } |
| 1507 } | 1345 } |
| 1508 released_front_lock_ = NULL; | 1346 released_front_lock_ = NULL; |
| 1509 current_frame_size_ = frame_size_in_dip; | 1347 current_frame_size_in_dip_ = frame_size_in_dip; |
| 1510 CheckResizeLock(); | 1348 CheckResizeLock(); |
| 1511 | 1349 |
| 1512 window_->SchedulePaintInRect(damage_rect_in_dip); | 1350 window_->SchedulePaintInRect(damage_rect_in_dip); |
| 1513 | 1351 |
| 1514 pending_delegated_ack_count_++; | 1352 pending_delegated_ack_count_++; |
| 1515 | 1353 |
| 1516 ui::Compositor* compositor = GetCompositor(); | 1354 ui::Compositor* compositor = GetCompositor(); |
| 1517 if (!compositor) { | 1355 if (!compositor) { |
| 1518 SendDelegatedFrameAck(output_surface_id); | 1356 SendDelegatedFrameAck(output_surface_id); |
| 1519 } else { | 1357 } else { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1588 if (!software_frame_manager_->SwapToNewFrame( | 1426 if (!software_frame_manager_->SwapToNewFrame( |
| 1589 output_surface_id, | 1427 output_surface_id, |
| 1590 frame_data.get(), | 1428 frame_data.get(), |
| 1591 frame_device_scale_factor, | 1429 frame_device_scale_factor, |
| 1592 host_->GetProcess()->GetHandle())) { | 1430 host_->GetProcess()->GetHandle())) { |
| 1593 ReleaseSoftwareFrame(output_surface_id, frame_data->id); | 1431 ReleaseSoftwareFrame(output_surface_id, frame_data->id); |
| 1594 SendSoftwareFrameAck(output_surface_id); | 1432 SendSoftwareFrameAck(output_surface_id); |
| 1595 return; | 1433 return; |
| 1596 } | 1434 } |
| 1597 | 1435 |
| 1598 if (last_swapped_surface_size_ != frame_size) { | 1436 frame_provider_ = NULL; |
| 1437 delegated_frame_evictor_->DiscardedFrame(); |
| 1438 |
| 1439 if (last_swapped_software_frame_size_ != frame_size) { |
| 1599 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size)) | 1440 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size)) |
| 1600 << "Expected full damage rect"; | 1441 << "Expected full damage rect"; |
| 1601 } | 1442 } |
| 1602 last_swapped_surface_size_ = frame_size; | 1443 last_swapped_software_frame_size_ = frame_size; |
| 1603 last_swapped_surface_scale_factor_ = frame_device_scale_factor; | 1444 last_swapped_software_frame_scale_factor_ = frame_device_scale_factor; |
| 1604 | 1445 |
| 1605 cc::TextureMailbox mailbox; | 1446 cc::TextureMailbox mailbox; |
| 1606 scoped_ptr<cc::SingleReleaseCallback> callback; | 1447 scoped_ptr<cc::SingleReleaseCallback> callback; |
| 1607 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback); | 1448 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback); |
| 1608 DCHECK(mailbox.IsSharedMemory()); | 1449 DCHECK(mailbox.IsSharedMemory()); |
| 1609 current_frame_size_ = frame_size_in_dip; | 1450 current_frame_size_in_dip_ = frame_size_in_dip; |
| 1610 | 1451 |
| 1611 released_front_lock_ = NULL; | 1452 released_front_lock_ = NULL; |
| 1612 CheckResizeLock(); | 1453 CheckResizeLock(); |
| 1613 window_->layer()->SetTextureMailbox(mailbox, | 1454 window_->layer()->SetTextureMailbox(mailbox, |
| 1614 callback.Pass(), | 1455 callback.Pass(), |
| 1615 frame_device_scale_factor); | 1456 frame_device_scale_factor); |
| 1616 window_->SchedulePaintInRect( | 1457 window_->SchedulePaintInRect( |
| 1617 ConvertRectToDIP(frame_device_scale_factor, damage_rect)); | 1458 ConvertRectToDIP(frame_device_scale_factor, damage_rect)); |
| 1618 | 1459 |
| 1619 ui::Compositor* compositor = GetCompositor(); | 1460 ui::Compositor* compositor = GetCompositor(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1672 | 1513 |
| 1673 void RenderWidgetHostViewAura::OnSwapCompositorFrame( | 1514 void RenderWidgetHostViewAura::OnSwapCompositorFrame( |
| 1674 uint32 output_surface_id, | 1515 uint32 output_surface_id, |
| 1675 scoped_ptr<cc::CompositorFrame> frame) { | 1516 scoped_ptr<cc::CompositorFrame> frame) { |
| 1676 TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame"); | 1517 TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame"); |
| 1677 if (frame->delegated_frame_data) { | 1518 if (frame->delegated_frame_data) { |
| 1678 SwapDelegatedFrame(output_surface_id, | 1519 SwapDelegatedFrame(output_surface_id, |
| 1679 frame->delegated_frame_data.Pass(), | 1520 frame->delegated_frame_data.Pass(), |
| 1680 frame->metadata.device_scale_factor, | 1521 frame->metadata.device_scale_factor, |
| 1681 frame->metadata.latency_info); | 1522 frame->metadata.latency_info); |
| 1682 return; | 1523 } else if (frame->software_frame_data) { |
| 1683 } | |
| 1684 | |
| 1685 if (frame->software_frame_data) { | |
| 1686 SwapSoftwareFrame(output_surface_id, | 1524 SwapSoftwareFrame(output_surface_id, |
| 1687 frame->software_frame_data.Pass(), | 1525 frame->software_frame_data.Pass(), |
| 1688 frame->metadata.device_scale_factor, | 1526 frame->metadata.device_scale_factor, |
| 1689 frame->metadata.latency_info); | 1527 frame->metadata.latency_info); |
| 1690 return; | |
| 1691 } | 1528 } |
| 1692 | |
| 1693 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero()) | |
| 1694 return; | |
| 1695 | |
| 1696 BufferPresentedCallback ack_callback = base::Bind( | |
| 1697 &SendCompositorFrameAck, | |
| 1698 host_->GetRoutingID(), output_surface_id, host_->GetProcess()->GetID(), | |
| 1699 frame->gl_frame_data->mailbox, frame->gl_frame_data->size); | |
| 1700 | |
| 1701 if (!frame->gl_frame_data->sync_point) { | |
| 1702 LOG(ERROR) << "CompositorFrame without sync point. Skipping frame..."; | |
| 1703 ack_callback.Run(true, scoped_refptr<ui::Texture>()); | |
| 1704 return; | |
| 1705 } | |
| 1706 | |
| 1707 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper(); | |
| 1708 gl_helper->WaitSyncPoint(frame->gl_frame_data->sync_point); | |
| 1709 | |
| 1710 BuffersSwapped(frame->gl_frame_data->size, | |
| 1711 frame->gl_frame_data->sub_buffer_rect, | |
| 1712 frame->metadata.device_scale_factor, | |
| 1713 frame->gl_frame_data->mailbox, | |
| 1714 frame->metadata.latency_info, | |
| 1715 ack_callback); | |
| 1716 } | 1529 } |
| 1717 | 1530 |
| 1718 #if defined(OS_WIN) | 1531 #if defined(OS_WIN) |
| 1719 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( | 1532 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( |
| 1720 gfx::NativeViewAccessible accessible_parent) { | 1533 gfx::NativeViewAccessible accessible_parent) { |
| 1721 if (GetBrowserAccessibilityManager()) { | 1534 if (GetBrowserAccessibilityManager()) { |
| 1722 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() | 1535 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() |
| 1723 ->set_parent_iaccessible(accessible_parent); | 1536 ->set_parent_iaccessible(accessible_parent); |
| 1724 } | 1537 } |
| 1725 } | 1538 } |
| 1726 | 1539 |
| 1727 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() | 1540 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() |
| 1728 const { | 1541 const { |
| 1729 if (legacy_render_widget_host_HWND_) { | 1542 if (legacy_render_widget_host_HWND_) { |
| 1730 return reinterpret_cast<gfx::NativeViewId>( | 1543 return reinterpret_cast<gfx::NativeViewId>( |
| 1731 legacy_render_widget_host_HWND_->hwnd()); | 1544 legacy_render_widget_host_HWND_->hwnd()); |
| 1732 } | 1545 } |
| 1733 return NULL; | 1546 return NULL; |
| 1734 } | 1547 } |
| 1735 #endif | 1548 #endif |
| 1736 | 1549 |
| 1737 void RenderWidgetHostViewAura::BuffersSwapped( | |
| 1738 const gfx::Size& surface_size, | |
| 1739 const gfx::Rect& damage_rect, | |
| 1740 float surface_scale_factor, | |
| 1741 const gpu::Mailbox& mailbox, | |
| 1742 const std::vector<ui::LatencyInfo>& latency_info, | |
| 1743 const BufferPresentedCallback& ack_callback) { | |
| 1744 scoped_refptr<ui::Texture> previous_texture(current_surface_); | |
| 1745 const gfx::Rect surface_rect = gfx::Rect(surface_size); | |
| 1746 software_frame_manager_->DiscardCurrentFrame(); | |
| 1747 | |
| 1748 if (!SwapBuffersPrepare(surface_rect, | |
| 1749 surface_scale_factor, | |
| 1750 damage_rect, | |
| 1751 mailbox, | |
| 1752 ack_callback)) { | |
| 1753 return; | |
| 1754 } | |
| 1755 | |
| 1756 SkRegion damage(RectToSkIRect(damage_rect)); | |
| 1757 if (!skipped_damage_.isEmpty()) { | |
| 1758 damage.op(skipped_damage_, SkRegion::kUnion_Op); | |
| 1759 skipped_damage_.setEmpty(); | |
| 1760 } | |
| 1761 | |
| 1762 DCHECK(surface_rect.Contains(SkIRectToRect(damage.getBounds()))); | |
| 1763 ui::Texture* current_texture = current_surface_.get(); | |
| 1764 | |
| 1765 const gfx::Size surface_size_in_pixel = surface_size; | |
| 1766 DLOG_IF(ERROR, previous_texture.get() && | |
| 1767 previous_texture->size() != current_texture->size() && | |
| 1768 SkIRectToRect(damage.getBounds()) != surface_rect) << | |
| 1769 "Expected full damage rect after size change"; | |
| 1770 if (previous_texture.get() && !previous_damage_.isEmpty() && | |
| 1771 previous_texture->size() == current_texture->size()) { | |
| 1772 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
| 1773 GLHelper* gl_helper = factory->GetGLHelper(); | |
| 1774 gl_helper->CopySubBufferDamage( | |
| 1775 current_texture->PrepareTexture(), | |
| 1776 previous_texture->PrepareTexture(), | |
| 1777 damage, | |
| 1778 previous_damage_); | |
| 1779 } | |
| 1780 previous_damage_ = damage; | |
| 1781 | |
| 1782 ui::Compositor* compositor = GetCompositor(); | |
| 1783 if (compositor) { | |
| 1784 // Co-ordinates come in OpenGL co-ordinate space. | |
| 1785 // We need to convert to layer space. | |
| 1786 gfx::Rect rect_to_paint = | |
| 1787 ConvertRectToDIP(surface_scale_factor, | |
| 1788 gfx::Rect(damage_rect.x(), | |
| 1789 surface_size_in_pixel.height() - | |
| 1790 damage_rect.y() - damage_rect.height(), | |
| 1791 damage_rect.width(), | |
| 1792 damage_rect.height())); | |
| 1793 | |
| 1794 // Damage may not have been DIP aligned, so inflate damage to compensate | |
| 1795 // for any round-off error. | |
| 1796 rect_to_paint.Inset(-1, -1); | |
| 1797 rect_to_paint.Intersect(window_->bounds()); | |
| 1798 | |
| 1799 window_->SchedulePaintInRect(rect_to_paint); | |
| 1800 for (size_t i = 0; i < latency_info.size(); i++) | |
| 1801 compositor->SetLatencyInfo(latency_info[i]); | |
| 1802 } | |
| 1803 | |
| 1804 SwapBuffersCompleted(ack_callback, previous_texture); | |
| 1805 } | |
| 1806 | |
| 1807 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( | 1550 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( |
| 1808 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, | 1551 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, |
| 1809 int gpu_host_id) { | 1552 int gpu_host_id) { |
| 1810 gfx::Rect damage_rect(params_in_pixel.x, | 1553 // Oldschool composited mode is no longer supported. |
| 1811 params_in_pixel.y, | |
| 1812 params_in_pixel.width, | |
| 1813 params_in_pixel.height); | |
| 1814 BufferPresentedCallback ack_callback = | |
| 1815 base::Bind(&AcknowledgeBufferForGpu, | |
| 1816 params_in_pixel.route_id, | |
| 1817 gpu_host_id, | |
| 1818 params_in_pixel.mailbox); | |
| 1819 BuffersSwapped(params_in_pixel.surface_size, | |
| 1820 damage_rect, | |
| 1821 params_in_pixel.surface_scale_factor, | |
| 1822 params_in_pixel.mailbox, | |
| 1823 params_in_pixel.latency_info, | |
| 1824 ack_callback); | |
| 1825 } | 1554 } |
| 1826 | 1555 |
| 1827 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { | 1556 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { |
| 1828 } | 1557 } |
| 1829 | 1558 |
| 1830 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { | 1559 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { |
| 1831 // This really tells us to release the frontbuffer. | |
| 1832 if (current_surface_.get()) { | |
| 1833 ui::Compositor* compositor = GetCompositor(); | |
| 1834 if (compositor) { | |
| 1835 // We need to wait for a commit to clear to guarantee that all we | |
| 1836 // will not issue any more GL referencing the previous surface. | |
| 1837 AddOnCommitCallbackAndDisableLocks( | |
| 1838 base::Bind(&RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor, | |
| 1839 AsWeakPtr(), | |
| 1840 current_surface_)); // Hold a ref so the texture will not | |
| 1841 // get deleted until after commit. | |
| 1842 } | |
| 1843 current_surface_ = NULL; | |
| 1844 UpdateExternalTexture(); | |
| 1845 } | |
| 1846 } | 1560 } |
| 1847 | 1561 |
| 1848 bool RenderWidgetHostViewAura::HasAcceleratedSurface( | 1562 bool RenderWidgetHostViewAura::HasAcceleratedSurface( |
| 1849 const gfx::Size& desired_size) { | 1563 const gfx::Size& desired_size) { |
| 1850 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't | 1564 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't |
| 1851 // matter what is returned here as GetBackingStore is the only caller of this | 1565 // matter what is returned here as GetBackingStore is the only caller of this |
| 1852 // method. TODO(jbates) implement this if other Aura code needs it. | 1566 // method. TODO(jbates) implement this if other Aura code needs it. |
| 1853 return false; | 1567 return false; |
| 1854 } | 1568 } |
| 1855 | 1569 |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2707 } | 2421 } |
| 2708 | 2422 |
| 2709 void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const { | 2423 void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const { |
| 2710 } | 2424 } |
| 2711 | 2425 |
| 2712 void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer, | 2426 void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer, |
| 2713 ui::Layer *new_layer) { | 2427 ui::Layer *new_layer) { |
| 2714 float mailbox_scale_factor; | 2428 float mailbox_scale_factor; |
| 2715 cc::TextureMailbox old_mailbox = | 2429 cc::TextureMailbox old_mailbox = |
| 2716 old_layer->GetTextureMailbox(&mailbox_scale_factor); | 2430 old_layer->GetTextureMailbox(&mailbox_scale_factor); |
| 2717 scoped_refptr<ui::Texture> old_texture = old_layer->external_texture(); | |
| 2718 // The new_layer is the one that will be used by our Window, so that's the one | 2431 // The new_layer is the one that will be used by our Window, so that's the one |
| 2719 // that should keep our texture. old_layer will be returned to the | 2432 // that should keep our texture. old_layer will be returned to the |
| 2720 // RecreateLayer caller, and should have a copy. | 2433 // RecreateLayer caller, and should have a copy. |
| 2721 if (old_texture.get()) { | 2434 if (old_mailbox.IsSharedMemory()) { |
| 2722 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); | |
| 2723 GLHelper* gl_helper = factory->GetGLHelper(); | |
| 2724 scoped_refptr<ui::Texture> new_texture; | |
| 2725 if (host_->is_accelerated_compositing_active() && | |
| 2726 gl_helper && current_surface_.get()) { | |
| 2727 GLuint texture_id = | |
| 2728 gl_helper->CopyTexture(current_surface_->PrepareTexture(), | |
| 2729 current_surface_->size()); | |
| 2730 if (texture_id) { | |
| 2731 new_texture = factory->CreateOwnedTexture( | |
| 2732 current_surface_->size(), | |
| 2733 current_surface_->device_scale_factor(), texture_id); | |
| 2734 } | |
| 2735 } | |
| 2736 if (new_texture.get()) | |
| 2737 old_layer->SetExternalTexture(new_texture.get()); | |
| 2738 else | |
| 2739 old_layer->SetShowPaintedContent(); | |
| 2740 new_layer->SetExternalTexture(old_texture.get()); | |
| 2741 } else if (old_mailbox.IsSharedMemory()) { | |
| 2742 base::SharedMemory* old_buffer = old_mailbox.shared_memory(); | 2435 base::SharedMemory* old_buffer = old_mailbox.shared_memory(); |
| 2743 const size_t size = old_mailbox.shared_memory_size_in_bytes(); | 2436 const size_t size = old_mailbox.shared_memory_size_in_bytes(); |
| 2744 | 2437 |
| 2745 scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory); | 2438 scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory); |
| 2746 new_buffer->CreateAndMapAnonymous(size); | 2439 new_buffer->CreateAndMapAnonymous(size); |
| 2747 | 2440 |
| 2748 if (old_buffer->memory() && new_buffer->memory()) { | 2441 if (old_buffer->memory() && new_buffer->memory()) { |
| 2749 memcpy(new_buffer->memory(), old_buffer->memory(), size); | 2442 memcpy(new_buffer->memory(), old_buffer->memory(), size); |
| 2750 base::SharedMemory* new_buffer_raw_ptr = new_buffer.get(); | 2443 base::SharedMemory* new_buffer_raw_ptr = new_buffer.get(); |
| 2751 scoped_ptr<cc::SingleReleaseCallback> callback = | 2444 scoped_ptr<cc::SingleReleaseCallback> callback = |
| 2752 cc::SingleReleaseCallback::Create(base::Bind(MailboxReleaseCallback, | 2445 cc::SingleReleaseCallback::Create(base::Bind(MailboxReleaseCallback, |
| 2753 Passed(&new_buffer))); | 2446 Passed(&new_buffer))); |
| 2754 cc::TextureMailbox new_mailbox(new_buffer_raw_ptr, | 2447 cc::TextureMailbox new_mailbox(new_buffer_raw_ptr, |
| 2755 old_mailbox.shared_memory_size()); | 2448 old_mailbox.shared_memory_size()); |
| 2756 new_layer->SetTextureMailbox(new_mailbox, | 2449 new_layer->SetTextureMailbox(new_mailbox, |
| 2757 callback.Pass(), | 2450 callback.Pass(), |
| 2758 mailbox_scale_factor); | 2451 mailbox_scale_factor); |
| 2759 } | 2452 } |
| 2760 } else if (frame_provider_.get()) { | 2453 } else if (frame_provider_.get()) { |
| 2761 new_layer->SetShowDelegatedContent(frame_provider_.get(), | 2454 new_layer->SetShowDelegatedContent(frame_provider_.get(), |
| 2762 current_frame_size_); | 2455 current_frame_size_in_dip_); |
| 2763 } | 2456 } |
| 2764 } | 2457 } |
| 2765 | 2458 |
| 2766 //////////////////////////////////////////////////////////////////////////////// | 2459 //////////////////////////////////////////////////////////////////////////////// |
| 2767 // RenderWidgetHostViewAura, ui::EventHandler implementation: | 2460 // RenderWidgetHostViewAura, ui::EventHandler implementation: |
| 2768 | 2461 |
| 2769 void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) { | 2462 void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) { |
| 2770 TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent"); | 2463 TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent"); |
| 2771 if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event)) | 2464 if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event)) |
| 2772 return; | 2465 return; |
| (...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3188 uint32 output_surface_id, unsigned frame_id) { | 2881 uint32 output_surface_id, unsigned frame_id) { |
| 3189 ReleaseSoftwareFrame(output_surface_id, frame_id); | 2882 ReleaseSoftwareFrame(output_surface_id, frame_id); |
| 3190 } | 2883 } |
| 3191 | 2884 |
| 3192 void RenderWidgetHostViewAura::ReleaseReferencesToSoftwareFrame() { | 2885 void RenderWidgetHostViewAura::ReleaseReferencesToSoftwareFrame() { |
| 3193 ui::Compositor* compositor = GetCompositor(); | 2886 ui::Compositor* compositor = GetCompositor(); |
| 3194 if (compositor) { | 2887 if (compositor) { |
| 3195 AddOnCommitCallbackAndDisableLocks(base::Bind( | 2888 AddOnCommitCallbackAndDisableLocks(base::Bind( |
| 3196 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr())); | 2889 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr())); |
| 3197 } | 2890 } |
| 3198 UpdateExternalTexture(); | 2891 window_->layer()->SetShowPaintedContent(); |
| 3199 } | 2892 } |
| 3200 | 2893 |
| 3201 //////////////////////////////////////////////////////////////////////////////// | 2894 //////////////////////////////////////////////////////////////////////////////// |
| 3202 // RenderWidgetHostViewAura, ui::CompositorObserver implementation: | 2895 // RenderWidgetHostViewAura, ui::CompositorObserver implementation: |
| 3203 | 2896 |
| 3204 void RenderWidgetHostViewAura::OnCompositingDidCommit( | 2897 void RenderWidgetHostViewAura::OnCompositingDidCommit( |
| 3205 ui::Compositor* compositor) { | 2898 ui::Compositor* compositor) { |
| 3206 if (can_lock_compositor_ == NO_PENDING_COMMIT) { | 2899 if (can_lock_compositor_ == NO_PENDING_COMMIT) { |
| 3207 can_lock_compositor_ = YES; | 2900 can_lock_compositor_ = YES; |
| 3208 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) | 2901 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) |
| 3209 can_lock_compositor_ = YES_DID_LOCK; | 2902 can_lock_compositor_ = YES_DID_LOCK; |
| 3210 } | 2903 } |
| 3211 RunOnCommitCallbacks(); | 2904 RunOnCommitCallbacks(); |
| 3212 if (resize_lock_ && resize_lock_->expected_size() == current_frame_size_) { | 2905 if (resize_lock_ && |
| 2906 resize_lock_->expected_size() == current_frame_size_in_dip_) { |
| 3213 resize_lock_.reset(); | 2907 resize_lock_.reset(); |
| 3214 host_->WasResized(); | 2908 host_->WasResized(); |
| 3215 // We may have had a resize while we had the lock (e.g. if the lock expired, | 2909 // We may have had a resize while we had the lock (e.g. if the lock expired, |
| 3216 // or if the UI still gave us some resizes), so make sure we grab a new lock | 2910 // or if the UI still gave us some resizes), so make sure we grab a new lock |
| 3217 // if necessary. | 2911 // if necessary. |
| 3218 MaybeCreateResizeLock(); | 2912 MaybeCreateResizeLock(); |
| 3219 } | 2913 } |
| 3220 } | 2914 } |
| 3221 | 2915 |
| 3222 void RenderWidgetHostViewAura::OnCompositingStarted( | 2916 void RenderWidgetHostViewAura::OnCompositingStarted( |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3297 | 2991 |
| 3298 void RenderWidgetHostViewAura::FatalAccessibilityTreeError() { | 2992 void RenderWidgetHostViewAura::FatalAccessibilityTreeError() { |
| 3299 host_->FatalAccessibilityTreeError(); | 2993 host_->FatalAccessibilityTreeError(); |
| 3300 SetBrowserAccessibilityManager(NULL); | 2994 SetBrowserAccessibilityManager(NULL); |
| 3301 } | 2995 } |
| 3302 | 2996 |
| 3303 //////////////////////////////////////////////////////////////////////////////// | 2997 //////////////////////////////////////////////////////////////////////////////// |
| 3304 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: | 2998 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: |
| 3305 | 2999 |
| 3306 void RenderWidgetHostViewAura::OnLostResources() { | 3000 void RenderWidgetHostViewAura::OnLostResources() { |
| 3307 current_surface_ = NULL; | 3001 if (frame_provider_.get()) |
| 3308 UpdateExternalTexture(); | 3002 EvictDelegatedFrame(); |
| 3309 | |
| 3310 idle_frame_subscriber_textures_.clear(); | 3003 idle_frame_subscriber_textures_.clear(); |
| 3311 yuv_readback_pipeline_.reset(); | 3004 yuv_readback_pipeline_.reset(); |
| 3312 | 3005 |
| 3313 // Make sure all ImageTransportClients are deleted now that the context those | |
| 3314 // are using is becoming invalid. This sends pending ACKs and needs to happen | |
| 3315 // after calling UpdateExternalTexture() which syncs with the impl thread. | |
| 3316 RunOnCommitCallbacks(); | |
| 3317 host_->ScheduleComposite(); | 3006 host_->ScheduleComposite(); |
| 3318 } | 3007 } |
| 3319 | 3008 |
| 3320 //////////////////////////////////////////////////////////////////////////////// | 3009 //////////////////////////////////////////////////////////////////////////////// |
| 3321 // RenderWidgetHostViewAura, private: | 3010 // RenderWidgetHostViewAura, private: |
| 3322 | 3011 |
| 3323 RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { | 3012 RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { |
| 3324 if (touch_editing_client_) | 3013 if (touch_editing_client_) |
| 3325 touch_editing_client_->OnViewDestroyed(); | 3014 touch_editing_client_->OnViewDestroyed(); |
| 3326 | 3015 |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3513 void RenderWidgetHostViewAura::AddedToRootWindow() { | 3202 void RenderWidgetHostViewAura::AddedToRootWindow() { |
| 3514 window_->GetHost()->AddObserver(this); | 3203 window_->GetHost()->AddObserver(this); |
| 3515 UpdateScreenInfo(window_); | 3204 UpdateScreenInfo(window_); |
| 3516 | 3205 |
| 3517 aura::client::CursorClient* cursor_client = | 3206 aura::client::CursorClient* cursor_client = |
| 3518 aura::client::GetCursorClient(window_->GetRootWindow()); | 3207 aura::client::GetCursorClient(window_->GetRootWindow()); |
| 3519 if (cursor_client) { | 3208 if (cursor_client) { |
| 3520 cursor_client->AddObserver(this); | 3209 cursor_client->AddObserver(this); |
| 3521 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); | 3210 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); |
| 3522 } | 3211 } |
| 3523 if (current_surface_.get()) | |
| 3524 UpdateExternalTexture(); | |
| 3525 if (HasFocus()) { | 3212 if (HasFocus()) { |
| 3526 ui::InputMethod* input_method = GetInputMethod(); | 3213 ui::InputMethod* input_method = GetInputMethod(); |
| 3527 if (input_method) | 3214 if (input_method) |
| 3528 input_method->SetFocusedTextInputClient(this); | 3215 input_method->SetFocusedTextInputClient(this); |
| 3529 } | 3216 } |
| 3530 | 3217 |
| 3531 #if defined(OS_WIN) | 3218 #if defined(OS_WIN) |
| 3532 // The parent may have changed here. Ensure that the legacy window is | 3219 // The parent may have changed here. Ensure that the legacy window is |
| 3533 // reparented accordingly. | 3220 // reparented accordingly. |
| 3534 if (legacy_render_widget_host_HWND_) | 3221 if (legacy_render_widget_host_HWND_) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3546 | 3233 |
| 3547 void RenderWidgetHostViewAura::RemovingFromRootWindow() { | 3234 void RenderWidgetHostViewAura::RemovingFromRootWindow() { |
| 3548 aura::client::CursorClient* cursor_client = | 3235 aura::client::CursorClient* cursor_client = |
| 3549 aura::client::GetCursorClient(window_->GetRootWindow()); | 3236 aura::client::GetCursorClient(window_->GetRootWindow()); |
| 3550 if (cursor_client) | 3237 if (cursor_client) |
| 3551 cursor_client->RemoveObserver(this); | 3238 cursor_client->RemoveObserver(this); |
| 3552 | 3239 |
| 3553 DetachFromInputMethod(); | 3240 DetachFromInputMethod(); |
| 3554 | 3241 |
| 3555 window_->GetHost()->RemoveObserver(this); | 3242 window_->GetHost()->RemoveObserver(this); |
| 3556 ui::Compositor* compositor = GetCompositor(); | |
| 3557 if (current_surface_.get()) { | |
| 3558 // We can't get notification for commits after this point, which would | |
| 3559 // guarantee that the compositor isn't using an old texture any more, so | |
| 3560 // instead we force the layer to stop using any external resources which | |
| 3561 // synchronizes with the compositor thread, and makes it safe to run the | |
| 3562 // callback. | |
| 3563 window_->layer()->SetShowPaintedContent(); | |
| 3564 } | |
| 3565 RunOnCommitCallbacks(); | 3243 RunOnCommitCallbacks(); |
| 3566 resize_lock_.reset(); | 3244 resize_lock_.reset(); |
| 3567 host_->WasResized(); | 3245 host_->WasResized(); |
| 3568 | 3246 ui::Compositor* compositor = GetCompositor(); |
| 3569 if (compositor && compositor->HasObserver(this)) | 3247 if (compositor && compositor->HasObserver(this)) |
| 3570 compositor->RemoveObserver(this); | 3248 compositor->RemoveObserver(this); |
| 3571 | 3249 |
| 3572 #if defined(OS_WIN) | 3250 #if defined(OS_WIN) |
| 3573 // Update the legacy window's parent temporarily to the desktop window. It | 3251 // Update the legacy window's parent temporarily to the desktop window. It |
| 3574 // will eventually get reparented to the right root. | 3252 // will eventually get reparented to the right root. |
| 3575 if (legacy_render_widget_host_HWND_) | 3253 if (legacy_render_widget_host_HWND_) |
| 3576 legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow()); | 3254 legacy_render_widget_host_HWND_->UpdateParent(::GetDesktopWindow()); |
| 3577 #endif | 3255 #endif |
| 3578 | 3256 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3615 RenderWidgetHost* widget) { | 3293 RenderWidgetHost* widget) { |
| 3616 return new RenderWidgetHostViewAura(widget); | 3294 return new RenderWidgetHostViewAura(widget); |
| 3617 } | 3295 } |
| 3618 | 3296 |
| 3619 // static | 3297 // static |
| 3620 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { | 3298 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { |
| 3621 GetScreenInfoForWindow(results, NULL); | 3299 GetScreenInfoForWindow(results, NULL); |
| 3622 } | 3300 } |
| 3623 | 3301 |
| 3624 } // namespace content | 3302 } // namespace content |
| OLD | NEW |