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

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: address review comments 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
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 980 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 } 1052 }
1051 1053
1052 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { 1054 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
1053 TRACE_EVENT1("cc", 1055 TRACE_EVENT1("cc",
1054 "LayerTreeHostImpl::PrepareToDraw", 1056 "LayerTreeHostImpl::PrepareToDraw",
1055 "SourceFrameNumber", 1057 "SourceFrameNumber",
1056 active_tree_->source_frame_number()); 1058 active_tree_->source_frame_number());
1057 if (input_handler_client_) 1059 if (input_handler_client_)
1058 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); 1060 input_handler_client_->ReconcileElasticOverscrollAndRootScroll();
1059 1061
1060 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1061 // that completed, which will add damage to the frame for them so they appear
1062 // as part of the current frame being drawn.
1063 if (settings().impl_side_painting)
1064 tile_manager_->UpdateVisibleTiles();
1065
1066 UMA_HISTOGRAM_CUSTOM_COUNTS( 1062 UMA_HISTOGRAM_CUSTOM_COUNTS(
1067 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); 1063 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20);
1068 1064
1069 bool ok = active_tree_->UpdateDrawProperties(); 1065 bool ok = active_tree_->UpdateDrawProperties();
1070 DCHECK(ok) << "UpdateDrawProperties failed during draw"; 1066 DCHECK(ok) << "UpdateDrawProperties failed during draw";
1071 1067
1068 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1069 // that completed, which will add damage to the frame for them so they appear
1070 // as part of the current frame being drawn.
1071 if (settings().impl_side_painting)
1072 tile_manager_->UpdateVisibleTiles(global_tile_state_);
1073
1072 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1074 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1073 frame->render_passes.clear(); 1075 frame->render_passes.clear();
1074 frame->render_passes_by_id.clear(); 1076 frame->render_passes_by_id.clear();
1075 frame->will_draw_layers.clear(); 1077 frame->will_draw_layers.clear();
1076 frame->has_no_damage = false; 1078 frame->has_no_damage = false;
1077 1079
1078 if (active_tree_->root_layer()) { 1080 if (active_tree_->root_layer()) {
1079 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; 1081 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1080 viewport_damage_rect_ = gfx::Rect(); 1082 viewport_damage_rect_ = gfx::Rect();
1081 1083
(...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 pending_tree_->set_needs_update_draw_properties(); 1951 pending_tree_->set_needs_update_draw_properties();
1950 client_->UpdateRendererCapabilitiesOnImplThread(); 1952 client_->UpdateRendererCapabilitiesOnImplThread();
1951 } 1953 }
1952 1954
1953 void LayerTreeHostImpl::CreateAndSetTileManager() { 1955 void LayerTreeHostImpl::CreateAndSetTileManager() {
1954 DCHECK(!tile_manager_); 1956 DCHECK(!tile_manager_);
1955 DCHECK(settings_.impl_side_painting); 1957 DCHECK(settings_.impl_side_painting);
1956 DCHECK(output_surface_); 1958 DCHECK(output_surface_);
1957 DCHECK(resource_provider_); 1959 DCHECK(resource_provider_);
1958 1960
1961 rasterizer_ = CreateRasterizer();
1959 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, 1962 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_,
1960 &staging_resource_pool_); 1963 &staging_resource_pool_);
1961 DCHECK(tile_task_worker_pool_); 1964 DCHECK(tile_task_worker_pool_);
1962 DCHECK(resource_pool_); 1965 DCHECK(resource_pool_);
1963 1966
1964 base::SingleThreadTaskRunner* task_runner = 1967 base::SingleThreadTaskRunner* task_runner =
1965 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1968 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1966 : proxy_->MainThreadTaskRunner(); 1969 : proxy_->MainThreadTaskRunner();
1967 DCHECK(task_runner); 1970 DCHECK(task_runner);
1968 size_t scheduled_raster_task_limit = 1971 size_t scheduled_raster_task_limit =
1969 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() 1972 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max()
1970 : settings_.scheduled_raster_task_limit; 1973 : settings_.scheduled_raster_task_limit;
1971 tile_manager_ = TileManager::Create( 1974 tile_manager_ =
1972 this, task_runner, resource_pool_.get(), 1975 TileManager::Create(this, task_runner, resource_pool_.get(),
1973 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); 1976 tile_task_worker_pool_->AsTileTaskRunner(),
1977 rasterizer_.get(), scheduled_raster_task_limit);
1974 1978
1975 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 1979 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1976 } 1980 }
1977 1981
1982 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() {
1983 ContextProvider* context_provider = output_surface_->context_provider();
1984 if (use_gpu_rasterization_ && context_provider) {
1985 return GpuRasterizer::Create(context_provider, resource_provider_.get(),
1986 settings_.use_distance_field_text, false);
1987 }
1988 return SoftwareRasterizer::Create();
1989 }
1990
1978 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( 1991 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
1979 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, 1992 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
1980 scoped_ptr<ResourcePool>* resource_pool, 1993 scoped_ptr<ResourcePool>* resource_pool,
1981 scoped_ptr<ResourcePool>* staging_resource_pool) { 1994 scoped_ptr<ResourcePool>* staging_resource_pool) {
1982 base::SingleThreadTaskRunner* task_runner = 1995 base::SingleThreadTaskRunner* task_runner =
1983 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1996 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1984 : proxy_->MainThreadTaskRunner(); 1997 : proxy_->MainThreadTaskRunner();
1985 DCHECK(task_runner); 1998 DCHECK(task_runner);
1986 1999
1987 ContextProvider* context_provider = output_surface_->context_provider(); 2000 ContextProvider* context_provider = output_surface_->context_provider();
1988 if (!context_provider) { 2001 if (!context_provider) {
1989 *resource_pool = 2002 *resource_pool =
1990 ResourcePool::Create(resource_provider_.get(), 2003 ResourcePool::Create(resource_provider_.get(),
1991 GL_TEXTURE_2D, 2004 GL_TEXTURE_2D,
1992 resource_provider_->best_texture_format()); 2005 resource_provider_->best_texture_format());
1993 2006
1994 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( 2007 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
1995 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), 2008 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
1996 resource_provider_.get()); 2009 resource_provider_.get());
1997 return; 2010 return;
1998 } 2011 }
1999 2012
2000 if (use_gpu_rasterization_) { 2013 if (use_gpu_rasterization_) {
2001 *resource_pool = 2014 *resource_pool =
2002 ResourcePool::Create(resource_provider_.get(), 2015 ResourcePool::Create(resource_provider_.get(),
2003 GL_TEXTURE_2D, 2016 GL_TEXTURE_2D,
2004 resource_provider_->best_texture_format()); 2017 resource_provider_->best_texture_format());
2005 2018
2006 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( 2019 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
2007 task_runner, context_provider, resource_provider_.get(), 2020 task_runner, TileTaskWorkerPool::GetTaskGraphRunner());
2008 settings_.use_distance_field_text);
2009 return; 2021 return;
2010 } 2022 }
2011 2023
2012 if (GetRendererCapabilities().using_image) { 2024 if (GetRendererCapabilities().using_image) {
2013 unsigned image_target = settings_.use_image_texture_target; 2025 unsigned image_target = settings_.use_image_texture_target;
2014 DCHECK_IMPLIES( 2026 DCHECK_IMPLIES(
2015 image_target == GL_TEXTURE_RECTANGLE_ARB, 2027 image_target == GL_TEXTURE_RECTANGLE_ARB,
2016 context_provider->ContextCapabilities().gpu.texture_rectangle); 2028 context_provider->ContextCapabilities().gpu.texture_rectangle);
2017 DCHECK_IMPLIES( 2029 DCHECK_IMPLIES(
2018 image_target == GL_TEXTURE_EXTERNAL_OES, 2030 image_target == GL_TEXTURE_EXTERNAL_OES,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2063 resource_provider_.get(), 2075 resource_provider_.get(),
2064 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), 2076 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
2065 settings_.renderer_settings.refresh_rate)); 2077 settings_.renderer_settings.refresh_rate));
2066 } 2078 }
2067 2079
2068 void LayerTreeHostImpl::DestroyTileManager() { 2080 void LayerTreeHostImpl::DestroyTileManager() {
2069 tile_manager_ = nullptr; 2081 tile_manager_ = nullptr;
2070 resource_pool_ = nullptr; 2082 resource_pool_ = nullptr;
2071 staging_resource_pool_ = nullptr; 2083 staging_resource_pool_ = nullptr;
2072 tile_task_worker_pool_ = nullptr; 2084 tile_task_worker_pool_ = nullptr;
2085 rasterizer_ = nullptr;
2073 single_thread_synchronous_task_graph_runner_ = nullptr; 2086 single_thread_synchronous_task_graph_runner_ = nullptr;
2074 } 2087 }
2075 2088
2076 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2089 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2077 // In impl-side painting, synchronize to the pending tree so that it has 2090 // In impl-side painting, synchronize to the pending tree so that it has
2078 // time to raster before being displayed. 2091 // time to raster before being displayed.
2079 return settings_.impl_side_painting; 2092 return settings_.impl_side_painting;
2080 } 2093 }
2081 2094
2082 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2095 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after
3481 } 3494 }
3482 3495
3483 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3496 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3484 std::vector<PictureLayerImpl*>::iterator it = 3497 std::vector<PictureLayerImpl*>::iterator it =
3485 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3498 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3486 DCHECK(it != picture_layers_.end()); 3499 DCHECK(it != picture_layers_.end());
3487 picture_layers_.erase(it); 3500 picture_layers_.erase(it);
3488 } 3501 }
3489 3502
3490 } // namespace cc 3503 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698