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

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

Issue 820743002: cc: GPU rasterize tiles synchronously in PrepareToDraw. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: override added :( Created 5 years, 11 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "cc/output/copy_output_request.h" 42 #include "cc/output/copy_output_request.h"
43 #include "cc/output/delegating_renderer.h" 43 #include "cc/output/delegating_renderer.h"
44 #include "cc/output/gl_renderer.h" 44 #include "cc/output/gl_renderer.h"
45 #include "cc/output/software_renderer.h" 45 #include "cc/output/software_renderer.h"
46 #include "cc/quads/render_pass_draw_quad.h" 46 #include "cc/quads/render_pass_draw_quad.h"
47 #include "cc/quads/shared_quad_state.h" 47 #include "cc/quads/shared_quad_state.h"
48 #include "cc/quads/solid_color_draw_quad.h" 48 #include "cc/quads/solid_color_draw_quad.h"
49 #include "cc/quads/texture_draw_quad.h" 49 #include "cc/quads/texture_draw_quad.h"
50 #include "cc/resources/bitmap_tile_task_worker_pool.h" 50 #include "cc/resources/bitmap_tile_task_worker_pool.h"
51 #include "cc/resources/eviction_tile_priority_queue.h" 51 #include "cc/resources/eviction_tile_priority_queue.h"
52 #include "cc/resources/gpu_rasterizer.h"
52 #include "cc/resources/gpu_tile_task_worker_pool.h" 53 #include "cc/resources/gpu_tile_task_worker_pool.h"
53 #include "cc/resources/memory_history.h" 54 #include "cc/resources/memory_history.h"
54 #include "cc/resources/one_copy_tile_task_worker_pool.h" 55 #include "cc/resources/one_copy_tile_task_worker_pool.h"
55 #include "cc/resources/picture_layer_tiling.h" 56 #include "cc/resources/picture_layer_tiling.h"
56 #include "cc/resources/pixel_buffer_tile_task_worker_pool.h" 57 #include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
57 #include "cc/resources/prioritized_resource_manager.h" 58 #include "cc/resources/prioritized_resource_manager.h"
58 #include "cc/resources/raster_tile_priority_queue.h" 59 #include "cc/resources/raster_tile_priority_queue.h"
59 #include "cc/resources/resource_pool.h" 60 #include "cc/resources/resource_pool.h"
61 #include "cc/resources/software_rasterizer.h"
60 #include "cc/resources/texture_mailbox_deleter.h" 62 #include "cc/resources/texture_mailbox_deleter.h"
61 #include "cc/resources/tile_task_worker_pool.h" 63 #include "cc/resources/tile_task_worker_pool.h"
62 #include "cc/resources/ui_resource_bitmap.h" 64 #include "cc/resources/ui_resource_bitmap.h"
63 #include "cc/resources/zero_copy_tile_task_worker_pool.h" 65 #include "cc/resources/zero_copy_tile_task_worker_pool.h"
64 #include "cc/scheduler/delay_based_time_source.h" 66 #include "cc/scheduler/delay_based_time_source.h"
65 #include "cc/trees/damage_tracker.h" 67 #include "cc/trees/damage_tracker.h"
66 #include "cc/trees/layer_tree_host.h" 68 #include "cc/trees/layer_tree_host.h"
67 #include "cc/trees/layer_tree_host_common.h" 69 #include "cc/trees/layer_tree_host_common.h"
68 #include "cc/trees/layer_tree_impl.h" 70 #include "cc/trees/layer_tree_impl.h"
69 #include "cc/trees/occlusion_tracker.h" 71 #include "cc/trees/occlusion_tracker.h"
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 } 1054 }
1053 1055
1054 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { 1056 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
1055 TRACE_EVENT1("cc", 1057 TRACE_EVENT1("cc",
1056 "LayerTreeHostImpl::PrepareToDraw", 1058 "LayerTreeHostImpl::PrepareToDraw",
1057 "SourceFrameNumber", 1059 "SourceFrameNumber",
1058 active_tree_->source_frame_number()); 1060 active_tree_->source_frame_number());
1059 if (input_handler_client_) 1061 if (input_handler_client_)
1060 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); 1062 input_handler_client_->ReconcileElasticOverscrollAndRootScroll();
1061 1063
1062 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1063 // that completed, which will add damage to the frame for them so they appear
1064 // as part of the current frame being drawn.
1065 if (settings().impl_side_painting)
1066 tile_manager_->UpdateVisibleTiles();
1067
1068 UMA_HISTOGRAM_CUSTOM_COUNTS( 1064 UMA_HISTOGRAM_CUSTOM_COUNTS(
1069 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); 1065 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20);
1070 1066
1071 bool ok = active_tree_->UpdateDrawProperties(); 1067 bool ok = active_tree_->UpdateDrawProperties();
1072 DCHECK(ok) << "UpdateDrawProperties failed during draw"; 1068 DCHECK(ok) << "UpdateDrawProperties failed during draw";
1073 1069
1070 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1071 // that completed, which will add damage to the frame for them so they appear
1072 // as part of the current frame being drawn.
1073 if (settings().impl_side_painting)
1074 tile_manager_->UpdateVisibleTiles(global_tile_state_);
1075
1074 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1076 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1075 frame->render_passes.clear(); 1077 frame->render_passes.clear();
1076 frame->render_passes_by_id.clear(); 1078 frame->render_passes_by_id.clear();
1077 frame->will_draw_layers.clear(); 1079 frame->will_draw_layers.clear();
1078 frame->has_no_damage = false; 1080 frame->has_no_damage = false;
1079 1081
1080 if (active_tree_->root_layer()) { 1082 if (active_tree_->root_layer()) {
1081 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; 1083 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1082 viewport_damage_rect_ = gfx::Rect(); 1084 viewport_damage_rect_ = gfx::Rect();
1083 1085
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after
1956 pending_tree_->set_needs_update_draw_properties(); 1958 pending_tree_->set_needs_update_draw_properties();
1957 client_->UpdateRendererCapabilitiesOnImplThread(); 1959 client_->UpdateRendererCapabilitiesOnImplThread();
1958 } 1960 }
1959 1961
1960 void LayerTreeHostImpl::CreateAndSetTileManager() { 1962 void LayerTreeHostImpl::CreateAndSetTileManager() {
1961 DCHECK(!tile_manager_); 1963 DCHECK(!tile_manager_);
1962 DCHECK(settings_.impl_side_painting); 1964 DCHECK(settings_.impl_side_painting);
1963 DCHECK(output_surface_); 1965 DCHECK(output_surface_);
1964 DCHECK(resource_provider_); 1966 DCHECK(resource_provider_);
1965 1967
1968 rasterizer_ = CreateRasterizer();
1966 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, 1969 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_,
1967 &staging_resource_pool_); 1970 &staging_resource_pool_);
1968 DCHECK(tile_task_worker_pool_); 1971 DCHECK(tile_task_worker_pool_);
1969 DCHECK(resource_pool_); 1972 DCHECK(resource_pool_);
1970 1973
1971 base::SingleThreadTaskRunner* task_runner = 1974 base::SingleThreadTaskRunner* task_runner =
1972 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1975 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1973 : proxy_->MainThreadTaskRunner(); 1976 : proxy_->MainThreadTaskRunner();
1974 DCHECK(task_runner); 1977 DCHECK(task_runner);
1975 size_t scheduled_raster_task_limit = 1978 size_t scheduled_raster_task_limit =
1976 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() 1979 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max()
1977 : settings_.scheduled_raster_task_limit; 1980 : settings_.scheduled_raster_task_limit;
1978 tile_manager_ = TileManager::Create( 1981 tile_manager_ =
1979 this, task_runner, resource_pool_.get(), 1982 TileManager::Create(this, task_runner, resource_pool_.get(),
1980 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); 1983 tile_task_worker_pool_->AsTileTaskRunner(),
1984 rasterizer_.get(), scheduled_raster_task_limit);
1981 1985
1982 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 1986 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1983 } 1987 }
1984 1988
1989 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() {
1990 ContextProvider* context_provider = output_surface_->context_provider();
1991 if (use_gpu_rasterization_ && context_provider) {
1992 return GpuRasterizer::Create(context_provider, resource_provider_.get(),
1993 settings_.use_distance_field_text, false);
1994 }
1995 return SoftwareRasterizer::Create();
1996 }
1997
1985 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( 1998 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
1986 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, 1999 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
1987 scoped_ptr<ResourcePool>* resource_pool, 2000 scoped_ptr<ResourcePool>* resource_pool,
1988 scoped_ptr<ResourcePool>* staging_resource_pool) { 2001 scoped_ptr<ResourcePool>* staging_resource_pool) {
1989 base::SingleThreadTaskRunner* task_runner = 2002 base::SingleThreadTaskRunner* task_runner =
1990 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 2003 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1991 : proxy_->MainThreadTaskRunner(); 2004 : proxy_->MainThreadTaskRunner();
1992 DCHECK(task_runner); 2005 DCHECK(task_runner);
1993 2006
1994 ContextProvider* context_provider = output_surface_->context_provider(); 2007 ContextProvider* context_provider = output_surface_->context_provider();
1995 if (!context_provider) { 2008 if (!context_provider) {
1996 *resource_pool = 2009 *resource_pool =
1997 ResourcePool::Create(resource_provider_.get(), 2010 ResourcePool::Create(resource_provider_.get(),
1998 GL_TEXTURE_2D, 2011 GL_TEXTURE_2D,
1999 resource_provider_->best_texture_format()); 2012 resource_provider_->best_texture_format());
2000 2013
2001 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( 2014 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
2002 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), 2015 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
2003 resource_provider_.get()); 2016 resource_provider_.get());
2004 return; 2017 return;
2005 } 2018 }
2006 2019
2007 if (use_gpu_rasterization_) { 2020 if (use_gpu_rasterization_) {
2008 *resource_pool = 2021 *resource_pool =
2009 ResourcePool::Create(resource_provider_.get(), 2022 ResourcePool::Create(resource_provider_.get(),
2010 GL_TEXTURE_2D, 2023 GL_TEXTURE_2D,
2011 resource_provider_->best_texture_format()); 2024 resource_provider_->best_texture_format());
2012 2025
2013 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( 2026 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
2014 task_runner, context_provider, resource_provider_.get(), 2027 task_runner, TileTaskWorkerPool::GetTaskGraphRunner());
2015 settings_.use_distance_field_text);
2016 return; 2028 return;
2017 } 2029 }
2018 2030
2019 if (GetRendererCapabilities().using_image) { 2031 if (GetRendererCapabilities().using_image) {
2020 unsigned image_target = settings_.use_image_texture_target; 2032 unsigned image_target = settings_.use_image_texture_target;
2021 DCHECK_IMPLIES( 2033 DCHECK_IMPLIES(
2022 image_target == GL_TEXTURE_RECTANGLE_ARB, 2034 image_target == GL_TEXTURE_RECTANGLE_ARB,
2023 context_provider->ContextCapabilities().gpu.texture_rectangle); 2035 context_provider->ContextCapabilities().gpu.texture_rectangle);
2024 DCHECK_IMPLIES( 2036 DCHECK_IMPLIES(
2025 image_target == GL_TEXTURE_EXTERNAL_OES, 2037 image_target == GL_TEXTURE_EXTERNAL_OES,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 resource_provider_.get(), 2082 resource_provider_.get(),
2071 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), 2083 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
2072 settings_.renderer_settings.refresh_rate)); 2084 settings_.renderer_settings.refresh_rate));
2073 } 2085 }
2074 2086
2075 void LayerTreeHostImpl::DestroyTileManager() { 2087 void LayerTreeHostImpl::DestroyTileManager() {
2076 tile_manager_ = nullptr; 2088 tile_manager_ = nullptr;
2077 resource_pool_ = nullptr; 2089 resource_pool_ = nullptr;
2078 staging_resource_pool_ = nullptr; 2090 staging_resource_pool_ = nullptr;
2079 tile_task_worker_pool_ = nullptr; 2091 tile_task_worker_pool_ = nullptr;
2092 rasterizer_ = nullptr;
2080 single_thread_synchronous_task_graph_runner_ = nullptr; 2093 single_thread_synchronous_task_graph_runner_ = nullptr;
2081 } 2094 }
2082 2095
2083 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2096 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2084 // In impl-side painting, synchronize to the pending tree so that it has 2097 // In impl-side painting, synchronize to the pending tree so that it has
2085 // time to raster before being displayed. 2098 // time to raster before being displayed.
2086 return settings_.impl_side_painting; 2099 return settings_.impl_side_painting;
2087 } 2100 }
2088 2101
2089 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2102 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after
3488 } 3501 }
3489 3502
3490 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3503 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3491 std::vector<PictureLayerImpl*>::iterator it = 3504 std::vector<PictureLayerImpl*>::iterator it =
3492 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3505 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3493 DCHECK(it != picture_layers_.end()); 3506 DCHECK(it != picture_layers_.end());
3494 picture_layers_.erase(it); 3507 picture_layers_.erase(it);
3495 } 3508 }
3496 3509
3497 } // namespace cc 3510 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698