OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> |
8 | 9 |
9 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
10 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
11 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
12 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
13 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
14 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
15 #include "cc/animation/scrollbar_animation_controller.h" | 16 #include "cc/animation/scrollbar_animation_controller.h" |
16 #include "cc/animation/timing_function.h" | 17 #include "cc/animation/timing_function.h" |
17 #include "cc/base/math_util.h" | 18 #include "cc/base/math_util.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 "LayerTreeHostImpl::SetVisible", | 63 "LayerTreeHostImpl::SetVisible", |
63 id, | 64 id, |
64 "LayerTreeHostImpl", | 65 "LayerTreeHostImpl", |
65 id); | 66 id); |
66 return; | 67 return; |
67 } | 68 } |
68 | 69 |
69 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); | 70 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); |
70 } | 71 } |
71 | 72 |
| 73 size_t GetMaxTransferBufferUsageBytes(cc::ContextProvider* context_provider) { |
| 74 if (context_provider) { |
| 75 // We want to make sure the default transfer buffer size is equal to the |
| 76 // amount of data that can be uploaded by the compositor to avoid stalling |
| 77 // the pipeline. |
| 78 // For reference Chromebook Pixel can upload 1MB in about 0.5ms. |
| 79 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2; |
| 80 // Assuming a two frame deep pipeline between CPU and GPU and we are |
| 81 // drawing 60 frames per second which would require us to draw one |
| 82 // frame in 16 milliseconds. |
| 83 const size_t kMaxTransferBufferUsageBytes = 16 * 2 * kMaxBytesUploadedPerMs; |
| 84 return std::min( |
| 85 context_provider->ContextCapabilities().max_transfer_buffer_usage_bytes, |
| 86 kMaxTransferBufferUsageBytes); |
| 87 } else { |
| 88 // Software compositing should not use this value in production. Just use a |
| 89 // default value when testing uploads with the software compositor. |
| 90 return std::numeric_limits<size_t>::max(); |
| 91 } |
| 92 } |
| 93 |
72 } // namespace | 94 } // namespace |
73 | 95 |
74 namespace cc { | 96 namespace cc { |
75 | 97 |
76 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient { | 98 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient { |
77 public: | 99 public: |
78 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create( | 100 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create( |
79 LayerTreeHostImpl* layer_tree_host_impl, | 101 LayerTreeHostImpl* layer_tree_host_impl, |
80 scoped_refptr<DelayBasedTimeSource> time_source) { | 102 scoped_refptr<DelayBasedTimeSource> time_source) { |
81 return make_scoped_ptr( | 103 return make_scoped_ptr( |
(...skipping 1505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1587 } | 1609 } |
1588 | 1610 |
1589 if (renderer_) { | 1611 if (renderer_) { |
1590 renderer_->SetVisible(visible_); | 1612 renderer_->SetVisible(visible_); |
1591 SetFullRootLayerDamage(); | 1613 SetFullRootLayerDamage(); |
1592 } | 1614 } |
1593 } | 1615 } |
1594 | 1616 |
1595 void LayerTreeHostImpl::CreateAndSetTileManager( | 1617 void LayerTreeHostImpl::CreateAndSetTileManager( |
1596 ResourceProvider* resource_provider, | 1618 ResourceProvider* resource_provider, |
| 1619 ContextProvider* context_provider, |
1597 bool using_map_image) { | 1620 bool using_map_image) { |
1598 DCHECK(settings_.impl_side_painting); | 1621 DCHECK(settings_.impl_side_painting); |
1599 DCHECK(resource_provider); | 1622 DCHECK(resource_provider); |
1600 tile_manager_ = TileManager::Create(this, | 1623 tile_manager_ = |
1601 resource_provider, | 1624 TileManager::Create(this, |
1602 settings_.num_raster_threads, | 1625 resource_provider, |
1603 rendering_stats_instrumentation_, | 1626 settings_.num_raster_threads, |
1604 using_map_image); | 1627 rendering_stats_instrumentation_, |
| 1628 using_map_image, |
| 1629 GetMaxTransferBufferUsageBytes(context_provider)); |
| 1630 |
1605 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1631 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1606 need_to_update_visible_tiles_before_draw_ = false; | 1632 need_to_update_visible_tiles_before_draw_ = false; |
1607 } | 1633 } |
1608 | 1634 |
1609 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { | 1635 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { |
1610 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); | 1636 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); |
1611 } | 1637 } |
1612 | 1638 |
1613 bool LayerTreeHostImpl::InitializeRenderer( | 1639 bool LayerTreeHostImpl::InitializeRenderer( |
1614 scoped_ptr<OutputSurface> output_surface) { | 1640 scoped_ptr<OutputSurface> output_surface) { |
(...skipping 23 matching lines...) Expand all Loading... |
1638 | 1664 |
1639 bool skip_gl_renderer = false; | 1665 bool skip_gl_renderer = false; |
1640 CreateAndSetRenderer( | 1666 CreateAndSetRenderer( |
1641 output_surface.get(), resource_provider.get(), skip_gl_renderer); | 1667 output_surface.get(), resource_provider.get(), skip_gl_renderer); |
1642 | 1668 |
1643 if (!renderer_) | 1669 if (!renderer_) |
1644 return false; | 1670 return false; |
1645 | 1671 |
1646 if (settings_.impl_side_painting) { | 1672 if (settings_.impl_side_painting) { |
1647 CreateAndSetTileManager(resource_provider.get(), | 1673 CreateAndSetTileManager(resource_provider.get(), |
| 1674 output_surface->context_provider().get(), |
1648 GetRendererCapabilities().using_map_image); | 1675 GetRendererCapabilities().using_map_image); |
1649 } | 1676 } |
1650 | 1677 |
1651 // Setup BeginFrameEmulation if it's not supported natively | 1678 // Setup BeginFrameEmulation if it's not supported natively |
1652 if (!settings_.begin_frame_scheduling_enabled) { | 1679 if (!settings_.begin_frame_scheduling_enabled) { |
1653 const base::TimeDelta display_refresh_interval = | 1680 const base::TimeDelta display_refresh_interval = |
1654 base::TimeDelta::FromMicroseconds( | 1681 base::TimeDelta::FromMicroseconds( |
1655 base::Time::kMicrosecondsPerSecond / | 1682 base::Time::kMicrosecondsPerSecond / |
1656 settings_.refresh_rate); | 1683 settings_.refresh_rate); |
1657 | 1684 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1750 tile_manager_.reset(); | 1777 tile_manager_.reset(); |
1751 resource_provider_->InitializeSoftware(); | 1778 resource_provider_->InitializeSoftware(); |
1752 | 1779 |
1753 bool skip_gl_renderer = true; | 1780 bool skip_gl_renderer = true; |
1754 CreateAndSetRenderer( | 1781 CreateAndSetRenderer( |
1755 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); | 1782 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); |
1756 DCHECK(renderer_); | 1783 DCHECK(renderer_); |
1757 | 1784 |
1758 EnforceZeroBudget(true); | 1785 EnforceZeroBudget(true); |
1759 CreateAndSetTileManager(resource_provider_.get(), | 1786 CreateAndSetTileManager(resource_provider_.get(), |
| 1787 NULL, |
1760 GetRendererCapabilities().using_map_image); | 1788 GetRendererCapabilities().using_map_image); |
1761 DCHECK(tile_manager_); | 1789 DCHECK(tile_manager_); |
1762 | 1790 |
1763 SetOffscreenContextProvider(NULL); | 1791 SetOffscreenContextProvider(NULL); |
1764 | 1792 |
1765 client_->SetNeedsCommitOnImplThread(); | 1793 client_->SetNeedsCommitOnImplThread(); |
1766 } | 1794 } |
1767 | 1795 |
1768 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { | 1796 void LayerTreeHostImpl::SetViewportSize(gfx::Size device_viewport_size) { |
1769 if (device_viewport_size == device_viewport_size_) | 1797 if (device_viewport_size == device_viewport_size_) |
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2577 | 2605 |
2578 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( | 2606 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( |
2579 UIResourceId uid) const { | 2607 UIResourceId uid) const { |
2580 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); | 2608 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); |
2581 if (iter != ui_resource_map_.end()) | 2609 if (iter != ui_resource_map_.end()) |
2582 return iter->second; | 2610 return iter->second; |
2583 return 0; | 2611 return 0; |
2584 } | 2612 } |
2585 | 2613 |
2586 } // namespace cc | 2614 } // namespace cc |
OLD | NEW |