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

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

Issue 16730003: Aura: Support --enable-partial-swap with --composite-to-mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 6 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 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 1477
1478 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped( 1478 void RenderWidgetHostViewAura::AcceleratedSurfaceBuffersSwapped(
1479 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel, 1479 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params_in_pixel,
1480 int gpu_host_id) { 1480 int gpu_host_id) {
1481 BufferPresentedCallback ack_callback = base::Bind( 1481 BufferPresentedCallback ack_callback = base::Bind(
1482 &AcknowledgeBufferForGpu, 1482 &AcknowledgeBufferForGpu,
1483 params_in_pixel.route_id, 1483 params_in_pixel.route_id,
1484 gpu_host_id, 1484 gpu_host_id,
1485 params_in_pixel.mailbox_name); 1485 params_in_pixel.mailbox_name);
1486 BuffersSwapped(params_in_pixel.size, 1486 BuffersSwapped(params_in_pixel.size,
1487 gfx::Rect(params_in_pixel.size),
1487 params_in_pixel.scale_factor, 1488 params_in_pixel.scale_factor,
1488 params_in_pixel.mailbox_name, 1489 params_in_pixel.mailbox_name,
1489 params_in_pixel.latency_info, 1490 params_in_pixel.latency_info,
1490 ack_callback); 1491 ack_callback);
1491 } 1492 }
1492 1493
1493 void RenderWidgetHostViewAura::SwapDelegatedFrame( 1494 void RenderWidgetHostViewAura::SwapDelegatedFrame(
1494 scoped_ptr<cc::DelegatedFrameData> frame_data, 1495 scoped_ptr<cc::DelegatedFrameData> frame_data,
1495 float frame_device_scale_factor, 1496 float frame_device_scale_factor,
1496 const ui::LatencyInfo& latency_info) { 1497 const ui::LatencyInfo& latency_info) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 return; 1635 return;
1635 } 1636 }
1636 1637
1637 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1638 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1638 factory->WaitSyncPoint(frame->gl_frame_data->sync_point); 1639 factory->WaitSyncPoint(frame->gl_frame_data->sync_point);
1639 1640
1640 std::string mailbox_name( 1641 std::string mailbox_name(
1641 reinterpret_cast<const char*>(frame->gl_frame_data->mailbox.name), 1642 reinterpret_cast<const char*>(frame->gl_frame_data->mailbox.name),
1642 sizeof(frame->gl_frame_data->mailbox.name)); 1643 sizeof(frame->gl_frame_data->mailbox.name));
1643 BuffersSwapped(frame->gl_frame_data->size, 1644 BuffersSwapped(frame->gl_frame_data->size,
1645 frame->gl_frame_data->sub_buffer_rect,
1644 frame->metadata.device_scale_factor, 1646 frame->metadata.device_scale_factor,
1645 mailbox_name, 1647 mailbox_name,
1646 frame->metadata.latency_info, 1648 frame->metadata.latency_info,
1647 ack_callback); 1649 ack_callback);
1648 } 1650 }
1649 1651
1650 #if defined(OS_WIN) 1652 #if defined(OS_WIN)
1651 void RenderWidgetHostViewAura::SetParentNativeViewAccessible( 1653 void RenderWidgetHostViewAura::SetParentNativeViewAccessible(
1652 gfx::NativeViewAccessible accessible_parent) { 1654 gfx::NativeViewAccessible accessible_parent) {
1653 if (GetBrowserAccessibilityManager()) { 1655 if (GetBrowserAccessibilityManager()) {
1654 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin() 1656 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerWin()
1655 ->set_parent_iaccessible(accessible_parent); 1657 ->set_parent_iaccessible(accessible_parent);
1656 } 1658 }
1657 } 1659 }
1658 #endif 1660 #endif
1659 1661
1660 void RenderWidgetHostViewAura::BuffersSwapped( 1662 void RenderWidgetHostViewAura::BuffersSwapped(
1661 const gfx::Size& size, 1663 const gfx::Size& surface_size,
1664 const gfx::Rect& damage_rect,
1662 float surface_scale_factor, 1665 float surface_scale_factor,
1663 const std::string& mailbox_name, 1666 const std::string& mailbox_name,
1664 const ui::LatencyInfo& latency_info, 1667 const ui::LatencyInfo& latency_info,
1665 const BufferPresentedCallback& ack_callback) { 1668 const BufferPresentedCallback& ack_callback) {
1666 scoped_refptr<ui::Texture> texture_to_return(current_surface_); 1669 scoped_refptr<ui::Texture> previous_texture(current_surface_);
1667 const gfx::Rect surface_rect = gfx::Rect(size); 1670 const gfx::Rect surface_rect = gfx::Rect(surface_size);
1668 if (!SwapBuffersPrepare(surface_rect, surface_scale_factor, surface_rect, 1671
1669 mailbox_name, ack_callback)) { 1672 if (!SwapBuffersPrepare(surface_rect,
1673 surface_scale_factor,
1674 damage_rect,
1675 mailbox_name,
1676 ack_callback)) {
1670 return; 1677 return;
1671 } 1678 }
1672 1679
1673 previous_damage_.setRect(RectToSkIRect(surface_rect));
1674 skipped_damage_.setEmpty();
1675
1676 ui::Compositor* compositor = GetCompositor();
1677 if (compositor) {
1678 gfx::Size surface_size = ConvertSizeToDIP(surface_scale_factor, size);
1679 window_->SchedulePaintInRect(gfx::Rect(surface_size));
1680 compositor->SetLatencyInfo(latency_info);
1681 }
1682
1683 if (paint_observer_)
1684 paint_observer_->OnUpdateCompositorContent();
1685
1686 SwapBuffersCompleted(ack_callback, texture_to_return);
1687 }
1688
1689 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
1690 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
1691 int gpu_host_id) {
1692 scoped_refptr<ui::Texture> previous_texture(current_surface_);
1693 const gfx::Rect surface_rect =
1694 gfx::Rect(params_in_pixel.surface_size);
1695 gfx::Rect damage_rect(params_in_pixel.x,
1696 params_in_pixel.y,
1697 params_in_pixel.width,
1698 params_in_pixel.height);
1699 BufferPresentedCallback ack_callback = base::Bind(
1700 &AcknowledgeBufferForGpu, params_in_pixel.route_id, gpu_host_id,
1701 params_in_pixel.mailbox_name);
1702
1703 if (!SwapBuffersPrepare(
1704 surface_rect, params_in_pixel.surface_scale_factor, damage_rect,
1705 params_in_pixel.mailbox_name, ack_callback)) {
1706 return;
1707 }
1708
1709 SkRegion damage(RectToSkIRect(damage_rect)); 1680 SkRegion damage(RectToSkIRect(damage_rect));
1710 if (!skipped_damage_.isEmpty()) { 1681 if (!skipped_damage_.isEmpty()) {
1711 damage.op(skipped_damage_, SkRegion::kUnion_Op); 1682 damage.op(skipped_damage_, SkRegion::kUnion_Op);
1712 skipped_damage_.setEmpty(); 1683 skipped_damage_.setEmpty();
1713 } 1684 }
1714 1685
1715 DCHECK(surface_rect.Contains(SkIRectToRect(damage.getBounds()))); 1686 DCHECK(surface_rect.Contains(SkIRectToRect(damage.getBounds())));
1716 ui::Texture* current_texture = current_surface_.get(); 1687 ui::Texture* current_texture = current_surface_.get();
1717 1688
1718 const gfx::Size surface_size_in_pixel = params_in_pixel.surface_size; 1689 const gfx::Size surface_size_in_pixel = surface_size;
1719 DLOG_IF(ERROR, previous_texture && 1690 DLOG_IF(ERROR, previous_texture &&
1720 previous_texture->size() != current_texture->size() && 1691 previous_texture->size() != current_texture->size() &&
1721 SkIRectToRect(damage.getBounds()) != surface_rect) << 1692 SkIRectToRect(damage.getBounds()) != surface_rect) <<
1722 "Expected full damage rect after size change"; 1693 "Expected full damage rect after size change";
1723 if (previous_texture && !previous_damage_.isEmpty() && 1694 if (previous_texture && !previous_damage_.isEmpty() &&
1724 previous_texture->size() == current_texture->size()) { 1695 previous_texture->size() == current_texture->size()) {
1725 ImageTransportFactory* factory = ImageTransportFactory::GetInstance(); 1696 ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
1726 GLHelper* gl_helper = factory->GetGLHelper(); 1697 GLHelper* gl_helper = factory->GetGLHelper();
1727 gl_helper->CopySubBufferDamage( 1698 gl_helper->CopySubBufferDamage(
1728 current_texture->PrepareTexture(), 1699 current_texture->PrepareTexture(),
1729 previous_texture->PrepareTexture(), 1700 previous_texture->PrepareTexture(),
1730 damage, 1701 damage,
1731 previous_damage_); 1702 previous_damage_);
1732 } 1703 }
1733 previous_damage_ = damage; 1704 previous_damage_ = damage;
1734 1705
1735 ui::Compositor* compositor = GetCompositor(); 1706 ui::Compositor* compositor = GetCompositor();
1736 if (compositor) { 1707 if (compositor) {
1737 // Co-ordinates come in OpenGL co-ordinate space. 1708 // Co-ordinates come in OpenGL co-ordinate space.
1738 // We need to convert to layer space. 1709 // We need to convert to layer space.
1739 gfx::Rect rect_to_paint = ConvertRectToDIP( 1710 gfx::Rect rect_to_paint =
1740 params_in_pixel.surface_scale_factor, 1711 ConvertRectToDIP(surface_scale_factor,
1741 gfx::Rect(params_in_pixel.x, 1712 gfx::Rect(damage_rect.x(),
1742 surface_size_in_pixel.height() - params_in_pixel.y - 1713 surface_size_in_pixel.height() -
1743 params_in_pixel.height, 1714 damage_rect.y() - damage_rect.height(),
1744 params_in_pixel.width, 1715 damage_rect.width(),
1745 params_in_pixel.height)); 1716 damage_rect.height()));
1746 1717
1747 // Damage may not have been DIP aligned, so inflate damage to compensate 1718 // Damage may not have been DIP aligned, so inflate damage to compensate
1748 // for any round-off error. 1719 // for any round-off error.
1749 rect_to_paint.Inset(-1, -1); 1720 rect_to_paint.Inset(-1, -1);
1750 rect_to_paint.Intersect(window_->bounds()); 1721 rect_to_paint.Intersect(window_->bounds());
1751 1722
1752 if (paint_observer_) 1723 if (paint_observer_)
1753 paint_observer_->OnUpdateCompositorContent(); 1724 paint_observer_->OnUpdateCompositorContent();
1754 window_->SchedulePaintInRect(rect_to_paint); 1725 window_->SchedulePaintInRect(rect_to_paint);
1755 compositor->SetLatencyInfo(params_in_pixel.latency_info); 1726 compositor->SetLatencyInfo(latency_info);
1756 } 1727 }
1757 1728
1758 SwapBuffersCompleted(ack_callback, previous_texture); 1729 SwapBuffersCompleted(ack_callback, previous_texture);
1759 } 1730 }
1760 1731
1732 void RenderWidgetHostViewAura::AcceleratedSurfacePostSubBuffer(
1733 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params_in_pixel,
1734 int gpu_host_id) {
1735 gfx::Rect damage_rect(params_in_pixel.x,
1736 params_in_pixel.y,
1737 params_in_pixel.width,
1738 params_in_pixel.height);
1739 BufferPresentedCallback ack_callback =
1740 base::Bind(&AcknowledgeBufferForGpu,
1741 params_in_pixel.route_id,
1742 gpu_host_id,
1743 params_in_pixel.mailbox_name);
1744 BuffersSwapped(params_in_pixel.surface_size,
1745 damage_rect,
1746 params_in_pixel.surface_scale_factor,
1747 params_in_pixel.mailbox_name,
1748 params_in_pixel.latency_info,
1749 ack_callback);
1750 }
1751
1761 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() { 1752 void RenderWidgetHostViewAura::AcceleratedSurfaceSuspend() {
1762 } 1753 }
1763 1754
1764 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() { 1755 void RenderWidgetHostViewAura::AcceleratedSurfaceRelease() {
1765 // This really tells us to release the frontbuffer. 1756 // This really tells us to release the frontbuffer.
1766 if (current_surface_) { 1757 if (current_surface_) {
1767 ui::Compositor* compositor = GetCompositor(); 1758 ui::Compositor* compositor = GetCompositor();
1768 if (compositor) { 1759 if (compositor) {
1769 // We need to wait for a commit to clear to guarantee that all we 1760 // We need to wait for a commit to clear to guarantee that all we
1770 // will not issue any more GL referencing the previous surface. 1761 // will not issue any more GL referencing the previous surface.
(...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after
3038 RenderWidgetHost* widget) { 3029 RenderWidgetHost* widget) {
3039 return new RenderWidgetHostViewAura(widget); 3030 return new RenderWidgetHostViewAura(widget);
3040 } 3031 }
3041 3032
3042 // static 3033 // static
3043 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) { 3034 void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebScreenInfo* results) {
3044 GetScreenInfoForWindow(results, NULL); 3035 GetScreenInfoForWindow(results, NULL);
3045 } 3036 }
3046 3037
3047 } // namespace content 3038 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.h ('k') | content/common/cc_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698