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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_aura.cc

Issue 131443007: aura: Remove old GL paths from RenderWidgetHostViewAura. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: shortcutswap Created 6 years, 10 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 | Annotate | Revision Log
OLDNEW
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 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 301
302 if (event.type() == ui::ET_GESTURE_BEGIN) { 302 if (event.type() == ui::ET_GESTURE_BEGIN) {
303 const ui::GestureEvent& gesture = 303 const ui::GestureEvent& gesture =
304 static_cast<const ui::GestureEvent&>(event); 304 static_cast<const ui::GestureEvent&>(event);
305 return gesture.details().touch_points() == 1; 305 return gesture.details().touch_points() == 1;
306 } 306 }
307 307
308 return false; 308 return false;
309 } 309 }
310 310
311 // Swap ack for the renderer when kCompositeToMailbox is enabled.
312 void SendCompositorFrameAck(
313 int32 route_id,
314 uint32 output_surface_id,
315 int renderer_host_id,
316 const gpu::Mailbox& received_mailbox,
317 const gfx::Size& received_size,
318 bool skip_frame,
319 const scoped_refptr<ui::Texture>& texture_to_produce) {
320 cc::CompositorFrameAck ack;
321 ack.gl_frame_data.reset(new cc::GLFrameData());
322 DCHECK(!texture_to_produce.get() || !skip_frame);
323 if (texture_to_produce.get()) {
324 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
325 std::string mailbox_name = texture_to_produce->Produce();
326 std::copy(mailbox_name.data(),
327 mailbox_name.data() + mailbox_name.length(),
328 reinterpret_cast<char*>(ack.gl_frame_data->mailbox.name));
329 ack.gl_frame_data->size = texture_to_produce->size();
330 ack.gl_frame_data->sync_point =
331 gl_helper ? gl_helper->InsertSyncPoint() : 0;
332 } else if (skip_frame) {
333 // Skip the frame, i.e. tell the producer to reuse the same buffer that
334 // we just received.
335 ack.gl_frame_data->size = received_size;
336 ack.gl_frame_data->mailbox = received_mailbox;
337 }
338
339 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
340 route_id, output_surface_id, renderer_host_id, ack);
341 }
342
343 void AcknowledgeBufferForGpu(
344 int32 route_id,
345 int gpu_host_id,
346 const std::string& received_mailbox,
347 bool skip_frame,
348 const scoped_refptr<ui::Texture>& texture_to_produce) {
349 AcceleratedSurfaceMsg_BufferPresented_Params ack;
350 uint32 sync_point = 0;
351 DCHECK(!texture_to_produce.get() || !skip_frame);
352 if (texture_to_produce.get()) {
353 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
354 ack.mailbox_name = texture_to_produce->Produce();
355 sync_point = gl_helper ? gl_helper->InsertSyncPoint() : 0;
356 } else if (skip_frame) {
357 ack.mailbox_name = received_mailbox;
358 ack.sync_point = 0;
359 }
360
361 ack.sync_point = sync_point;
362 RenderWidgetHostImpl::AcknowledgeBufferPresent(
363 route_id, gpu_host_id, ack);
364 }
365
366 } // namespace 311 } // namespace
367 312
368 // We need to watch for mouse events outside a Web Popup or its parent 313 // We need to watch for mouse events outside a Web Popup or its parent
369 // and dismiss the popup for certain events. 314 // and dismiss the popup for certain events.
370 class RenderWidgetHostViewAura::EventFilterForPopupExit : 315 class RenderWidgetHostViewAura::EventFilterForPopupExit :
371 public ui::EventHandler { 316 public ui::EventHandler {
372 public: 317 public:
373 explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva) 318 explicit EventFilterForPopupExit(RenderWidgetHostViewAura* rwhva)
374 : rwhva_(rwhva) { 319 : rwhva_(rwhva) {
375 DCHECK(rwhva_); 320 DCHECK(rwhva_);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 popup_child_host_view_(NULL), 406 popup_child_host_view_(NULL),
462 is_loading_(false), 407 is_loading_(false),
463 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), 408 text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
464 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT), 409 text_input_mode_(ui::TEXT_INPUT_MODE_DEFAULT),
465 can_compose_inline_(true), 410 can_compose_inline_(true),
466 has_composition_text_(false), 411 has_composition_text_(false),
467 accept_return_character_(false), 412 accept_return_character_(false),
468 last_output_surface_id_(0), 413 last_output_surface_id_(0),
469 pending_delegated_ack_count_(0), 414 pending_delegated_ack_count_(0),
470 skipped_frames_(false), 415 skipped_frames_(false),
471 last_swapped_surface_scale_factor_(1.f), 416 last_swapped_software_frame_scale_factor_(1.f),
472 paint_canvas_(NULL), 417 paint_canvas_(NULL),
473 synthetic_move_sent_(false), 418 synthetic_move_sent_(false),
474 accelerated_compositing_state_changed_(false),
475 can_lock_compositor_(YES), 419 can_lock_compositor_(YES),
476 cursor_visibility_state_in_renderer_(UNKNOWN), 420 cursor_visibility_state_in_renderer_(UNKNOWN),
477 touch_editing_client_(NULL), 421 touch_editing_client_(NULL),
478 delegated_frame_evictor_(new DelegatedFrameEvictor(this)), 422 delegated_frame_evictor_(new DelegatedFrameEvictor(this)),
479 weak_ptr_factory_(this) { 423 weak_ptr_factory_(this) {
480 host_->SetView(this); 424 host_->SetView(this);
481 window_observer_.reset(new WindowObserver(this)); 425 window_observer_.reset(new WindowObserver(this));
482 aura::client::SetTooltipText(window_, &tooltip_); 426 aura::client::SetTooltipText(window_, &tooltip_);
483 aura::client::SetActivationDelegate(window_, this); 427 aura::client::SetActivationDelegate(window_, this);
484 aura::client::SetActivationChangeObserver(window_, this); 428 aura::client::SetActivationChangeObserver(window_, this);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 delegated_frame_evictor_->SetVisible(true); 547 delegated_frame_evictor_->SetVisible(true);
604 548
605 aura::Window* root = window_->GetRootWindow(); 549 aura::Window* root = window_->GetRootWindow();
606 if (root) { 550 if (root) {
607 aura::client::CursorClient* cursor_client = 551 aura::client::CursorClient* cursor_client =
608 aura::client::GetCursorClient(root); 552 aura::client::GetCursorClient(root);
609 if (cursor_client) 553 if (cursor_client)
610 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); 554 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
611 } 555 }
612 556
613 if (!current_surface_.get() && host_->is_accelerated_compositing_active() && 557 if (host_->is_accelerated_compositing_active() &&
614 !released_front_lock_.get()) { 558 !released_front_lock_.get()) {
615 ui::Compositor* compositor = GetCompositor(); 559 ui::Compositor* compositor = GetCompositor();
616 if (compositor) 560 if (compositor)
617 released_front_lock_ = compositor->GetCompositorLock(); 561 released_front_lock_ = compositor->GetCompositorLock();
618 } 562 }
619 563
620 #if defined(OS_WIN) 564 #if defined(OS_WIN)
621 LPARAM lparam = reinterpret_cast<LPARAM>(this); 565 LPARAM lparam = reinterpret_cast<LPARAM>(this);
622 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam); 566 EnumChildWindows(ui::GetHiddenWindow(), ShowWindowsCallback, lparam);
623 567
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 656
713 if (resize_lock_) 657 if (resize_lock_)
714 return false; 658 return false;
715 659
716 if (host_->should_auto_resize()) 660 if (host_->should_auto_resize())
717 return false; 661 return false;
718 if (!host_->is_accelerated_compositing_active()) 662 if (!host_->is_accelerated_compositing_active())
719 return false; 663 return false;
720 664
721 gfx::Size desired_size = window_->bounds().size(); 665 gfx::Size desired_size = window_->bounds().size();
722 if (desired_size == current_frame_size_) 666 if (desired_size == current_frame_size_in_dip_)
723 return false; 667 return false;
724 668
725 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher(); 669 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher();
726 if (!dispatcher) 670 if (!dispatcher)
727 return false; 671 return false;
728 672
729 ui::Compositor* compositor = dispatcher->host()->compositor(); 673 ui::Compositor* compositor = dispatcher->host()->compositor();
730 if (!compositor) 674 if (!compositor)
731 return false; 675 return false;
732 676
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 const gfx::Range& range, 887 const gfx::Range& range,
944 const std::vector<gfx::Rect>& character_bounds) { 888 const std::vector<gfx::Rect>& character_bounds) {
945 composition_character_bounds_ = character_bounds; 889 composition_character_bounds_ = character_bounds;
946 } 890 }
947 891
948 void RenderWidgetHostViewAura::DidUpdateBackingStore( 892 void RenderWidgetHostViewAura::DidUpdateBackingStore(
949 const gfx::Rect& scroll_rect, 893 const gfx::Rect& scroll_rect,
950 const gfx::Vector2d& scroll_delta, 894 const gfx::Vector2d& scroll_delta,
951 const std::vector<gfx::Rect>& copy_rects, 895 const std::vector<gfx::Rect>& copy_rects,
952 const std::vector<ui::LatencyInfo>& latency_info) { 896 const std::vector<ui::LatencyInfo>& latency_info) {
953 if (accelerated_compositing_state_changed_)
954 UpdateExternalTexture();
955
956 for (size_t i = 0; i < latency_info.size(); i++) 897 for (size_t i = 0; i < latency_info.size(); i++)
957 software_latency_info_.push_back(latency_info[i]); 898 software_latency_info_.push_back(latency_info[i]);
958 899
959 // Use the state of the RenderWidgetHost and not the window as the two may 900 // Use the state of the RenderWidgetHost and not the window as the two may
960 // differ. In particular if the window is hidden but the renderer isn't and we 901 // differ. In particular if the window is hidden but the renderer isn't and we
961 // ignore the update and the window is made visible again the layer isn't 902 // ignore the update and the window is made visible again the layer isn't
962 // marked as dirty and we show the wrong thing. 903 // marked as dirty and we show the wrong thing.
963 // We do this after UpdateExternalTexture() so that when we become visible
964 // we're not drawing a stale texture.
965 if (host_->is_hidden()) 904 if (host_->is_hidden())
966 return; 905 return;
967 906
968 gfx::Rect clip_rect; 907 gfx::Rect clip_rect;
969 if (paint_canvas_) { 908 if (paint_canvas_) {
970 SkRect sk_clip_rect; 909 SkRect sk_clip_rect;
971 if (paint_canvas_->sk_canvas()->getClipBounds(&sk_clip_rect)) 910 if (paint_canvas_->sk_canvas()->getClipBounds(&sk_clip_rect))
972 clip_rect = gfx::ToEnclosingRect(gfx::SkRectToRectF(sk_clip_rect)); 911 clip_rect = gfx::ToEnclosingRect(gfx::SkRectToRectF(sk_clip_rect));
973 } 912 }
974 913
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { 1106 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
1168 frame_subscriber_ = subscriber.Pass(); 1107 frame_subscriber_ = subscriber.Pass();
1169 } 1108 }
1170 1109
1171 void RenderWidgetHostViewAura::EndFrameSubscription() { 1110 void RenderWidgetHostViewAura::EndFrameSubscription() {
1172 idle_frame_subscriber_textures_.clear(); 1111 idle_frame_subscriber_textures_.clear();
1173 frame_subscriber_.reset(); 1112 frame_subscriber_.reset();
1174 } 1113 }
1175 1114
1176 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() { 1115 void RenderWidgetHostViewAura::OnAcceleratedCompositingStateChange() {
1177 // Delay processing the state change until we either get a software frame if
1178 // switching to software mode or receive a buffers swapped notification
1179 // if switching to accelerated mode.
1180 // Sometimes (e.g. on a page load) the renderer will spuriously disable then
1181 // re-enable accelerated compositing, causing us to flash.
1182 // TODO(piman): factor the enable/disable accelerated compositing message into
1183 // the UpdateRect/AcceleratedSurfaceBuffersSwapped messages so that we have
1184 // fewer inconsistent temporary states.
1185 accelerated_compositing_state_changed_ = true;
1186 } 1116 }
1187 1117
1188 void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id, 1118 void RenderWidgetHostViewAura::AcceleratedSurfaceInitialized(int host_id,
1189 int route_id) { 1119 int route_id) {
1190 } 1120 }
1191 1121
1192 bool RenderWidgetHostViewAura::ShouldSkipFrame(gfx::Size size_in_dip) const { 1122 bool RenderWidgetHostViewAura::ShouldSkipFrame(gfx::Size size_in_dip) const {
1193 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME || 1123 if (can_lock_compositor_ == NO_PENDING_RENDERER_FRAME ||
1194 can_lock_compositor_ == NO_PENDING_COMMIT || 1124 can_lock_compositor_ == NO_PENDING_COMMIT ||
1195 !resize_lock_.get()) 1125 !resize_lock_.get())
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 if (::IsWindow(plugin_parent_window_)) { 1161 if (::IsWindow(plugin_parent_window_)) {
1232 gfx::Rect window_bounds = window_->GetBoundsInRootWindow(); 1162 gfx::Rect window_bounds = window_->GetBoundsInRootWindow();
1233 ::SetWindowPos(plugin_parent_window_, NULL, window_bounds.x(), 1163 ::SetWindowPos(plugin_parent_window_, NULL, window_bounds.x(),
1234 window_bounds.y(), window_bounds.width(), 1164 window_bounds.y(), window_bounds.width(),
1235 window_bounds.height(), 0); 1165 window_bounds.height(), 0);
1236 } 1166 }
1237 #endif 1167 #endif
1238 } 1168 }
1239 1169
1240 void RenderWidgetHostViewAura::CheckResizeLock() { 1170 void RenderWidgetHostViewAura::CheckResizeLock() {
1241 if (!resize_lock_ || resize_lock_->expected_size() != current_frame_size_) 1171 if (!resize_lock_ ||
1172 resize_lock_->expected_size() != current_frame_size_in_dip_)
1242 return; 1173 return;
1243 1174
1244 // Since we got the size we were looking for, unlock the compositor. But delay 1175 // Since we got the size we were looking for, unlock the compositor. But delay
1245 // the release of the lock until we've kicked a frame with the new texture, to 1176 // the release of the lock until we've kicked a frame with the new texture, to
1246 // avoid resizing the UI before we have a chance to draw a "good" frame. 1177 // avoid resizing the UI before we have a chance to draw a "good" frame.
1247 resize_lock_->UnlockCompositor(); 1178 resize_lock_->UnlockCompositor();
1248 ui::Compositor* compositor = GetCompositor(); 1179 ui::Compositor* compositor = GetCompositor();
1249 if (compositor) { 1180 if (compositor) {
1250 if (!compositor->HasObserver(this)) 1181 if (!compositor->HasObserver(this))
1251 compositor->AddObserver(this); 1182 compositor->AddObserver(this);
1252 } 1183 }
1253 } 1184 }
1254 1185
1255 void RenderWidgetHostViewAura::UpdateExternalTexture() {
1256 // Delay processing accelerated compositing state change till here where we
1257 // act upon the state change. (Clear the external texture if switching to
1258 // software mode or set the external texture if going to accelerated mode).
1259 if (accelerated_compositing_state_changed_)
1260 accelerated_compositing_state_changed_ = false;
1261
1262 bool is_compositing_active = host_->is_accelerated_compositing_active();
1263 if (is_compositing_active && current_surface_.get()) {
1264 window_->layer()->SetExternalTexture(current_surface_.get());
1265 current_frame_size_ = ConvertSizeToDIP(
1266 current_surface_->device_scale_factor(), current_surface_->size());
1267 CheckResizeLock();
1268 software_frame_manager_->DiscardCurrentFrame();
1269 } else if (is_compositing_active &&
1270 software_frame_manager_->HasCurrentFrame()) {
1271 cc::TextureMailbox mailbox;
1272 scoped_ptr<cc::SingleReleaseCallback> callback;
1273 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback);
1274 window_->layer()->SetTextureMailbox(mailbox,
1275 callback.Pass(),
1276 last_swapped_surface_scale_factor_);
1277 current_frame_size_ = ConvertSizeToDIP(last_swapped_surface_scale_factor_,
1278 mailbox.shared_memory_size());
1279 CheckResizeLock();
1280 } else {
1281 window_->layer()->SetShowPaintedContent();
1282 resize_lock_.reset();
1283 host_->WasResized();
1284 software_frame_manager_->DiscardCurrentFrame();
1285 }
1286 }
1287
1288 bool RenderWidgetHostViewAura::SwapBuffersPrepare(
1289 const gfx::Rect& surface_rect,
1290 float surface_scale_factor,
1291 const gfx::Rect& damage_rect,
1292 const std::string& mailbox_name,
1293 const BufferPresentedCallback& ack_callback) {
1294 if (last_swapped_surface_size_ != surface_rect.size()) {
1295 // The surface could have shrunk since we skipped an update, in which
1296 // case we can expect a full update.
1297 DLOG_IF(ERROR, damage_rect != surface_rect) << "Expected full damage rect";
1298 skipped_damage_.setEmpty();
1299 last_swapped_surface_size_ = surface_rect.size();
1300 last_swapped_surface_scale_factor_ = surface_scale_factor;
1301 }
1302
1303 if (ShouldSkipFrame(ConvertSizeToDIP(surface_scale_factor,
1304 surface_rect.size())) ||
1305 mailbox_name.empty()) {
1306 skipped_damage_.op(RectToSkIRect(damage_rect), SkRegion::kUnion_Op);
1307 ack_callback.Run(true, scoped_refptr<ui::Texture>());
1308 return false;
1309 }
1310
1311 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1312 current_surface_ =
1313 factory->CreateTransportClient(surface_scale_factor);
1314 if (!current_surface_.get()) {
1315 LOG(ERROR) << "Failed to create ImageTransport texture";
1316 ack_callback.Run(true, scoped_refptr<ui::Texture>());
1317 return false;
1318 }
1319
1320 current_surface_->Consume(mailbox_name, surface_rect.size());
1321 released_front_lock_ = NULL;
1322 UpdateExternalTexture();
1323
1324 return true;
1325 }
1326
1327 void RenderWidgetHostViewAura::SwapBuffersCompleted(
1328 const BufferPresentedCallback& ack_callback,
1329 const scoped_refptr<ui::Texture>& texture_to_return) {
1330 ui::Compositor* compositor = GetCompositor();
1331 if (!compositor) {
1332 ack_callback.Run(false, texture_to_return);
1333 } else {
1334 AddOnCommitCallbackAndDisableLocks(
1335 base::Bind(ack_callback, false, texture_to_return));
1336 }
1337
1338 DidReceiveFrameFromRenderer();
1339 }
1340
1341 void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() { 1186 void RenderWidgetHostViewAura::DidReceiveFrameFromRenderer() {
1342 if (frame_subscriber() && CanCopyToVideoFrame()) { 1187 if (frame_subscriber() && CanCopyToVideoFrame()) {
1343 const base::TimeTicks present_time = base::TimeTicks::Now(); 1188 const base::TimeTicks present_time = base::TimeTicks::Now();
1344 scoped_refptr<media::VideoFrame> frame; 1189 scoped_refptr<media::VideoFrame> frame;
1345 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; 1190 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback;
1346 if (frame_subscriber()->ShouldCaptureFrame(present_time, 1191 if (frame_subscriber()->ShouldCaptureFrame(present_time,
1347 &frame, &callback)) { 1192 &frame, &callback)) {
1348 CopyFromCompositingSurfaceToVideoFrame( 1193 CopyFromCompositingSurfaceToVideoFrame(
1349 gfx::Rect(current_frame_size_), 1194 gfx::Rect(current_frame_size_in_dip_),
1350 frame, 1195 frame,
1351 base::Bind(callback, present_time)); 1196 base::Bind(callback, present_time));
1352 } 1197 }
1353 } 1198 }
1354 } 1199 }
1355 1200
1356 #if defined(OS_WIN) 1201 #if defined(OS_WIN)
1357 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects( 1202 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects(
1358 const std::vector<gfx::Rect>& rects) { 1203 const std::vector<gfx::Rect>& rects) {
1359 // Check this before setting constrained_rects_, so that next time they're set 1204 // Check this before setting constrained_rects_, so that next time they're set
(...skipping 12 matching lines...) Expand all
1372 params.cutout_rects = constrained_rects_; 1217 params.cutout_rects = constrained_rects_;
1373 params.geometry = &plugin_window_moves_; 1218 params.geometry = &plugin_window_moves_;
1374 LPARAM lparam = reinterpret_cast<LPARAM>(&params); 1219 LPARAM lparam = reinterpret_cast<LPARAM>(&params);
1375 EnumChildWindows(parent, SetCutoutRectsCallback, lparam); 1220 EnumChildWindows(parent, SetCutoutRectsCallback, lparam);
1376 } 1221 }
1377 #endif 1222 #endif
1378 1223
1379 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( 1224 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
1380 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, 1225 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
1381 int gpu_host_id) { 1226 int gpu_host_id) {
1382 BufferPresentedCallback ack_callback = base::Bind( 1227 // Oldschool composited mode is no longer supported.
jamesr 2014/02/07 20:43:49 should we NOTREACHED() this? why is this function
danakj 2014/02/07 20:48:06 It's a pure virtual method on RWHVPort, so we need
danakj 2014/02/07 20:49:03 I think we can remove this when GTK linux goes awa
1383 &AcknowledgeBufferForGpu,
1384 params_in_pixel.route_id,
1385 gpu_host_id,
1386 params_in_pixel.mailbox_name);
1387 BuffersSwapped(params_in_pixel.size,
1388 gfx::Rect(params_in_pixel.size),
1389 params_in_pixel.scale_factor,
1390 params_in_pixel.mailbox_name,
1391 params_in_pixel.latency_info,
1392 ack_callback);
1393 } 1228 }
1394 1229
1395 void RenderWidgetHostViewAura::SwapDelegatedFrame( 1230 void RenderWidgetHostViewAura::SwapDelegatedFrame(
1396 uint32 output_surface_id, 1231 uint32 output_surface_id,
1397 scoped_ptr<cc::DelegatedFrameData> frame_data, 1232 scoped_ptr<cc::DelegatedFrameData> frame_data,
1398 float frame_device_scale_factor, 1233 float frame_device_scale_factor,
1399 const std::vector<ui::LatencyInfo>& latency_info) { 1234 const std::vector<ui::LatencyInfo>& latency_info) {
1400 DCHECK_NE(0u, frame_data->render_pass_list.size()); 1235 DCHECK_NE(0u, frame_data->render_pass_list.size());
1401 1236
1402 cc::RenderPass* root_pass = frame_data->render_pass_list.back(); 1237 cc::RenderPass* root_pass = frame_data->render_pass_list.back();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 if (!resource_collection_) { 1297 if (!resource_collection_) {
1463 resource_collection_ = new cc::DelegatedFrameResourceCollection; 1298 resource_collection_ = new cc::DelegatedFrameResourceCollection;
1464 resource_collection_->SetClient(this); 1299 resource_collection_->SetClient(this);
1465 } 1300 }
1466 // If the physical frame size changes, we need a new |frame_provider_|. If 1301 // If the physical frame size changes, we need a new |frame_provider_|. If
1467 // the physical frame size is the same, but the size in DIP changed, we 1302 // the physical frame size is the same, but the size in DIP changed, we
1468 // need to adjust the scale at which the frames will be drawn, and we do 1303 // need to adjust the scale at which the frames will be drawn, and we do
1469 // this by making a new |frame_provider_| also to ensure the scale change 1304 // this by making a new |frame_provider_| also to ensure the scale change
1470 // is presented in sync with the new frame content. 1305 // is presented in sync with the new frame content.
1471 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size() || 1306 if (!frame_provider_.get() || frame_size != frame_provider_->frame_size() ||
1472 frame_size_in_dip != current_frame_size_) { 1307 frame_size_in_dip != current_frame_size_in_dip_) {
1473 frame_provider_ = new cc::DelegatedFrameProvider( 1308 frame_provider_ = new cc::DelegatedFrameProvider(
1474 resource_collection_.get(), frame_data.Pass()); 1309 resource_collection_.get(), frame_data.Pass());
1475 window_->layer()->SetShowDelegatedContent(frame_provider_.get(), 1310 window_->layer()->SetShowDelegatedContent(frame_provider_.get(),
1476 frame_size_in_dip); 1311 frame_size_in_dip);
1477 } else { 1312 } else {
1478 frame_provider_->SetFrameData(frame_data.Pass()); 1313 frame_provider_->SetFrameData(frame_data.Pass());
1479 } 1314 }
1480 } 1315 }
1481 released_front_lock_ = NULL; 1316 released_front_lock_ = NULL;
1482 current_frame_size_ = frame_size_in_dip; 1317 current_frame_size_in_dip_ = frame_size_in_dip;
1483 CheckResizeLock(); 1318 CheckResizeLock();
1484 1319
1485 window_->SchedulePaintInRect(damage_rect_in_dip); 1320 window_->SchedulePaintInRect(damage_rect_in_dip);
1486 1321
1487 pending_delegated_ack_count_++; 1322 pending_delegated_ack_count_++;
1488 1323
1489 ui::Compositor* compositor = GetCompositor(); 1324 ui::Compositor* compositor = GetCompositor();
1490 if (!compositor) { 1325 if (!compositor) {
1491 SendDelegatedFrameAck(output_surface_id); 1326 SendDelegatedFrameAck(output_surface_id);
1492 } else { 1327 } else {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1561 if (!software_frame_manager_->SwapToNewFrame( 1396 if (!software_frame_manager_->SwapToNewFrame(
1562 output_surface_id, 1397 output_surface_id,
1563 frame_data.get(), 1398 frame_data.get(),
1564 frame_device_scale_factor, 1399 frame_device_scale_factor,
1565 host_->GetProcess()->GetHandle())) { 1400 host_->GetProcess()->GetHandle())) {
1566 ReleaseSoftwareFrame(output_surface_id, frame_data->id); 1401 ReleaseSoftwareFrame(output_surface_id, frame_data->id);
1567 SendSoftwareFrameAck(output_surface_id); 1402 SendSoftwareFrameAck(output_surface_id);
1568 return; 1403 return;
1569 } 1404 }
1570 1405
1571 if (last_swapped_surface_size_ != frame_size) { 1406 frame_provider_ = NULL;
1407 delegated_frame_evictor_->DiscardedFrame();
1408
1409 if (last_swapped_software_frame_size_ != frame_size) {
1572 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size)) 1410 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size))
1573 << "Expected full damage rect"; 1411 << "Expected full damage rect";
1574 } 1412 }
1575 last_swapped_surface_size_ = frame_size; 1413 last_swapped_software_frame_size_ = frame_size;
1576 last_swapped_surface_scale_factor_ = frame_device_scale_factor; 1414 last_swapped_software_frame_scale_factor_ = frame_device_scale_factor;
1577 1415
1578 cc::TextureMailbox mailbox; 1416 cc::TextureMailbox mailbox;
1579 scoped_ptr<cc::SingleReleaseCallback> callback; 1417 scoped_ptr<cc::SingleReleaseCallback> callback;
1580 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback); 1418 software_frame_manager_->GetCurrentFrameMailbox(&mailbox, &callback);
1581 DCHECK(mailbox.IsSharedMemory()); 1419 DCHECK(mailbox.IsSharedMemory());
1582 current_frame_size_ = frame_size_in_dip; 1420 current_frame_size_in_dip_ = frame_size_in_dip;
1583 1421
1584 released_front_lock_ = NULL; 1422 released_front_lock_ = NULL;
1585 CheckResizeLock(); 1423 CheckResizeLock();
1586 window_->layer()->SetTextureMailbox(mailbox, 1424 window_->layer()->SetTextureMailbox(mailbox,
1587 callback.Pass(), 1425 callback.Pass(),
1588 frame_device_scale_factor); 1426 frame_device_scale_factor);
1589 window_->SchedulePaintInRect( 1427 window_->SchedulePaintInRect(
1590 ConvertRectToDIP(frame_device_scale_factor, damage_rect)); 1428 ConvertRectToDIP(frame_device_scale_factor, damage_rect));
1591 1429
1592 ui::Compositor* compositor = GetCompositor(); 1430 ui::Compositor* compositor = GetCompositor();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 1481
1644 void RenderWidgetHostViewAura::OnSwapCompositorFrame( 1482 void RenderWidgetHostViewAura::OnSwapCompositorFrame(
1645 uint32 output_surface_id, 1483 uint32 output_surface_id,
1646 scoped_ptr<cc::CompositorFrame> frame) { 1484 scoped_ptr<cc::CompositorFrame> frame) {
1647 TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame"); 1485 TRACE_EVENT0("content", "RenderWidgetHostViewAura::OnSwapCompositorFrame");
1648 if (frame->delegated_frame_data) { 1486 if (frame->delegated_frame_data) {
1649 SwapDelegatedFrame(output_surface_id, 1487 SwapDelegatedFrame(output_surface_id,
1650 frame->delegated_frame_data.Pass(), 1488 frame->delegated_frame_data.Pass(),
1651 frame->metadata.device_scale_factor, 1489 frame->metadata.device_scale_factor,
1652 frame->metadata.latency_info); 1490 frame->metadata.latency_info);
1653 return; 1491 } else if (frame->software_frame_data) {
1654 }
1655
1656 if (frame->software_frame_data) {
1657 SwapSoftwareFrame(output_surface_id, 1492 SwapSoftwareFrame(output_surface_id,
1658 frame->software_frame_data.Pass(), 1493 frame->software_frame_data.Pass(),
1659 frame->metadata.device_scale_factor, 1494 frame->metadata.device_scale_factor,
1660 frame->metadata.latency_info); 1495 frame->metadata.latency_info);
1661 return;
1662 } 1496 }
1663
1664 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero())
1665 return;
1666
1667 BufferPresentedCallback ack_callback = base::Bind(
1668 &SendCompositorFrameAck,
1669 host_->GetRoutingID(), output_surface_id, host_->GetProcess()->GetID(),
1670 frame->gl_frame_data->mailbox, frame->gl_frame_data->size);
1671
1672 if (!frame->gl_frame_data->sync_point) {
1673 LOG(ERROR) << "CompositorFrame without sync point. Skipping frame...";
1674 ack_callback.Run(true, scoped_refptr<ui::Texture>());
1675 return;
1676 }
1677
1678 GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
1679 gl_helper->WaitSyncPoint(frame->gl_frame_data->sync_point);
1680
1681 std::string mailbox_name(
1682 reinterpret_cast<const char*>(frame->gl_frame_data->mailbox.name),
1683 sizeof(frame->gl_frame_data->mailbox.name));
1684 BuffersSwapped(frame->gl_frame_data->size,
1685 frame->gl_frame_data->sub_buffer_rect,
1686 frame->metadata.device_scale_factor,
1687 mailbox_name,
1688 frame->metadata.latency_info,
1689 ack_callback);
1690 } 1497 }
1691 1498
1692 #if defined(OS_WIN) 1499 #if defined(OS_WIN)
1693 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( 1500 void RenderWidgetHostViewAura::SetParentNativeViewAccessible(
1694 gfx::NativeViewAccessible accessible_parent) { 1501 gfx::NativeViewAccessible accessible_parent) {
1695 if (GetBrowserAccessibilityManager()) { 1502 if (GetBrowserAccessibilityManager()) {
1696 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() 1503 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin()
1697 ->set_parent_iaccessible(accessible_parent); 1504 ->set_parent_iaccessible(accessible_parent);
1698 } 1505 }
1699 } 1506 }
1700 1507
1701 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin() 1508 gfx::NativeViewId RenderWidgetHostViewAura::GetParentForWindowlessPlugin()
1702 const { 1509 const {
1703 return reinterpret_cast<gfx::NativeViewId>(plugin_parent_window_); 1510 return reinterpret_cast<gfx::NativeViewId>(plugin_parent_window_);
1704 } 1511 }
1705 #endif 1512 #endif
1706 1513
1707 void RenderWidgetHostViewAura::BuffersSwapped(
1708 const gfx::Size& surface_size,
1709 const gfx::Rect& damage_rect,
1710 float surface_scale_factor,
1711 const std::string& mailbox_name,
1712 const std::vector<ui::LatencyInfo>& latency_info,
1713 const BufferPresentedCallback& ack_callback) {
1714 scoped_refptr<ui::Texture> previous_texture(current_surface_);
1715 const gfx::Rect surface_rect = gfx::Rect(surface_size);
1716 software_frame_manager_->DiscardCurrentFrame();
1717
1718 if (!SwapBuffersPrepare(surface_rect,
1719 surface_scale_factor,
1720 damage_rect,
1721 mailbox_name,
1722 ack_callback)) {
1723 return;
1724 }
1725
1726 SkRegion damage(RectToSkIRect(damage_rect));
1727 if (!skipped_damage_.isEmpty()) {
1728 damage.op(skipped_damage_, SkRegion::kUnion_Op);
1729 skipped_damage_.setEmpty();
1730 }
1731
1732 DCHECK(surface_rect.Contains(SkIRectToRect(damage.getBounds())));
1733 ui::Texture* current_texture = current_surface_.get();
1734
1735 const gfx::Size surface_size_in_pixel = surface_size;
1736 DLOG_IF(ERROR, previous_texture.get() &&
1737 previous_texture->size() != current_texture->size() &&
1738 SkIRectToRect(damage.getBounds()) != surface_rect) <<
1739 "Expected full damage rect after size change";
1740 if (previous_texture.get() && !previous_damage_.isEmpty() &&
1741 previous_texture->size() == current_texture->size()) {
1742 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1743 GLHelper* gl_helper = factory->GetGLHelper();
1744 gl_helper->CopySubBufferDamage(
1745 current_texture->PrepareTexture(),
1746 previous_texture->PrepareTexture(),
1747 damage,
1748 previous_damage_);
1749 }
1750 previous_damage_ = damage;
1751
1752 ui::Compositor* compositor = GetCompositor();
1753 if (compositor) {
1754 // Co-ordinates come in OpenGL co-ordinate space.
1755 // We need to convert to layer space.
1756 gfx::Rect rect_to_paint =
1757 ConvertRectToDIP(surface_scale_factor,
1758 gfx::Rect(damage_rect.x(),
1759 surface_size_in_pixel.height() -
1760 damage_rect.y() - damage_rect.height(),
1761 damage_rect.width(),
1762 damage_rect.height()));
1763
1764 // Damage may not have been DIP aligned, so inflate damage to compensate
1765 // for any round-off error.
1766 rect_to_paint.Inset(-1, -1);
1767 rect_to_paint.Intersect(window_->bounds());
1768
1769 window_->SchedulePaintInRect(rect_to_paint);
1770 for (size_t i = 0; i < latency_info.size(); i++)
1771 compositor->SetLatencyInfo(latency_info[i]);
1772 }
1773
1774 SwapBuffersCompleted(ack_callback, previous_texture);
1775 }
1776
1777 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( 1514 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
1778 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, 1515 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
1779 int gpu_host_id) { 1516 int gpu_host_id) {
1780 gfx::Rect damage_rect(params_in_pixel.x, 1517 // Oldschool composited mode is no longer supported.
jamesr 2014/02/07 20:43:49 ditto
1781 params_in_pixel.y,
1782 params_in_pixel.width,
1783 params_in_pixel.height);
1784 BufferPresentedCallback ack_callback =
1785 base::Bind(&AcknowledgeBufferForGpu,
1786 params_in_pixel.route_id,
1787 gpu_host_id,
1788 params_in_pixel.mailbox_name);
1789 BuffersSwapped(params_in_pixel.surface_size,
1790 damage_rect,
1791 params_in_pixel.surface_scale_factor,
1792 params_in_pixel.mailbox_name,
1793 params_in_pixel.latency_info,
1794 ack_callback);
1795 } 1518 }
1796 1519
1797 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { 1520 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
1798 } 1521 }
1799 1522
1800 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { 1523 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
1801 // This really tells us to release the frontbuffer.
1802 if (current_surface_.get()) {
1803 ui::Compositor* compositor = GetCompositor();
1804 if (compositor) {
1805 // We need to wait for a commit to clear to guarantee that all we
1806 // will not issue any more GL referencing the previous surface.
1807 AddOnCommitCallbackAndDisableLocks(
1808 base::Bind(&RenderWidgetHostViewAura::SetSurfaceNotInUseByCompositor,
1809 AsWeakPtr(),
1810 current_surface_)); // Hold a ref so the texture will not
1811 // get deleted until after commit.
1812 }
1813 current_surface_ = NULL;
1814 UpdateExternalTexture();
1815 }
1816 } 1524 }
1817 1525
1818 bool RenderWidgetHostViewAura::HasAcceleratedSurface( 1526 bool RenderWidgetHostViewAura::HasAcceleratedSurface(
1819 const gfx::Size& desired_size) { 1527 const gfx::Size& desired_size) {
1820 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't 1528 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
1821 // matter what is returned here as GetBackingStore is the only caller of this 1529 // matter what is returned here as GetBackingStore is the only caller of this
1822 // method. TODO(jbates) implement this if other Aura code needs it. 1530 // method. TODO(jbates) implement this if other Aura code needs it.
1823 return false; 1531 return false;
1824 } 1532 }
1825 1533
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
2668 } 2376 }
2669 2377
2670 void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const { 2378 void RenderWidgetHostViewAura::GetHitTestMask(gfx::Path* mask) const {
2671 } 2379 }
2672 2380
2673 void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer, 2381 void RenderWidgetHostViewAura::DidRecreateLayer(ui::Layer *old_layer,
2674 ui::Layer *new_layer) { 2382 ui::Layer *new_layer) {
2675 float mailbox_scale_factor; 2383 float mailbox_scale_factor;
2676 cc::TextureMailbox old_mailbox = 2384 cc::TextureMailbox old_mailbox =
2677 old_layer->GetTextureMailbox(&mailbox_scale_factor); 2385 old_layer->GetTextureMailbox(&mailbox_scale_factor);
2678 scoped_refptr<ui::Texture> old_texture = old_layer->external_texture();
2679 // The new_layer is the one that will be used by our Window, so that's the one 2386 // The new_layer is the one that will be used by our Window, so that's the one
2680 // that should keep our texture. old_layer will be returned to the 2387 // that should keep our texture. old_layer will be returned to the
2681 // RecreateLayer caller, and should have a copy. 2388 // RecreateLayer caller, and should have a copy.
2682 if (old_texture.get()) { 2389 if (old_mailbox.IsSharedMemory()) {
2683 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
2684 GLHelper* gl_helper = factory->GetGLHelper();
2685 scoped_refptr<ui::Texture> new_texture;
2686 if (host_->is_accelerated_compositing_active() &&
2687 gl_helper && current_surface_.get()) {
2688 GLuint texture_id =
2689 gl_helper->CopyTexture(current_surface_->PrepareTexture(),
2690 current_surface_->size());
2691 if (texture_id) {
2692 new_texture = factory->CreateOwnedTexture(
2693 current_surface_->size(),
2694 current_surface_->device_scale_factor(), texture_id);
2695 }
2696 }
2697 if (new_texture.get())
2698 old_layer->SetExternalTexture(new_texture.get());
2699 else
2700 old_layer->SetShowPaintedContent();
2701 new_layer->SetExternalTexture(old_texture.get());
2702 } else if (old_mailbox.IsSharedMemory()) {
2703 base::SharedMemory* old_buffer = old_mailbox.shared_memory(); 2390 base::SharedMemory* old_buffer = old_mailbox.shared_memory();
2704 const size_t size = old_mailbox.shared_memory_size_in_bytes(); 2391 const size_t size = old_mailbox.shared_memory_size_in_bytes();
2705 2392
2706 scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory); 2393 scoped_ptr<base::SharedMemory> new_buffer(new base::SharedMemory);
2707 new_buffer->CreateAndMapAnonymous(size); 2394 new_buffer->CreateAndMapAnonymous(size);
2708 2395
2709 if (old_buffer->memory() && new_buffer->memory()) { 2396 if (old_buffer->memory() && new_buffer->memory()) {
2710 memcpy(new_buffer->memory(), old_buffer->memory(), size); 2397 memcpy(new_buffer->memory(), old_buffer->memory(), size);
2711 base::SharedMemory* new_buffer_raw_ptr = new_buffer.get(); 2398 base::SharedMemory* new_buffer_raw_ptr = new_buffer.get();
2712 scoped_ptr<cc::SingleReleaseCallback> callback = 2399 scoped_ptr<cc::SingleReleaseCallback> callback =
2713 cc::SingleReleaseCallback::Create(base::Bind(MailboxReleaseCallback, 2400 cc::SingleReleaseCallback::Create(base::Bind(MailboxReleaseCallback,
2714 Passed(&new_buffer))); 2401 Passed(&new_buffer)));
2715 cc::TextureMailbox new_mailbox(new_buffer_raw_ptr, 2402 cc::TextureMailbox new_mailbox(new_buffer_raw_ptr,
2716 old_mailbox.shared_memory_size()); 2403 old_mailbox.shared_memory_size());
2717 new_layer->SetTextureMailbox(new_mailbox, 2404 new_layer->SetTextureMailbox(new_mailbox,
2718 callback.Pass(), 2405 callback.Pass(),
2719 mailbox_scale_factor); 2406 mailbox_scale_factor);
2720 } 2407 }
2721 } else if (frame_provider_.get()) { 2408 } else if (frame_provider_.get()) {
2722 new_layer->SetShowDelegatedContent(frame_provider_.get(), 2409 new_layer->SetShowDelegatedContent(frame_provider_.get(),
2723 current_frame_size_); 2410 current_frame_size_in_dip_);
2724 } 2411 }
2725 } 2412 }
2726 2413
2727 //////////////////////////////////////////////////////////////////////////////// 2414 ////////////////////////////////////////////////////////////////////////////////
2728 // RenderWidgetHostViewAura, ui::EventHandler implementation: 2415 // RenderWidgetHostViewAura, ui::EventHandler implementation:
2729 2416
2730 void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) { 2417 void RenderWidgetHostViewAura::OnKeyEvent(ui::KeyEvent* event) {
2731 TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent"); 2418 TRACE_EVENT0("input", "RenderWidgetHostViewAura::OnKeyEvent");
2732 if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event)) 2419 if (touch_editing_client_ && touch_editing_client_->HandleInputEvent(event))
2733 return; 2420 return;
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
3150 uint32 output_surface_id, unsigned frame_id) { 2837 uint32 output_surface_id, unsigned frame_id) {
3151 ReleaseSoftwareFrame(output_surface_id, frame_id); 2838 ReleaseSoftwareFrame(output_surface_id, frame_id);
3152 } 2839 }
3153 2840
3154 void RenderWidgetHostViewAura::ReleaseReferencesToSoftwareFrame() { 2841 void RenderWidgetHostViewAura::ReleaseReferencesToSoftwareFrame() {
3155 ui::Compositor* compositor = GetCompositor(); 2842 ui::Compositor* compositor = GetCompositor();
3156 if (compositor) { 2843 if (compositor) {
3157 AddOnCommitCallbackAndDisableLocks(base::Bind( 2844 AddOnCommitCallbackAndDisableLocks(base::Bind(
3158 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr())); 2845 &RenderWidgetHostViewAura::SendReclaimSoftwareFrames, AsWeakPtr()));
3159 } 2846 }
3160 UpdateExternalTexture(); 2847 window_->layer()->SetShowPaintedContent();
3161 } 2848 }
3162 2849
3163 //////////////////////////////////////////////////////////////////////////////// 2850 ////////////////////////////////////////////////////////////////////////////////
3164 // RenderWidgetHostViewAura, ui::CompositorObserver implementation: 2851 // RenderWidgetHostViewAura, ui::CompositorObserver implementation:
3165 2852
3166 void RenderWidgetHostViewAura::OnCompositingDidCommit( 2853 void RenderWidgetHostViewAura::OnCompositingDidCommit(
3167 ui::Compositor* compositor) { 2854 ui::Compositor* compositor) {
3168 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 2855 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
3169 can_lock_compositor_ = YES; 2856 can_lock_compositor_ = YES;
3170 if (resize_lock_.get() && resize_lock_->GrabDeferredLock()) 2857 if (resize_lock_.get() && resize_lock_->GrabDeferredLock())
3171 can_lock_compositor_ = YES_DID_LOCK; 2858 can_lock_compositor_ = YES_DID_LOCK;
3172 } 2859 }
3173 RunOnCommitCallbacks(); 2860 RunOnCommitCallbacks();
3174 if (resize_lock_ && resize_lock_->expected_size() == current_frame_size_) { 2861 if (resize_lock_ &&
2862 resize_lock_->expected_size() == current_frame_size_in_dip_) {
3175 resize_lock_.reset(); 2863 resize_lock_.reset();
3176 host_->WasResized(); 2864 host_->WasResized();
3177 // We may have had a resize while we had the lock (e.g. if the lock expired, 2865 // We may have had a resize while we had the lock (e.g. if the lock expired,
3178 // or if the UI still gave us some resizes), so make sure we grab a new lock 2866 // or if the UI still gave us some resizes), so make sure we grab a new lock
3179 // if necessary. 2867 // if necessary.
3180 MaybeCreateResizeLock(); 2868 MaybeCreateResizeLock();
3181 } 2869 }
3182 } 2870 }
3183 2871
3184 void RenderWidgetHostViewAura::OnCompositingStarted( 2872 void RenderWidgetHostViewAura::OnCompositingStarted(
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
3269 2957
3270 void RenderWidgetHostViewAura::FatalAccessibilityTreeError() { 2958 void RenderWidgetHostViewAura::FatalAccessibilityTreeError() {
3271 host_->FatalAccessibilityTreeError(); 2959 host_->FatalAccessibilityTreeError();
3272 SetBrowserAccessibilityManager(NULL); 2960 SetBrowserAccessibilityManager(NULL);
3273 } 2961 }
3274 2962
3275 //////////////////////////////////////////////////////////////////////////////// 2963 ////////////////////////////////////////////////////////////////////////////////
3276 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: 2964 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
3277 2965
3278 void RenderWidgetHostViewAura::OnLostResources() { 2966 void RenderWidgetHostViewAura::OnLostResources() {
3279 current_surface_ = NULL; 2967 if (frame_provider_.get())
3280 UpdateExternalTexture(); 2968 EvictDelegatedFrame();
3281
3282 idle_frame_subscriber_textures_.clear(); 2969 idle_frame_subscriber_textures_.clear();
3283 yuv_readback_pipeline_.reset(); 2970 yuv_readback_pipeline_.reset();
3284 2971
3285 // Make sure all ImageTransportClients are deleted now that the context those
3286 // are using is becoming invalid. This sends pending ACKs and needs to happen
3287 // after calling UpdateExternalTexture() which syncs with the impl thread.
3288 RunOnCommitCallbacks();
3289 host_->ScheduleComposite(); 2972 host_->ScheduleComposite();
3290 } 2973 }
3291 2974
3292 //////////////////////////////////////////////////////////////////////////////// 2975 ////////////////////////////////////////////////////////////////////////////////
3293 // RenderWidgetHostViewAura, private: 2976 // RenderWidgetHostViewAura, private:
3294 2977
3295 RenderWidgetHostViewAura::~RenderWidgetHostViewAura() { 2978 RenderWidgetHostViewAura::~RenderWidgetHostViewAura() {
3296 if (touch_editing_client_) 2979 if (touch_editing_client_)
3297 touch_editing_client_->OnViewDestroyed(); 2980 touch_editing_client_->OnViewDestroyed();
3298 2981
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
3485 window_->GetDispatcher()->AddRootWindowObserver(this); 3168 window_->GetDispatcher()->AddRootWindowObserver(this);
3486 host_->ParentChanged(GetNativeViewId()); 3169 host_->ParentChanged(GetNativeViewId());
3487 UpdateScreenInfo(window_); 3170 UpdateScreenInfo(window_);
3488 3171
3489 aura::client::CursorClient* cursor_client = 3172 aura::client::CursorClient* cursor_client =
3490 aura::client::GetCursorClient(window_->GetRootWindow()); 3173 aura::client::GetCursorClient(window_->GetRootWindow());
3491 if (cursor_client) { 3174 if (cursor_client) {
3492 cursor_client->AddObserver(this); 3175 cursor_client->AddObserver(this);
3493 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible()); 3176 NotifyRendererOfCursorVisibilityState(cursor_client->IsCursorVisible());
3494 } 3177 }
3495 if (current_surface_.get())
3496 UpdateExternalTexture();
3497 if (HasFocus()) { 3178 if (HasFocus()) {
3498 ui::InputMethod* input_method = GetInputMethod(); 3179 ui::InputMethod* input_method = GetInputMethod();
3499 if (input_method) 3180 if (input_method)
3500 input_method->SetFocusedTextInputClient(this); 3181 input_method->SetFocusedTextInputClient(this);
3501 } 3182 }
3502 } 3183 }
3503 3184
3504 void RenderWidgetHostViewAura::RemovingFromRootWindow() { 3185 void RenderWidgetHostViewAura::RemovingFromRootWindow() {
3505 aura::client::CursorClient* cursor_client = 3186 aura::client::CursorClient* cursor_client =
3506 aura::client::GetCursorClient(window_->GetRootWindow()); 3187 aura::client::GetCursorClient(window_->GetRootWindow());
3507 if (cursor_client) 3188 if (cursor_client)
3508 cursor_client->RemoveObserver(this); 3189 cursor_client->RemoveObserver(this);
3509 3190
3510 DetachFromInputMethod(); 3191 DetachFromInputMethod();
3511 3192
3512 window_->GetDispatcher()->RemoveRootWindowObserver(this); 3193 window_->GetDispatcher()->RemoveRootWindowObserver(this);
3513 host_->ParentChanged(0); 3194 host_->ParentChanged(0);
3514 ui::Compositor* compositor = GetCompositor();
3515 if (current_surface_.get()) {
3516 // We can't get notification for commits after this point, which would
3517 // guarantee that the compositor isn't using an old texture any more, so
3518 // instead we force the layer to stop using any external resources which
3519 // synchronizes with the compositor thread, and makes it safe to run the
3520 // callback.
3521 window_->layer()->SetShowPaintedContent();
3522 }
3523 RunOnCommitCallbacks(); 3195 RunOnCommitCallbacks();
3524 resize_lock_.reset(); 3196 resize_lock_.reset();
3525 host_->WasResized(); 3197 host_->WasResized();
3198 ui::Compositor* compositor = GetCompositor();
3526 if (compositor && compositor->HasObserver(this)) 3199 if (compositor && compositor->HasObserver(this))
3527 compositor->RemoveObserver(this); 3200 compositor->RemoveObserver(this);
3528 } 3201 }
3529 3202
3530 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() const { 3203 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() const {
3531 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher(); 3204 aura::WindowEventDispatcher* dispatcher = window_->GetDispatcher();
3532 return dispatcher ? dispatcher->host()->compositor() : NULL; 3205 return dispatcher ? dispatcher->host()->compositor() : NULL;
3533 } 3206 }
3534 3207
3535 void RenderWidgetHostViewAura::DetachFromInputMethod() { 3208 void RenderWidgetHostViewAura::DetachFromInputMethod() {
(...skipping 20 matching lines...) Expand all
3556 RenderWidgetHost* widget) { 3229 RenderWidgetHost* widget) {
3557 return new RenderWidgetHostViewAura(widget); 3230 return new RenderWidgetHostViewAura(widget);
3558 } 3231 }
3559 3232
3560 // static 3233 // static
3561 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 3234 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
3562 GetScreenInfoForWindow(results, NULL); 3235 GetScreenInfoForWindow(results, NULL);
3563 } 3236 }
3564 3237
3565 } // namespace content 3238 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698