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

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

Issue 13042012: Browser side changes for software compositing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 7 years, 9 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/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 906
907 void RenderWidgetHostViewAura::Blur() { 907 void RenderWidgetHostViewAura::Blur() {
908 window_->Blur(); 908 window_->Blur();
909 } 909 }
910 910
911 bool RenderWidgetHostViewAura::HasFocus() const { 911 bool RenderWidgetHostViewAura::HasFocus() const {
912 return window_->HasFocus(); 912 return window_->HasFocus();
913 } 913 }
914 914
915 bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const { 915 bool RenderWidgetHostViewAura::IsSurfaceAvailableForCopy() const {
916 return current_surface_ || !!host_->GetBackingStore(false); 916 return current_surface_ || current_dib_ || !!host_->GetBackingStore(false);
917 } 917 }
918 918
919 void RenderWidgetHostViewAura::Show() { 919 void RenderWidgetHostViewAura::Show() {
920 window_->Show(); 920 window_->Show();
921 } 921 }
922 922
923 void RenderWidgetHostViewAura::Hide() { 923 void RenderWidgetHostViewAura::Hide() {
924 window_->Hide(); 924 window_->Hide();
925 } 925 }
926 926
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1311 released_front_lock_ = NULL; 1311 released_front_lock_ = NULL;
1312 UpdateExternalTexture(); 1312 UpdateExternalTexture();
1313 1313
1314 return true; 1314 return true;
1315 } 1315 }
1316 1316
1317 void RenderWidgetHostViewAura::SwapBuffersCompleted( 1317 void RenderWidgetHostViewAura::SwapBuffersCompleted(
1318 const BufferPresentedCallback& ack_callback, 1318 const BufferPresentedCallback& ack_callback,
1319 const scoped_refptr<ui::Texture>& texture_to_return) { 1319 const scoped_refptr<ui::Texture>& texture_to_return) {
1320 ui::Compositor* compositor = GetCompositor(); 1320 ui::Compositor* compositor = GetCompositor();
1321 if (!compositor) { 1321 if (!compositor)
1322 ack_callback.Run(false, texture_to_return); 1322 ack_callback.Run(false, texture_to_return);
1323 } else { 1323 else
1324 // Add sending an ACK to the list of things to do OnCompositingDidCommit 1324 AddOnCommitCallback(base::Bind(ack_callback, false, texture_to_return));
1325 can_lock_compositor_ = NO_PENDING_COMMIT;
1326 on_compositing_did_commit_callbacks_.push_back(
1327 base::Bind(ack_callback, false, texture_to_return));
1328 if (!compositor->HasObserver(this))
1329 compositor->AddObserver(this);
1330 }
1331 } 1325 }
1332 1326
1333 #if defined(OS_WIN) 1327 #if defined(OS_WIN)
1334 void RenderWidgetHostViewAura::UpdateTransientRects( 1328 void RenderWidgetHostViewAura::UpdateTransientRects(
1335 const std::vector<gfx::Rect>& rects) { 1329 const std::vector<gfx::Rect>& rects) {
1336 transient_rects_ = rects; 1330 transient_rects_ = rects;
1337 UpdateCutoutRects(); 1331 UpdateCutoutRects();
1338 } 1332 }
1339 1333
1340 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects( 1334 void RenderWidgetHostViewAura::UpdateConstrainedWindowRects(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1388 released_front_lock_ = NULL; 1382 released_front_lock_ = NULL;
1389 CheckResizeLocks(frame_size_in_dip); 1383 CheckResizeLocks(frame_size_in_dip);
1390 1384
1391 if (paint_observer_) 1385 if (paint_observer_)
1392 paint_observer_->OnUpdateCompositorContent(); 1386 paint_observer_->OnUpdateCompositorContent();
1393 1387
1394 ui::Compositor* compositor = GetCompositor(); 1388 ui::Compositor* compositor = GetCompositor();
1395 if (!compositor) { 1389 if (!compositor) {
1396 SendDelegatedFrameAck(); 1390 SendDelegatedFrameAck();
1397 } else { 1391 } else {
1398 can_lock_compositor_ = NO_PENDING_COMMIT; 1392 AddOnCommitCallback(
1399 on_compositing_did_commit_callbacks_.push_back(
1400 base::Bind(&RenderWidgetHostViewAura::SendDelegatedFrameAck, 1393 base::Bind(&RenderWidgetHostViewAura::SendDelegatedFrameAck,
1401 base::Unretained(this))); 1394 AsWeakPtr()));
1402 if (!compositor->HasObserver(this))
1403 compositor->AddObserver(this);
1404 } 1395 }
1405 } 1396 }
1406 1397
1407 void RenderWidgetHostViewAura::SendDelegatedFrameAck() { 1398 void RenderWidgetHostViewAura::SendDelegatedFrameAck() {
1408 cc::CompositorFrameAck ack; 1399 cc::CompositorFrameAck ack;
1409 window_->layer()->TakeUnusedResourcesForChildCompositor(&ack.resources); 1400 window_->layer()->TakeUnusedResourcesForChildCompositor(&ack.resources);
1410 RenderWidgetHostImpl::SendSwapCompositorFrameAck( 1401 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1411 host_->GetRoutingID(), host_->GetProcess()->GetID(), ack); 1402 host_->GetRoutingID(), host_->GetProcess()->GetID(), ack);
1412 } 1403 }
1413 1404
1405 void RenderWidgetHostViewAura::SwapSoftwareFrame(
1406 scoped_ptr<cc::SoftwareFrameData> frame_data,
1407 float frame_device_scale_factor) {
1408 const gfx::Size& frame_size = frame_data->size;
1409 const gfx::Rect& damage_rect = frame_data->damage_rect;
1410 TransportDIB::Handle handle = frame_data->content_dib;
1411
1412 #if defined(OS_WIN)
1413 ::DuplicateHandle(host_->GetProcess()->GetHandle(), handle,
slavi 2013/03/27 20:16:40 BUG: Save the original handle value so that we sen
1414 ::GetCurrentProcess(), &handle,
1415 0, FALSE, DUPLICATE_SAME_ACCESS);
1416 #endif
1417
1418 current_dib_.reset(TransportDIB::Map(handle));
1419 previous_damage_.op(RectToSkIRect(damage_rect), SkRegion::kUnion_Op);
1420 if (last_swapped_surface_size_ != frame_size) {
1421 DLOG_IF(ERROR, damage_rect != gfx::Rect(frame_size))
1422 << "Expected full damage rect";
1423 last_swapped_surface_size_ = frame_size;
1424 }
1425
1426 gfx::Size frame_size_in_dip = gfx::ToFlooredSize(
1427 gfx::ScaleSize(frame_size, 1.0f / frame_device_scale_factor));
1428 ui::Compositor* compositor = GetCompositor();
1429 if (!compositor || !current_dib_ || ShouldSkipFrame(frame_size_in_dip)) {
1430 SendSoftwareFrameAck(handle);
1431 return;
1432 }
1433
1434 window_->SetExternalTexture(NULL);
1435 released_front_lock_ = NULL;
1436 CheckResizeLocks(frame_size_in_dip);
1437 AddOnCommitCallback(
1438 base::Bind(&RenderWidgetHostViewAura::SendSoftwareFrameAck,
1439 AsWeakPtr(), handle));
1440
1441 if (paint_observer_)
1442 paint_observer_->OnUpdateCompositorContent();
1443 window_->SchedulePaintInRect(ConvertRectToDIP(this, damage_rect));
1444 }
1445
1446 void RenderWidgetHostViewAura::SendSoftwareFrameAck(
1447 TransportDIB::Handle handle) {
1448 cc::CompositorFrameAck ack;
1449 ack.last_content_dib = handle;
1450 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1451 host_->GetRoutingID(), host_->GetProcess()->GetID(), ack);
1452 }
1453
1454
1414 void RenderWidgetHostViewAura::OnSwapCompositorFrame( 1455 void RenderWidgetHostViewAura::OnSwapCompositorFrame(
1415 scoped_ptr<cc::CompositorFrame> frame) { 1456 scoped_ptr<cc::CompositorFrame> frame) {
1416 if (frame->delegated_frame_data) { 1457 if (frame->delegated_frame_data) {
1417 SwapDelegatedFrame(frame->delegated_frame_data.Pass(), 1458 SwapDelegatedFrame(frame->delegated_frame_data.Pass(),
1418 frame->metadata.device_scale_factor); 1459 frame->metadata.device_scale_factor);
1419 return; 1460 return;
1420 } 1461 }
1462
1463 if (frame->software_frame_data) {
1464 SwapSoftwareFrame(frame->software_frame_data.Pass(),
1465 frame->metadata.device_scale_factor);
1466 return;
1467 }
1468
1421 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero()) 1469 if (!frame->gl_frame_data || frame->gl_frame_data->mailbox.IsZero())
1422 return; 1470 return;
1423 1471
1424 BufferPresentedCallback ack_callback = base::Bind( 1472 BufferPresentedCallback ack_callback = base::Bind(
1425 &SendCompositorFrameAck, 1473 &SendCompositorFrameAck,
1426 host_->GetRoutingID(), host_->GetProcess()->GetID(), 1474 host_->GetRoutingID(), host_->GetProcess()->GetID(),
1427 frame->gl_frame_data->mailbox, frame->gl_frame_data->size); 1475 frame->gl_frame_data->mailbox, frame->gl_frame_data->size);
1428 1476
1429 if (!frame->gl_frame_data->sync_point) { 1477 if (!frame->gl_frame_data->sync_point) {
1430 LOG(ERROR) << "CompositorFrame without sync point. Skipping frame..."; 1478 LOG(ERROR) << "CompositorFrame without sync point. Skipping frame...";
1431 ack_callback.Run(true, scoped_refptr<ui::Texture>()); 1479 ack_callback.Run(true, scoped_refptr<ui::Texture>());
1432 return; 1480 return;
1433 } 1481 }
1434 1482
1435 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1483 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1436 factory->WaitSyncPoint(frame->gl_frame_data->sync_point); 1484 factory->WaitSyncPoint(frame->gl_frame_data->sync_point);
1437 1485
1438 std::string mailbox_name( 1486 std::string mailbox_name(
1439 reinterpret_cast<const char*>(frame->gl_frame_data->mailbox.name), 1487 reinterpret_cast<const char*>(frame->gl_frame_data->mailbox.name),
1440 sizeof(frame->gl_frame_data->mailbox.name)); 1488 sizeof(frame->gl_frame_data->mailbox.name));
1441 BuffersSwapped( 1489 BuffersSwapped(
1442 frame->gl_frame_data->size, mailbox_name, ack_callback); 1490 frame->gl_frame_data->size, mailbox_name, ack_callback);
1443 } 1491 }
1444 1492
1445 void RenderWidgetHostViewAura::BuffersSwapped( 1493 void RenderWidgetHostViewAura::BuffersSwapped(
1446 const gfx::Size& size, 1494 const gfx::Size& size,
1447 const std::string& mailbox_name, 1495 const std::string& mailbox_name,
1448 const BufferPresentedCallback& ack_callback) { 1496 const BufferPresentedCallback& ack_callback) {
1449 scoped_refptr<ui::Texture> texture_to_return(current_surface_); 1497 scoped_refptr<ui::Texture> texture_to_return(current_surface_);
1450 const gfx::Rect surface_rect = gfx::Rect(gfx::Point(), size); 1498 const gfx::Rect surface_rect = gfx::Rect(size);
1451 if (!SwapBuffersPrepare( 1499 if (!SwapBuffersPrepare(
1452 surface_rect, surface_rect, mailbox_name, ack_callback)) { 1500 surface_rect, surface_rect, mailbox_name, ack_callback)) {
1453 return; 1501 return;
1454 } 1502 }
1455 1503
1456 previous_damage_.setRect(RectToSkIRect(surface_rect)); 1504 previous_damage_.setRect(RectToSkIRect(surface_rect));
1457 skipped_damage_.setEmpty(); 1505 skipped_damage_.setEmpty();
1458 1506
1459 ui::Compositor* compositor = GetCompositor(); 1507 ui::Compositor* compositor = GetCompositor();
1460 if (compositor) { 1508 if (compositor) {
1461 gfx::Size surface_size = ConvertSizeToDIP(this, size); 1509 gfx::Size surface_size = ConvertSizeToDIP(this, size);
1462 window_->SchedulePaintInRect(gfx::Rect(surface_size)); 1510 window_->SchedulePaintInRect(gfx::Rect(surface_size));
1463 } 1511 }
1464 1512
1465 if (paint_observer_) 1513 if (paint_observer_)
1466 paint_observer_->OnUpdateCompositorContent(); 1514 paint_observer_->OnUpdateCompositorContent();
1467 1515
1468 SwapBuffersCompleted(ack_callback, texture_to_return); 1516 SwapBuffersCompleted(ack_callback, texture_to_return);
1469 } 1517 }
1470 1518
1471 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer( 1519 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
1472 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel, 1520 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
1473 int gpu_host_id) { 1521 int gpu_host_id) {
1474 scoped_refptr<ui::Texture> previous_texture(current_surface_); 1522 scoped_refptr<ui::Texture> previous_texture(current_surface_);
1475 const gfx::Rect surface_rect = 1523 const gfx::Rect surface_rect =
1476 gfx::Rect(gfx::Point(), params_in_pixel.surface_size); 1524 gfx::Rect(params_in_pixel.surface_size);
1477 gfx::Rect damage_rect(params_in_pixel.x, 1525 gfx::Rect damage_rect(params_in_pixel.x,
1478 params_in_pixel.y, 1526 params_in_pixel.y,
1479 params_in_pixel.width, 1527 params_in_pixel.width,
1480 params_in_pixel.height); 1528 params_in_pixel.height);
1481 BufferPresentedCallback ack_callback = base::Bind( 1529 BufferPresentedCallback ack_callback = base::Bind(
1482 &AcknowledgeBufferForGpu, params_in_pixel.route_id, gpu_host_id, 1530 &AcknowledgeBufferForGpu, params_in_pixel.route_id, gpu_host_id,
1483 params_in_pixel.mailbox_name); 1531 params_in_pixel.mailbox_name);
1484 1532
1485 if (!SwapBuffersPrepare( 1533 if (!SwapBuffersPrepare(
1486 surface_rect, damage_rect, params_in_pixel.mailbox_name, ack_callback)) { 1534 surface_rect, damage_rect, params_in_pixel.mailbox_name, ack_callback)) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { 1588 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
1541 } 1589 }
1542 1590
1543 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { 1591 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
1544 // This really tells us to release the frontbuffer. 1592 // This really tells us to release the frontbuffer.
1545 if (current_surface_) { 1593 if (current_surface_) {
1546 ui::Compositor* compositor = GetCompositor(); 1594 ui::Compositor* compositor = GetCompositor();
1547 if (compositor) { 1595 if (compositor) {
1548 // We need to wait for a commit to clear to guarantee that all we 1596 // We need to wait for a commit to clear to guarantee that all we
1549 // will not issue any more GL referencing the previous surface. 1597 // will not issue any more GL referencing the previous surface.
1550 can_lock_compositor_ = NO_PENDING_COMMIT; 1598 AddOnCommitCallback(
1551 on_compositing_did_commit_callbacks_.push_back(
1552 base::Bind(&RenderWidgetHostViewAura:: 1599 base::Bind(&RenderWidgetHostViewAura::
1553 SetSurfaceNotInUseByCompositor, 1600 SetSurfaceNotInUseByCompositor,
1554 AsWeakPtr(), 1601 AsWeakPtr(),
1555 current_surface_)); // Hold a ref so the texture will not 1602 current_surface_)); // Hold a ref so the texture will not
1556 // get deleted until after commit. 1603 // get deleted until after commit.
1557 if (!compositor->HasObserver(this))
1558 compositor->AddObserver(this);
1559 } 1604 }
1560 current_surface_ = NULL; 1605 current_surface_ = NULL;
1561 UpdateExternalTexture(); 1606 UpdateExternalTexture();
1562 } 1607 }
1563 } 1608 }
1564 1609
1565 bool RenderWidgetHostViewAura::HasAcceleratedSurface( 1610 bool RenderWidgetHostViewAura::HasAcceleratedSurface(
1566 const gfx::Size& desired_size) { 1611 const gfx::Size& desired_size) {
1567 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't 1612 // Aura doesn't use GetBackingStore for accelerated pages, so it doesn't
1568 // matter what is returned here as GetBackingStore is the only caller of this 1613 // matter what is returned here as GetBackingStore is the only caller of this
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 1976
1932 bool RenderWidgetHostViewAura::CanFocus() { 1977 bool RenderWidgetHostViewAura::CanFocus() {
1933 return popup_type_ == WebKit::WebPopupTypeNone; 1978 return popup_type_ == WebKit::WebPopupTypeNone;
1934 } 1979 }
1935 1980
1936 void RenderWidgetHostViewAura::OnCaptureLost() { 1981 void RenderWidgetHostViewAura::OnCaptureLost() {
1937 host_->LostCapture(); 1982 host_->LostCapture();
1938 } 1983 }
1939 1984
1940 void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) { 1985 void RenderWidgetHostViewAura::OnPaint(gfx::Canvas* canvas) {
1941 paint_canvas_ = canvas; 1986 bool is_compositing_active = host_->is_accelerated_compositing_active();
1942 BackingStore* backing_store = host_->GetBackingStore(true); 1987 bool has_backing_store = !!host_->GetBackingStore(false);
1943 paint_canvas_ = NULL; 1988 if (is_compositing_active && current_dib_) {
1944 if (backing_store) { 1989 SkBitmap bitmap;
1945 static_cast<BackingStoreAura*>(backing_store)->SkiaShowRect(gfx::Point(), 1990 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
1946 canvas); 1991 last_swapped_surface_size_.width(),
1992 last_swapped_surface_size_.height());
1993 bitmap.setPixels(current_dib_->memory());
1994
1995 SkCanvas* sk_canvas = canvas->sk_canvas();
1996 for (SkRegion::Iterator it(previous_damage_); !it.done(); it.next()) {
1997 const SkIRect& src_rect = it.rect();
1998 SkRect dst_rect = SkRect::Make(src_rect);
1999 sk_canvas->drawBitmapRect(bitmap, &src_rect, dst_rect, NULL);
2000 }
2001 previous_damage_.setEmpty();
2002
2003 if (paint_observer_)
2004 paint_observer_->OnPaintComplete();
2005 } else if (!is_compositing_active && has_backing_store) {
2006 paint_canvas_ = canvas;
2007 BackingStoreAura* backing_store = static_cast<BackingStoreAura*>(
2008 host_->GetBackingStore(true));
2009 paint_canvas_ = NULL;
2010 backing_store->SkiaShowRect(gfx::Point(), canvas);
2011
1947 if (paint_observer_) 2012 if (paint_observer_)
1948 paint_observer_->OnPaintComplete(); 2013 paint_observer_->OnPaintComplete();
1949 } else if (aura::Env::GetInstance()->render_white_bg()) { 2014 } else if (aura::Env::GetInstance()->render_white_bg()) {
1950 canvas->DrawColor(SK_ColorWHITE); 2015 canvas->DrawColor(SK_ColorWHITE);
1951 } 2016 }
1952 } 2017 }
1953 2018
1954 void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged( 2019 void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
1955 float device_scale_factor) { 2020 float device_scale_factor) {
1956 if (!host_) 2021 if (!host_)
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
2354 2419
2355 void RenderWidgetHostViewAura::OnCompositingDidCommit( 2420 void RenderWidgetHostViewAura::OnCompositingDidCommit(
2356 ui::Compositor* compositor) { 2421 ui::Compositor* compositor) {
2357 if (can_lock_compositor_ == NO_PENDING_COMMIT) { 2422 if (can_lock_compositor_ == NO_PENDING_COMMIT) {
2358 can_lock_compositor_ = YES; 2423 can_lock_compositor_ = YES;
2359 for (ResizeLockList::iterator it = resize_locks_.begin(); 2424 for (ResizeLockList::iterator it = resize_locks_.begin();
2360 it != resize_locks_.end(); ++it) 2425 it != resize_locks_.end(); ++it)
2361 if ((*it)->GrabDeferredLock()) 2426 if ((*it)->GrabDeferredLock())
2362 can_lock_compositor_ = YES_DID_LOCK; 2427 can_lock_compositor_ = YES_DID_LOCK;
2363 } 2428 }
2364 RunCompositingDidCommitCallbacks(); 2429 RunOnCommitCallbacks();
2365 locks_pending_commit_.clear(); 2430 locks_pending_commit_.clear();
2366 } 2431 }
2367 2432
2368 void RenderWidgetHostViewAura::OnCompositingStarted( 2433 void RenderWidgetHostViewAura::OnCompositingStarted(
2369 ui::Compositor* compositor, base::TimeTicks start_time) { 2434 ui::Compositor* compositor, base::TimeTicks start_time) {
2370 last_draw_ended_ = start_time; 2435 last_draw_ended_ = start_time;
2371 } 2436 }
2372 2437
2373 void RenderWidgetHostViewAura::OnCompositingEnded( 2438 void RenderWidgetHostViewAura::OnCompositingEnded(
2374 ui::Compositor* compositor) { 2439 ui::Compositor* compositor) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2453 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation: 2518 // RenderWidgetHostViewAura, ImageTransportFactoryObserver implementation:
2454 2519
2455 void RenderWidgetHostViewAura::OnLostResources() { 2520 void RenderWidgetHostViewAura::OnLostResources() {
2456 current_surface_ = NULL; 2521 current_surface_ = NULL;
2457 UpdateExternalTexture(); 2522 UpdateExternalTexture();
2458 locks_pending_commit_.clear(); 2523 locks_pending_commit_.clear();
2459 2524
2460 // Make sure all ImageTransportClients are deleted now that the context those 2525 // Make sure all ImageTransportClients are deleted now that the context those
2461 // are using is becoming invalid. This sends pending ACKs and needs to happen 2526 // are using is becoming invalid. This sends pending ACKs and needs to happen
2462 // after calling UpdateExternalTexture() which syncs with the impl thread. 2527 // after calling UpdateExternalTexture() which syncs with the impl thread.
2463 RunCompositingDidCommitCallbacks(); 2528 RunOnCommitCallbacks();
2464 2529
2465 DCHECK(!shared_surface_handle_.is_null()); 2530 DCHECK(!shared_surface_handle_.is_null());
2466 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 2531 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
2467 factory->DestroySharedSurfaceHandle(shared_surface_handle_); 2532 factory->DestroySharedSurfaceHandle(shared_surface_handle_);
2468 shared_surface_handle_ = factory->CreateSharedSurfaceHandle(); 2533 shared_surface_handle_ = factory->CreateSharedSurfaceHandle();
2469 host_->CompositingSurfaceUpdated(); 2534 host_->CompositingSurfaceUpdated();
2470 host_->ScheduleComposite(); 2535 host_->ScheduleComposite();
2471 } 2536 }
2472 2537
2473 //////////////////////////////////////////////////////////////////////////////// 2538 ////////////////////////////////////////////////////////////////////////////////
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 gfx::Rect rect = window_->bounds(); 2674 gfx::Rect rect = window_->bounds();
2610 int border_x = rect.width() * kMouseLockBorderPercentage / 100; 2675 int border_x = rect.width() * kMouseLockBorderPercentage / 100;
2611 int border_y = rect.height() * kMouseLockBorderPercentage / 100; 2676 int border_y = rect.height() * kMouseLockBorderPercentage / 100;
2612 2677
2613 return global_mouse_position_.x() < rect.x() + border_x || 2678 return global_mouse_position_.x() < rect.x() + border_x ||
2614 global_mouse_position_.x() > rect.right() - border_x || 2679 global_mouse_position_.x() > rect.right() - border_x ||
2615 global_mouse_position_.y() < rect.y() + border_y || 2680 global_mouse_position_.y() < rect.y() + border_y ||
2616 global_mouse_position_.y() > rect.bottom() - border_y; 2681 global_mouse_position_.y() > rect.bottom() - border_y;
2617 } 2682 }
2618 2683
2619 void RenderWidgetHostViewAura::RunCompositingDidCommitCallbacks() { 2684 void RenderWidgetHostViewAura::RunOnCommitCallbacks() {
2620 for (std::vector<base::Closure>::const_iterator 2685 for (std::vector<base::Closure>::const_iterator
2621 it = on_compositing_did_commit_callbacks_.begin(); 2686 it = on_compositing_did_commit_callbacks_.begin();
2622 it != on_compositing_did_commit_callbacks_.end(); ++it) { 2687 it != on_compositing_did_commit_callbacks_.end(); ++it) {
2623 it->Run(); 2688 it->Run();
2624 } 2689 }
2625 on_compositing_did_commit_callbacks_.clear(); 2690 on_compositing_did_commit_callbacks_.clear();
2626 } 2691 }
2627 2692
2693 void RenderWidgetHostViewAura::AddOnCommitCallback(
2694 const base::Closure& callback) {
2695 ui::Compositor* compositor = GetCompositor();
2696 if (!compositor)
2697 return;
2698
2699 if (!compositor->HasObserver(this))
2700 compositor->AddObserver(this);
2701
2702 can_lock_compositor_ = NO_PENDING_COMMIT;
2703 on_compositing_did_commit_callbacks_.push_back(callback);
2704 return;
2705 }
2706
2628 void RenderWidgetHostViewAura::AddedToRootWindow() { 2707 void RenderWidgetHostViewAura::AddedToRootWindow() {
2629 window_->GetRootWindow()->AddRootWindowObserver(this); 2708 window_->GetRootWindow()->AddRootWindowObserver(this);
2630 host_->ParentChanged(GetNativeViewId()); 2709 host_->ParentChanged(GetNativeViewId());
2631 UpdateScreenInfo(window_); 2710 UpdateScreenInfo(window_);
2632 if (popup_type_ != WebKit::WebPopupTypeNone) 2711 if (popup_type_ != WebKit::WebPopupTypeNone)
2633 event_filter_for_popup_exit_.reset(new EventFilterForPopupExit(this)); 2712 event_filter_for_popup_exit_.reset(new EventFilterForPopupExit(this));
2634 } 2713 }
2635 2714
2636 void RenderWidgetHostViewAura::RemovingFromRootWindow() { 2715 void RenderWidgetHostViewAura::RemovingFromRootWindow() {
2637 event_filter_for_popup_exit_.reset(); 2716 event_filter_for_popup_exit_.reset();
2638 window_->GetRootWindow()->RemoveRootWindowObserver(this); 2717 window_->GetRootWindow()->RemoveRootWindowObserver(this);
2639 host_->ParentChanged(0); 2718 host_->ParentChanged(0);
2640 // We are about to disconnect ourselves from the compositor, we need to issue 2719 // We are about to disconnect ourselves from the compositor, we need to issue
2641 // the callbacks now, because we won't get notified when the frame is done. 2720 // the callbacks now, because we won't get notified when the frame is done.
2642 // TODO(piman): this might in theory cause a race where the GPU process starts 2721 // TODO(piman): this might in theory cause a race where the GPU process starts
2643 // drawing to the buffer we haven't yet displayed. This will only show for 1 2722 // drawing to the buffer we haven't yet displayed. This will only show for 1
2644 // frame though, because we will reissue a new frame right away without that 2723 // frame though, because we will reissue a new frame right away without that
2645 // composited data. 2724 // composited data.
2646 ui::Compositor* compositor = GetCompositor(); 2725 ui::Compositor* compositor = GetCompositor();
2647 RunCompositingDidCommitCallbacks(); 2726 RunOnCommitCallbacks();
2648 locks_pending_commit_.clear(); 2727 locks_pending_commit_.clear();
2649 if (compositor && compositor->HasObserver(this)) 2728 if (compositor && compositor->HasObserver(this))
2650 compositor->RemoveObserver(this); 2729 compositor->RemoveObserver(this);
2651 DetachFromInputMethod(); 2730 DetachFromInputMethod();
2652 } 2731 }
2653 2732
2654 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() { 2733 ui::Compositor* RenderWidgetHostViewAura::GetCompositor() {
2655 aura::RootWindow* root_window = window_->GetRootWindow(); 2734 aura::RootWindow* root_window = window_->GetRootWindow();
2656 return root_window ? root_window->compositor() : NULL; 2735 return root_window ? root_window->compositor() : NULL;
2657 } 2736 }
(...skipping 12 matching lines...) Expand all
2670 RenderWidgetHost* widget) { 2749 RenderWidgetHost* widget) {
2671 return new RenderWidgetHostViewAura(widget); 2750 return new RenderWidgetHostViewAura(widget);
2672 } 2751 }
2673 2752
2674 // static 2753 // static
2675 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 2754 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
2676 GetScreenInfoForWindow(results, NULL); 2755 GetScreenInfoForWindow(results, NULL);
2677 } 2756 }
2678 2757
2679 } // namespace content 2758 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.h ('k') | content/content_renderer.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698