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

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

Issue 807233002: cc: GPU rasterize tiles synchronously in PrepareToDraw. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missed 2 lines when splitting this from patch 743023002. 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | no next file » | 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 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 377
376 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { 378 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) {
377 if (input_handler_client_) 379 if (input_handler_client_)
378 input_handler_client_->Animate(monotonic_time); 380 input_handler_client_->Animate(monotonic_time);
379 AnimatePageScale(monotonic_time); 381 AnimatePageScale(monotonic_time);
380 AnimateLayers(monotonic_time); 382 AnimateLayers(monotonic_time);
381 AnimateScrollbars(monotonic_time); 383 AnimateScrollbars(monotonic_time);
382 AnimateTopControls(monotonic_time); 384 AnimateTopControls(monotonic_time);
383 } 385 }
384 386
387 void LayerTreeHostImpl::PrepareTilesBeforeDraw() {
388 if (!tile_manager_)
389 return;
390
391 tile_manager_->PrepareTilesBeforeDraw(global_tile_state_);
392 }
393
385 void LayerTreeHostImpl::PrepareTiles() { 394 void LayerTreeHostImpl::PrepareTiles() {
386 if (!tile_manager_) 395 if (!tile_manager_)
387 return; 396 return;
388 if (!tile_priorities_dirty_) 397 if (!tile_priorities_dirty_)
389 return; 398 return;
390 399
391 tile_priorities_dirty_ = false; 400 tile_priorities_dirty_ = false;
392 tile_manager_->PrepareTiles(global_tile_state_); 401 tile_manager_->PrepareTiles(global_tile_state_);
393 402
394 client_->DidPrepareTiles(); 403 client_->DidPrepareTiles();
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 // as part of the current frame being drawn. 1067 // as part of the current frame being drawn.
1059 if (settings().impl_side_painting) 1068 if (settings().impl_side_painting)
1060 tile_manager_->UpdateVisibleTiles(); 1069 tile_manager_->UpdateVisibleTiles();
1061 1070
1062 UMA_HISTOGRAM_CUSTOM_COUNTS( 1071 UMA_HISTOGRAM_CUSTOM_COUNTS(
1063 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); 1072 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20);
1064 1073
1065 bool ok = active_tree_->UpdateDrawProperties(); 1074 bool ok = active_tree_->UpdateDrawProperties();
1066 DCHECK(ok) << "UpdateDrawProperties failed during draw"; 1075 DCHECK(ok) << "UpdateDrawProperties failed during draw";
1067 1076
1077 PrepareTilesBeforeDraw();
1078
1068 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); 1079 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
1069 frame->render_passes.clear(); 1080 frame->render_passes.clear();
1070 frame->render_passes_by_id.clear(); 1081 frame->render_passes_by_id.clear();
1071 frame->will_draw_layers.clear(); 1082 frame->will_draw_layers.clear();
1072 frame->has_no_damage = false; 1083 frame->has_no_damage = false;
1073 1084
1074 if (active_tree_->root_layer()) { 1085 if (active_tree_->root_layer()) {
1075 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; 1086 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_;
1076 viewport_damage_rect_ = gfx::Rect(); 1087 viewport_damage_rect_ = gfx::Rect();
1077 1088
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
1851 1862
1852 // If we just became visible, we have to ensure that we draw high res tiles, 1863 // If we just became visible, we have to ensure that we draw high res tiles,
1853 // to prevent checkerboard/low res flashes. 1864 // to prevent checkerboard/low res flashes.
1854 if (visible_) 1865 if (visible_)
1855 SetRequiresHighResToDraw(); 1866 SetRequiresHighResToDraw();
1856 else 1867 else
1857 EvictAllUIResources(); 1868 EvictAllUIResources();
1858 1869
1859 // Evict tiles immediately if invisible since this tab may never get another 1870 // Evict tiles immediately if invisible since this tab may never get another
1860 // draw or timer tick. 1871 // draw or timer tick.
1872 // TODO(vmiura): Make sure we do evict tiles in all modes.
1861 if (!visible_) 1873 if (!visible_)
1862 PrepareTiles(); 1874 PrepareTiles();
1863 1875
1864 if (!renderer_) 1876 if (!renderer_)
1865 return; 1877 return;
1866 1878
1867 renderer_->SetVisible(visible); 1879 renderer_->SetVisible(visible);
1868 } 1880 }
1869 1881
1870 void LayerTreeHostImpl::SetNeedsAnimate() { 1882 void LayerTreeHostImpl::SetNeedsAnimate() {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1945 pending_tree_->set_needs_update_draw_properties(); 1957 pending_tree_->set_needs_update_draw_properties();
1946 client_->UpdateRendererCapabilitiesOnImplThread(); 1958 client_->UpdateRendererCapabilitiesOnImplThread();
1947 } 1959 }
1948 1960
1949 void LayerTreeHostImpl::CreateAndSetTileManager() { 1961 void LayerTreeHostImpl::CreateAndSetTileManager() {
1950 DCHECK(!tile_manager_); 1962 DCHECK(!tile_manager_);
1951 DCHECK(settings_.impl_side_painting); 1963 DCHECK(settings_.impl_side_painting);
1952 DCHECK(output_surface_); 1964 DCHECK(output_surface_);
1953 DCHECK(resource_provider_); 1965 DCHECK(resource_provider_);
1954 1966
1955 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, 1967 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &rasterizer_,
1956 &staging_resource_pool_); 1968 &resource_pool_, &staging_resource_pool_);
1957 DCHECK(tile_task_worker_pool_); 1969 DCHECK(tile_task_worker_pool_);
1958 DCHECK(resource_pool_); 1970 DCHECK(resource_pool_);
1959 1971
1960 base::SingleThreadTaskRunner* task_runner = 1972 base::SingleThreadTaskRunner* task_runner =
1961 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1973 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1962 : proxy_->MainThreadTaskRunner(); 1974 : proxy_->MainThreadTaskRunner();
1963 DCHECK(task_runner); 1975 DCHECK(task_runner);
1964 size_t scheduled_raster_task_limit = 1976 size_t scheduled_raster_task_limit =
1965 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() 1977 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max()
1966 : settings_.scheduled_raster_task_limit; 1978 : settings_.scheduled_raster_task_limit;
1967 tile_manager_ = TileManager::Create( 1979 tile_manager_ =
1968 this, task_runner, resource_pool_.get(), 1980 TileManager::Create(this, task_runner, resource_pool_.get(),
1969 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); 1981 tile_task_worker_pool_->AsTileTaskRunner(),
1982 rasterizer_.get(), scheduled_raster_task_limit);
1970 1983
1971 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 1984 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1972 } 1985 }
1973 1986
1974 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( 1987 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
1975 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, 1988 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
1989 scoped_ptr<Rasterizer>* rasterizer,
1976 scoped_ptr<ResourcePool>* resource_pool, 1990 scoped_ptr<ResourcePool>* resource_pool,
1977 scoped_ptr<ResourcePool>* staging_resource_pool) { 1991 scoped_ptr<ResourcePool>* staging_resource_pool) {
1978 base::SingleThreadTaskRunner* task_runner = 1992 base::SingleThreadTaskRunner* task_runner =
1979 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1993 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
1980 : proxy_->MainThreadTaskRunner(); 1994 : proxy_->MainThreadTaskRunner();
1981 DCHECK(task_runner); 1995 DCHECK(task_runner);
1982 1996
1983 ContextProvider* context_provider = output_surface_->context_provider(); 1997 ContextProvider* context_provider = output_surface_->context_provider();
1984 if (!context_provider) { 1998 if (!context_provider) {
1985 *resource_pool = 1999 *resource_pool =
1986 ResourcePool::Create(resource_provider_.get(), 2000 ResourcePool::Create(resource_provider_.get(),
1987 GL_TEXTURE_2D, 2001 GL_TEXTURE_2D,
1988 resource_provider_->best_texture_format()); 2002 resource_provider_->best_texture_format());
1989 2003
1990 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( 2004 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
1991 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), 2005 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
1992 resource_provider_.get()); 2006 resource_provider_.get());
2007
2008 *rasterizer = SoftwareRasterizer::Create();
1993 return; 2009 return;
1994 } 2010 }
1995 2011
1996 if (use_gpu_rasterization_) { 2012 if (use_gpu_rasterization_) {
1997 *resource_pool = 2013 *resource_pool =
1998 ResourcePool::Create(resource_provider_.get(), 2014 ResourcePool::Create(resource_provider_.get(),
1999 GL_TEXTURE_2D, 2015 GL_TEXTURE_2D,
2000 resource_provider_->best_texture_format()); 2016 resource_provider_->best_texture_format());
2001 2017
2002 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( 2018 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
2003 task_runner, context_provider, resource_provider_.get(), 2019 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider,
2004 settings_.use_distance_field_text); 2020 resource_provider_.get(), settings_.use_distance_field_text);
2021
2022 *rasterizer =
2023 GpuRasterizer::Create(context_provider, resource_provider_.get(),
2024 settings_.use_distance_field_text, false);
2025
2005 return; 2026 return;
2006 } 2027 }
2007 2028
2008 if (GetRendererCapabilities().using_image) { 2029 if (GetRendererCapabilities().using_image) {
2009 unsigned image_target = settings_.use_image_texture_target; 2030 unsigned image_target = settings_.use_image_texture_target;
2010 DCHECK_IMPLIES( 2031 DCHECK_IMPLIES(
2011 image_target == GL_TEXTURE_RECTANGLE_ARB, 2032 image_target == GL_TEXTURE_RECTANGLE_ARB,
2012 context_provider->ContextCapabilities().gpu.texture_rectangle); 2033 context_provider->ContextCapabilities().gpu.texture_rectangle);
2013 DCHECK_IMPLIES( 2034 DCHECK_IMPLIES(
2014 image_target == GL_TEXTURE_EXTERNAL_OES, 2035 image_target == GL_TEXTURE_EXTERNAL_OES,
2015 context_provider->ContextCapabilities().gpu.egl_image_external); 2036 context_provider->ContextCapabilities().gpu.egl_image_external);
2016 2037
2038 *rasterizer = SoftwareRasterizer::Create();
2039
2017 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { 2040 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) {
2018 *resource_pool = 2041 *resource_pool =
2019 ResourcePool::Create(resource_provider_.get(), image_target, 2042 ResourcePool::Create(resource_provider_.get(), image_target,
2020 resource_provider_->best_texture_format()); 2043 resource_provider_->best_texture_format());
2021 2044
2022 TaskGraphRunner* task_graph_runner; 2045 TaskGraphRunner* task_graph_runner;
2023 if (IsSynchronousSingleThreaded()) { 2046 if (IsSynchronousSingleThreaded()) {
2024 DCHECK(!single_thread_synchronous_task_graph_runner_); 2047 DCHECK(!single_thread_synchronous_task_graph_runner_);
2025 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); 2048 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner);
2026 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); 2049 task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
(...skipping 25 matching lines...) Expand all
2052 2075
2053 *resource_pool = ResourcePool::Create( 2076 *resource_pool = ResourcePool::Create(
2054 resource_provider_.get(), GL_TEXTURE_2D, 2077 resource_provider_.get(), GL_TEXTURE_2D,
2055 resource_provider_->memory_efficient_texture_format()); 2078 resource_provider_->memory_efficient_texture_format());
2056 2079
2057 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( 2080 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create(
2058 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, 2081 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider,
2059 resource_provider_.get(), 2082 resource_provider_.get(),
2060 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), 2083 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
2061 settings_.renderer_settings.refresh_rate)); 2084 settings_.renderer_settings.refresh_rate));
2085
2086 *rasterizer = SoftwareRasterizer::Create();
2062 } 2087 }
2063 2088
2064 void LayerTreeHostImpl::DestroyTileManager() { 2089 void LayerTreeHostImpl::DestroyTileManager() {
2065 tile_manager_ = nullptr; 2090 tile_manager_ = nullptr;
2066 resource_pool_ = nullptr; 2091 resource_pool_ = nullptr;
2067 staging_resource_pool_ = nullptr; 2092 staging_resource_pool_ = nullptr;
2068 tile_task_worker_pool_ = nullptr; 2093 tile_task_worker_pool_ = nullptr;
2094 rasterizer_ = nullptr;
2069 single_thread_synchronous_task_graph_runner_ = nullptr; 2095 single_thread_synchronous_task_graph_runner_ = nullptr;
2070 } 2096 }
2071 2097
2072 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2098 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2073 // In impl-side painting, synchronize to the pending tree so that it has 2099 // In impl-side painting, synchronize to the pending tree so that it has
2074 // time to raster before being displayed. 2100 // time to raster before being displayed.
2075 return settings_.impl_side_painting; 2101 return settings_.impl_side_painting;
2076 } 2102 }
2077 2103
2078 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2104 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after
3477 } 3503 }
3478 3504
3479 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3505 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3480 std::vector<PictureLayerImpl*>::iterator it = 3506 std::vector<PictureLayerImpl*>::iterator it =
3481 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3507 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3482 DCHECK(it != picture_layers_.end()); 3508 DCHECK(it != picture_layers_.end());
3483 picture_layers_.erase(it); 3509 picture_layers_.erase(it);
3484 } 3510 }
3485 3511
3486 } // namespace cc 3512 } // namespace cc
OLDNEW
« no previous file with comments | « 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