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

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: format and merge Created 6 years 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 977 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 DCHECK_GE(frame->render_passes.size(), position_from_end); 1049 DCHECK_GE(frame->render_passes.size(), position_from_end);
1048 } 1050 }
1049 } 1051 }
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 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1058 // that completed, which will add damage to the frame for them so they appear
1059 // as part of the current frame being drawn.
1060 if (settings().impl_side_painting)
1061 tile_manager_->UpdateVisibleTiles();
1062
1063 UMA_HISTOGRAM_CUSTOM_COUNTS( 1059 UMA_HISTOGRAM_CUSTOM_COUNTS(
1064 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); 1060 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20);
1065 1061
1066 bool ok = active_tree_->UpdateDrawProperties(); 1062 bool ok = active_tree_->UpdateDrawProperties();
1067 DCHECK(ok) << "UpdateDrawProperties failed during draw"; 1063 DCHECK(ok) << "UpdateDrawProperties failed during draw";
1068 1064
1065 // This will cause NotifyTileStateChanged() to be called for any visible tiles
1066 // that completed, which will add damage to the frame for them so they appear
1067 // as part of the current frame being drawn.
1068 if (settings().impl_side_painting)
1069 tile_manager_->UpdateVisibleTiles(global_tile_state_);
1070
1069 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1071 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1070 frame->render_passes.clear(); 1072 frame->render_passes.clear();
1071 frame->render_passes_by_id.clear(); 1073 frame->render_passes_by_id.clear();
1072 frame->will_draw_layers.clear(); 1074 frame->will_draw_layers.clear();
1073 frame->has_no_damage = false; 1075 frame->has_no_damage = false;
1074 1076
1075 if (active_tree_->root_layer()) { 1077 if (active_tree_->root_layer()) {
1076 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; 1078 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1077 viewport_damage_rect_ = gfx::Rect(); 1079 viewport_damage_rect_ = gfx::Rect();
1078 1080
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 1854
1853 // If we just became visible, we have to ensure that we draw high res tiles, 1855 // If we just became visible, we have to ensure that we draw high res tiles,
1854 // to prevent checkerboard/low res flashes. 1856 // to prevent checkerboard/low res flashes.
1855 if (visible_) 1857 if (visible_)
1856 SetRequiresHighResToDraw(); 1858 SetRequiresHighResToDraw();
1857 else 1859 else
1858 EvictAllUIResources(); 1860 EvictAllUIResources();
1859 1861
1860 // Evict tiles immediately if invisible since this tab may never get another 1862 // Evict tiles immediately if invisible since this tab may never get another
1861 // draw or timer tick. 1863 // draw or timer tick.
1864 // TODO(vmiura): Make sure we do evict tiles in all modes.
1862 if (!visible_) 1865 if (!visible_)
1863 PrepareTiles(); 1866 PrepareTiles();
1864 1867
1865 if (!renderer_) 1868 if (!renderer_)
1866 return; 1869 return;
1867 1870
1868 renderer_->SetVisible(visible); 1871 renderer_->SetVisible(visible);
1869 } 1872 }
1870 1873
1871 void LayerTreeHostImpl::SetNeedsAnimate() { 1874 void LayerTreeHostImpl::SetNeedsAnimate() {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1946 pending_tree_->set_needs_update_draw_properties(); 1949 pending_tree_->set_needs_update_draw_properties();
1947 client_->UpdateRendererCapabilitiesOnImplThread(); 1950 client_->UpdateRendererCapabilitiesOnImplThread();
1948 } 1951 }
1949 1952
1950 void LayerTreeHostImpl::CreateAndSetTileManager() { 1953 void LayerTreeHostImpl::CreateAndSetTileManager() {
1951 DCHECK(!tile_manager_); 1954 DCHECK(!tile_manager_);
1952 DCHECK(settings_.impl_side_painting); 1955 DCHECK(settings_.impl_side_painting);
1953 DCHECK(output_surface_); 1956 DCHECK(output_surface_);
1954 DCHECK(resource_provider_); 1957 DCHECK(resource_provider_);
1955 1958
1956 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, 1959 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &rasterizer_,
vmpstr 2014/12/23 09:54:42 ..AndRasterizer? :) Can TileManager own the raster
hendrikw 2014/12/23 18:10:33 Do you want TileManager to take a enum (GPU or sof
vmiura 2014/12/23 18:33:13 TileManager doesn't have access to context_provide
hendrikw 2014/12/23 18:54:29 oh fun.
vmiura 2014/12/23 19:08:25 Flowing rasterizer specific settings through TileM
vmpstr 2014/12/23 20:00:01 I meant to say we can create it here, but why stor
1957 &staging_resource_pool_); 1960 &resource_pool_, &staging_resource_pool_);
1958 DCHECK(tile_task_worker_pool_); 1961 DCHECK(tile_task_worker_pool_);
1959 DCHECK(resource_pool_); 1962 DCHECK(resource_pool_);
1960 1963
1961 base::SingleThreadTaskRunner* task_runner = 1964 base::SingleThreadTaskRunner* task_runner =
1962 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1965 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1963 : proxy_->MainThreadTaskRunner(); 1966 : proxy_->MainThreadTaskRunner();
1964 DCHECK(task_runner); 1967 DCHECK(task_runner);
1965 size_t scheduled_raster_task_limit = 1968 size_t scheduled_raster_task_limit =
1966 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() 1969 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max()
1967 : settings_.scheduled_raster_task_limit; 1970 : settings_.scheduled_raster_task_limit;
1968 tile_manager_ = TileManager::Create( 1971 tile_manager_ =
1969 this, task_runner, resource_pool_.get(), 1972 TileManager::Create(this, task_runner, resource_pool_.get(),
1970 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); 1973 tile_task_worker_pool_->AsTileTaskRunner(),
1974 rasterizer_.get(), scheduled_raster_task_limit);
1971 1975
1972 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 1976 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1973 } 1977 }
1974 1978
1975 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( 1979 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
1976 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, 1980 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
1981 scoped_ptr<Rasterizer>* rasterizer,
1977 scoped_ptr<ResourcePool>* resource_pool, 1982 scoped_ptr<ResourcePool>* resource_pool,
1978 scoped_ptr<ResourcePool>* staging_resource_pool) { 1983 scoped_ptr<ResourcePool>* staging_resource_pool) {
1979 base::SingleThreadTaskRunner* task_runner = 1984 base::SingleThreadTaskRunner* task_runner =
1980 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1985 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1981 : proxy_->MainThreadTaskRunner(); 1986 : proxy_->MainThreadTaskRunner();
1982 DCHECK(task_runner); 1987 DCHECK(task_runner);
1983 1988
1984 ContextProvider* context_provider = output_surface_->context_provider(); 1989 ContextProvider* context_provider = output_surface_->context_provider();
1985 if (!context_provider) { 1990 if (!context_provider) {
1986 *resource_pool = 1991 *resource_pool =
1987 ResourcePool::Create(resource_provider_.get(), 1992 ResourcePool::Create(resource_provider_.get(),
1988 GL_TEXTURE_2D, 1993 GL_TEXTURE_2D,
1989 resource_provider_->best_texture_format()); 1994 resource_provider_->best_texture_format());
1990 1995
1991 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( 1996 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
1992 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), 1997 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
1993 resource_provider_.get()); 1998 resource_provider_.get());
1999
2000 *rasterizer = SoftwareRasterizer::Create();
1994 return; 2001 return;
1995 } 2002 }
1996 2003
1997 if (use_gpu_rasterization_) { 2004 if (use_gpu_rasterization_) {
1998 *resource_pool = 2005 *resource_pool =
1999 ResourcePool::Create(resource_provider_.get(), 2006 ResourcePool::Create(resource_provider_.get(),
2000 GL_TEXTURE_2D, 2007 GL_TEXTURE_2D,
2001 resource_provider_->best_texture_format()); 2008 resource_provider_->best_texture_format());
2002 2009
2003 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( 2010 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
2004 task_runner, context_provider, resource_provider_.get(), 2011 task_runner, TileTaskWorkerPool::GetTaskGraphRunner());
2005 settings_.use_distance_field_text); 2012
2013 *rasterizer =
2014 GpuRasterizer::Create(context_provider, resource_provider_.get(),
2015 settings_.use_distance_field_text, false);
2016
2006 return; 2017 return;
2007 } 2018 }
2008 2019
2020 *rasterizer = SoftwareRasterizer::Create();
2021
2009 if (GetRendererCapabilities().using_image) { 2022 if (GetRendererCapabilities().using_image) {
2010 unsigned image_target = settings_.use_image_texture_target; 2023 unsigned image_target = settings_.use_image_texture_target;
2011 DCHECK_IMPLIES( 2024 DCHECK_IMPLIES(
2012 image_target == GL_TEXTURE_RECTANGLE_ARB, 2025 image_target == GL_TEXTURE_RECTANGLE_ARB,
2013 context_provider->ContextCapabilities().gpu.texture_rectangle); 2026 context_provider->ContextCapabilities().gpu.texture_rectangle);
2014 DCHECK_IMPLIES( 2027 DCHECK_IMPLIES(
2015 image_target == GL_TEXTURE_EXTERNAL_OES, 2028 image_target == GL_TEXTURE_EXTERNAL_OES,
2016 context_provider->ContextCapabilities().gpu.egl_image_external); 2029 context_provider->ContextCapabilities().gpu.egl_image_external);
2017 2030
2018 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { 2031 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2060 resource_provider_.get(), 2073 resource_provider_.get(),
2061 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), 2074 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
2062 settings_.renderer_settings.refresh_rate)); 2075 settings_.renderer_settings.refresh_rate));
2063 } 2076 }
2064 2077
2065 void LayerTreeHostImpl::DestroyTileManager() { 2078 void LayerTreeHostImpl::DestroyTileManager() {
2066 tile_manager_ = nullptr; 2079 tile_manager_ = nullptr;
2067 resource_pool_ = nullptr; 2080 resource_pool_ = nullptr;
2068 staging_resource_pool_ = nullptr; 2081 staging_resource_pool_ = nullptr;
2069 tile_task_worker_pool_ = nullptr; 2082 tile_task_worker_pool_ = nullptr;
2083 rasterizer_ = nullptr;
2070 single_thread_synchronous_task_graph_runner_ = nullptr; 2084 single_thread_synchronous_task_graph_runner_ = nullptr;
2071 } 2085 }
2072 2086
2073 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2087 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2074 // In impl-side painting, synchronize to the pending tree so that it has 2088 // In impl-side painting, synchronize to the pending tree so that it has
2075 // time to raster before being displayed. 2089 // time to raster before being displayed.
2076 return settings_.impl_side_painting; 2090 return settings_.impl_side_painting;
2077 } 2091 }
2078 2092
2079 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2093 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after
3478 } 3492 }
3479 3493
3480 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3494 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3481 std::vector<PictureLayerImpl*>::iterator it = 3495 std::vector<PictureLayerImpl*>::iterator it =
3482 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3496 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3483 DCHECK(it != picture_layers_.end()); 3497 DCHECK(it != picture_layers_.end());
3484 picture_layers_.erase(it); 3498 picture_layers_.erase(it);
3485 } 3499 }
3486 3500
3487 } // namespace cc 3501 } // namespace cc
OLDNEW
« cc/resources/tile_manager.cc ('K') | « cc/trees/layer_tree_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698