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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 602493003: cc: Add BitmapRasterWorkerPool. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@reduce-transfer-buffer-limit-use
Patch Set: Created 6 years, 2 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
OLDNEW
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 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 28 matching lines...) Expand all
39 #include "cc/layers/scrollbar_layer_impl_base.h" 39 #include "cc/layers/scrollbar_layer_impl_base.h"
40 #include "cc/output/compositor_frame_metadata.h" 40 #include "cc/output/compositor_frame_metadata.h"
41 #include "cc/output/copy_output_request.h" 41 #include "cc/output/copy_output_request.h"
42 #include "cc/output/delegating_renderer.h" 42 #include "cc/output/delegating_renderer.h"
43 #include "cc/output/gl_renderer.h" 43 #include "cc/output/gl_renderer.h"
44 #include "cc/output/software_renderer.h" 44 #include "cc/output/software_renderer.h"
45 #include "cc/quads/render_pass_draw_quad.h" 45 #include "cc/quads/render_pass_draw_quad.h"
46 #include "cc/quads/shared_quad_state.h" 46 #include "cc/quads/shared_quad_state.h"
47 #include "cc/quads/solid_color_draw_quad.h" 47 #include "cc/quads/solid_color_draw_quad.h"
48 #include "cc/quads/texture_draw_quad.h" 48 #include "cc/quads/texture_draw_quad.h"
49 #include "cc/resources/bitmap_raster_worker_pool.h"
49 #include "cc/resources/eviction_tile_priority_queue.h" 50 #include "cc/resources/eviction_tile_priority_queue.h"
50 #include "cc/resources/gpu_raster_worker_pool.h" 51 #include "cc/resources/gpu_raster_worker_pool.h"
51 #include "cc/resources/memory_history.h" 52 #include "cc/resources/memory_history.h"
52 #include "cc/resources/one_copy_raster_worker_pool.h" 53 #include "cc/resources/one_copy_raster_worker_pool.h"
53 #include "cc/resources/picture_layer_tiling.h" 54 #include "cc/resources/picture_layer_tiling.h"
54 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 55 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
55 #include "cc/resources/prioritized_resource_manager.h" 56 #include "cc/resources/prioritized_resource_manager.h"
56 #include "cc/resources/raster_tile_priority_queue.h" 57 #include "cc/resources/raster_tile_priority_queue.h"
57 #include "cc/resources/raster_worker_pool.h" 58 #include "cc/resources/raster_worker_pool.h"
58 #include "cc/resources/resource_pool.h" 59 #include "cc/resources/resource_pool.h"
(...skipping 25 matching lines...) Expand all
84 "LayerTreeHostImpl", 85 "LayerTreeHostImpl",
85 id); 86 id);
86 return; 87 return;
87 } 88 }
88 89
89 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); 90 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id);
90 } 91 }
91 92
92 size_t GetMaxTransferBufferUsageBytes(cc::ContextProvider* context_provider, 93 size_t GetMaxTransferBufferUsageBytes(cc::ContextProvider* context_provider,
93 double refresh_rate) { 94 double refresh_rate) {
94 // Software compositing should not use this value in production. Just use a
95 // default value when testing uploads with the software compositor.
96 if (!context_provider)
vmpstr 2014/09/24 16:31:51 Can you instead DCHECK(context_provider)
reveman 2014/09/24 17:25:27 I think it was always awkward that we could pass N
97 return std::numeric_limits<size_t>::max();
98
99 // We want to make sure the default transfer buffer size is equal to the 95 // We want to make sure the default transfer buffer size is equal to the
100 // amount of data that can be uploaded by the compositor to avoid stalling 96 // amount of data that can be uploaded by the compositor to avoid stalling
101 // the pipeline. 97 // the pipeline.
102 // For reference Chromebook Pixel can upload 1MB in about 0.5ms. 98 // For reference Chromebook Pixel can upload 1MB in about 0.5ms.
103 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2; 99 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2;
104 100
105 // We need to upload at least enough work to keep the GPU process busy until 101 // We need to upload at least enough work to keep the GPU process busy until
106 // the next time it can handle a request to start more uploads from the 102 // the next time it can handle a request to start more uploads from the
107 // compositor. We assume that it will pick up any sent upload requests within 103 // compositor. We assume that it will pick up any sent upload requests within
108 // the time of a vsync, since the browser will want to swap a frame within 104 // the time of a vsync, since the browser will want to swap a frame within
109 // that time interval, and then uploads should have a chance to be processed. 105 // that time interval, and then uploads should have a chance to be processed.
110 size_t ms_per_frame = std::floor(1000.0 / refresh_rate); 106 size_t ms_per_frame = std::floor(1000.0 / refresh_rate);
111 size_t max_transfer_buffer_usage_bytes = 107 size_t max_transfer_buffer_usage_bytes =
112 ms_per_frame * kMaxBytesUploadedPerMs; 108 ms_per_frame * kMaxBytesUploadedPerMs;
113 109
114 // The context may request a lower limit based on the device capabilities. 110 // The context may request a lower limit based on the device capabilities.
115 return std::min( 111 return std::min(
116 context_provider->ContextCapabilities().max_transfer_buffer_usage_bytes, 112 context_provider->ContextCapabilities().max_transfer_buffer_usage_bytes,
117 max_transfer_buffer_usage_bytes); 113 max_transfer_buffer_usage_bytes);
118 } 114 }
119 115
120 unsigned GetMapImageTextureTarget(cc::ContextProvider* context_provider) { 116 unsigned GetMapImageTextureTarget(cc::ContextProvider* context_provider) {
121 if (!context_provider)
vmpstr 2014/09/24 16:31:51 Same here.
reveman 2014/09/24 17:25:27 Same reply as above.
122 return GL_TEXTURE_2D;
123
124 if (context_provider->ContextCapabilities().gpu.egl_image_external) 117 if (context_provider->ContextCapabilities().gpu.egl_image_external)
125 return GL_TEXTURE_EXTERNAL_OES; 118 return GL_TEXTURE_EXTERNAL_OES;
126 if (context_provider->ContextCapabilities().gpu.texture_rectangle) 119 if (context_provider->ContextCapabilities().gpu.texture_rectangle)
127 return GL_TEXTURE_RECTANGLE_ARB; 120 return GL_TEXTURE_RECTANGLE_ARB;
128 121
129 return GL_TEXTURE_2D; 122 return GL_TEXTURE_2D;
130 } 123 }
131 124
132 size_t GetMaxStagingResourceCount() { 125 size_t GetMaxStagingResourceCount() {
133 // Upper bound for number of staging resource to allow. 126 // Upper bound for number of staging resource to allow.
(...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after
1986 ResourcePool::Create(resource_provider_.get(), 1979 ResourcePool::Create(resource_provider_.get(),
1987 GL_TEXTURE_2D, 1980 GL_TEXTURE_2D,
1988 resource_provider_->best_texture_format()); 1981 resource_provider_->best_texture_format());
1989 1982
1990 raster_worker_pool_ = 1983 raster_worker_pool_ =
1991 OneCopyRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), 1984 OneCopyRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
1992 RasterWorkerPool::GetTaskGraphRunner(), 1985 RasterWorkerPool::GetTaskGraphRunner(),
1993 context_provider, 1986 context_provider,
1994 resource_provider_.get(), 1987 resource_provider_.get(),
1995 staging_resource_pool_.get()); 1988 staging_resource_pool_.get());
1996 } else if (!UseZeroCopyRasterizer() && context_provider) { 1989 } else if (UseZeroCopyRasterizer() && context_provider) {
vmpstr 2014/09/24 16:31:51 I think this whole if/else if sequence is better w
reveman 2014/09/24 17:25:27 Yes, much better. Done.
1990 resource_pool_ =
1991 ResourcePool::Create(resource_provider_.get(),
1992 GetMapImageTextureTarget(context_provider),
1993 resource_provider_->best_texture_format());
1994
1995 raster_worker_pool_ =
1996 ZeroCopyRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
1997 RasterWorkerPool::GetTaskGraphRunner(),
1998 resource_provider_.get());
1999 } else if (context_provider) {
1997 resource_pool_ = ResourcePool::Create( 2000 resource_pool_ = ResourcePool::Create(
1998 resource_provider_.get(), 2001 resource_provider_.get(),
1999 GL_TEXTURE_2D, 2002 GL_TEXTURE_2D,
2000 resource_provider_->memory_efficient_texture_format()); 2003 resource_provider_->memory_efficient_texture_format());
2001 2004
2002 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( 2005 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
2003 proxy_->ImplThreadTaskRunner(), 2006 proxy_->ImplThreadTaskRunner(),
2004 RasterWorkerPool::GetTaskGraphRunner(), 2007 RasterWorkerPool::GetTaskGraphRunner(),
2005 context_provider, 2008 context_provider,
2006 resource_provider_.get(), 2009 resource_provider_.get(),
2007 GetMaxTransferBufferUsageBytes(context_provider, 2010 GetMaxTransferBufferUsageBytes(context_provider,
2008 settings_.refresh_rate)); 2011 settings_.refresh_rate));
2009 } else { 2012 } else {
2010 resource_pool_ = 2013 resource_pool_ =
2011 ResourcePool::Create(resource_provider_.get(), 2014 ResourcePool::Create(resource_provider_.get(),
2012 GetMapImageTextureTarget(context_provider), 2015 GL_TEXTURE_2D,
2013 resource_provider_->best_texture_format()); 2016 resource_provider_->best_texture_format());
2014 2017
2015 raster_worker_pool_ = 2018 raster_worker_pool_ =
2016 ZeroCopyRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), 2019 BitmapRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
2017 RasterWorkerPool::GetTaskGraphRunner(), 2020 RasterWorkerPool::GetTaskGraphRunner(),
2018 resource_provider_.get()); 2021 resource_provider_.get());
2019 } 2022 }
2020 2023
2021 tile_manager_ = 2024 tile_manager_ =
2022 TileManager::Create(this, 2025 TileManager::Create(this,
2023 proxy_->ImplThreadTaskRunner(), 2026 proxy_->ImplThreadTaskRunner(),
2024 resource_pool_.get(), 2027 resource_pool_.get(),
2025 raster_worker_pool_->AsRasterizer(), 2028 raster_worker_pool_->AsRasterizer(),
2026 rendering_stats_instrumentation_); 2029 rendering_stats_instrumentation_);
2027 2030
2028 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 2031 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
2029 need_to_update_visible_tiles_before_draw_ = false; 2032 need_to_update_visible_tiles_before_draw_ = false;
2030 } 2033 }
2031 2034
2032 void LayerTreeHostImpl::DestroyTileManager() { 2035 void LayerTreeHostImpl::DestroyTileManager() {
2033 tile_manager_.reset(); 2036 tile_manager_.reset();
2034 resource_pool_.reset(); 2037 resource_pool_.reset();
2035 staging_resource_pool_.reset(); 2038 staging_resource_pool_.reset();
2036 raster_worker_pool_.reset(); 2039 raster_worker_pool_.reset();
2037 } 2040 }
2038 2041
2039 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2042 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2040 // In impl-side painting, synchronize to the pending tree so that it has 2043 // In impl-side painting, synchronize to the pending tree so that it has
2041 // time to raster before being displayed. 2044 // time to raster before being displayed.
2042 return settings_.impl_side_painting; 2045 return settings_.impl_side_painting;
2043 } 2046 }
2044 2047
2045 bool LayerTreeHostImpl::UseZeroCopyRasterizer() const { 2048 bool LayerTreeHostImpl::UseZeroCopyRasterizer() const {
2046 // Note: we use zero-copy by default when the renderer is using 2049 return settings_.use_zero_copy && GetRendererCapabilities().using_map_image;
2047 // shared memory resources.
2048 return (settings_.use_zero_copy ||
2049 GetRendererCapabilities().using_shared_memory_resources) &&
2050 GetRendererCapabilities().using_map_image;
2051 } 2050 }
2052 2051
2053 bool LayerTreeHostImpl::UseOneCopyRasterizer() const { 2052 bool LayerTreeHostImpl::UseOneCopyRasterizer() const {
2054 // Sync query support is required by one-copy rasterizer. 2053 // Sync query support is required by one-copy rasterizer.
2055 return settings_.use_one_copy && GetRendererCapabilities().using_map_image && 2054 return settings_.use_one_copy && GetRendererCapabilities().using_map_image &&
2056 resource_provider_->use_sync_query(); 2055 resource_provider_->use_sync_query();
2057 } 2056 }
2058 2057
2059 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { 2058 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
2060 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); 2059 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
(...skipping 1323 matching lines...) Expand 10 before | Expand all | Expand 10 after
3384 } 3383 }
3385 3384
3386 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3385 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3387 std::vector<PictureLayerImpl*>::iterator it = 3386 std::vector<PictureLayerImpl*>::iterator it =
3388 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3387 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3389 DCHECK(it != picture_layers_.end()); 3388 DCHECK(it != picture_layers_.end());
3390 picture_layers_.erase(it); 3389 picture_layers_.erase(it);
3391 } 3390 }
3392 3391
3393 } // namespace cc 3392 } // namespace cc
OLDNEW
« cc/resources/raster_worker_pool_unittest.cc ('K') | « cc/resources/resource_provider_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698