diff options
author | jbroman <jbroman@chromium.org> | 2015-08-18 09:24:46 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-18 16:26:02 +0000 |
commit | 5f7f7193b3a7cf794458045044b2eaa8971f68b2 (patch) | |
tree | 7ae84ddee5e6c153d9127595a21feb14c8b313ce | |
parent | a51f77dfec1168f0725bb3056fc1a96a57a8cfe1 (diff) | |
download | chromium_src-5f7f7193b3a7cf794458045044b2eaa8971f68b2.zip chromium_src-5f7f7193b3a7cf794458045044b2eaa8971f68b2.tar.gz chromium_src-5f7f7193b3a7cf794458045044b2eaa8971f68b2.tar.bz2 |
Enable partial rasterization in the renderer using a persistent GpuMemoryBuffer.
BUG=492754
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1263363004
Cr-Commit-Position: refs/heads/master@{#343935}
-rw-r--r-- | cc/tiles/picture_layer_tiling.cc | 30 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_pixeltest_tiles.cc | 7 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/chrome_restart_request.cc | 1 | ||||
-rw-r--r-- | content/browser/gpu/compositor_util.cc | 8 | ||||
-rw-r--r-- | content/browser/gpu/compositor_util.h | 4 | ||||
-rw-r--r-- | content/browser/renderer_host/render_process_host_impl.cc | 10 | ||||
-rw-r--r-- | content/public/common/content_switches.cc | 8 | ||||
-rw-r--r-- | content/public/common/content_switches.h | 2 | ||||
-rw-r--r-- | content/renderer/gpu/compositor_dependencies.h | 1 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.cc | 2 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.cc | 6 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.h | 2 | ||||
-rw-r--r-- | content/test/fake_compositor_dependencies.cc | 4 | ||||
-rw-r--r-- | content/test/fake_compositor_dependencies.h | 1 |
14 files changed, 80 insertions, 6 deletions
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc index 7568cab..f0bcae6 100644 --- a/cc/tiles/picture_layer_tiling.cc +++ b/cc/tiles/picture_layer_tiling.cc @@ -122,6 +122,12 @@ Tile* PictureLayerTiling::CreateTile(int i, int j) { } void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() { + const PictureLayerTiling* active_twin = + tree_ == PENDING_TREE ? client_->GetPendingOrActiveTwinTiling(this) + : nullptr; + const Region* invalidation = + active_twin ? client_->GetPendingInvalidation() : nullptr; + bool include_borders = false; for (TilingData::Iterator iter(&tiling_data_, live_tiles_rect_, include_borders); @@ -131,8 +137,28 @@ void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() { if (find != tiles_.end()) continue; - if (ShouldCreateTileAt(key.index_x, key.index_y)) - CreateTile(key.index_x, key.index_y); + if (ShouldCreateTileAt(key.index_x, key.index_y)) { + Tile* tile = CreateTile(key.index_x, key.index_y); + + // If this is the pending tree, then the active twin tiling may contain + // the previous content ID of these tiles. In that case, we need only + // partially raster the tile content. + if (tile && invalidation && TilingMatchesTileIndices(active_twin)) { + if (const Tile* old_tile = + active_twin->TileAt(key.index_x, key.index_y)) { + gfx::Rect tile_rect = tile->content_rect(); + gfx::Rect invalidated; + for (Region::Iterator iter(*invalidation); iter.has_rect(); + iter.next()) { + gfx::Rect invalid_content_rect = + gfx::ScaleToEnclosingRect(iter.rect(), contents_scale_); + invalid_content_rect.Intersect(tile_rect); + invalidated.Union(invalid_content_rect); + } + tile->SetInvalidated(invalidated, old_tile->id()); + } + } + } } VerifyLiveTilesRect(false); } diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc index a07f100..a8d7b32 100644 --- a/cc/trees/layer_tree_host_pixeltest_tiles.cc +++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc @@ -189,6 +189,13 @@ TEST_F(LayerTreeHostTilesTestPartialInvalidation, } TEST_F(LayerTreeHostTilesTestPartialInvalidation, + PartialRaster_MultiThread_OneCopy) { + RunRasterPixelTest( + true, PARTIAL_ONE_COPY, picture_layer_, + base::FilePath(FILE_PATH_LITERAL("blue_yellow_partial_flipped.png"))); +} + +TEST_F(LayerTreeHostTilesTestPartialInvalidation, FullRaster_MultiThread_OneCopy) { RunRasterPixelTest( true, FULL_ONE_COPY, picture_layer_, diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc index d7d31fb..0b43e78 100644 --- a/chrome/browser/chromeos/login/chrome_restart_request.cc +++ b/chrome/browser/chromeos/login/chrome_restart_request.cc @@ -86,6 +86,7 @@ std::string DeriveCommandLine(const GURL& start_url, ::switches::kDisableLowResTiling, ::switches::kDisableMediaSource, ::switches::kDisableOneCopy, + ::switches::kDisablePersistentGpuMemoryBuffer, ::switches::kDisablePreferCompositingToLCDText, ::switches::kDisablePrefixedEncryptedMedia, ::switches::kDisablePanelFitting, diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc index fdf43bf..342aafb 100644 --- a/content/browser/gpu/compositor_util.cc +++ b/content/browser/gpu/compositor_util.cc @@ -253,6 +253,14 @@ bool IsZeroCopyUploadEnabled() { return command_line.HasSwitch(switches::kEnableZeroCopy); } +bool IsPersistentGpuMemoryBufferEnabled() { + // Zero copy currently doesn't take advantage of persistent buffers. + if (IsZeroCopyUploadEnabled()) + return false; + const auto& command_line = *base::CommandLine::ForCurrentProcess(); + return !command_line.HasSwitch(switches::kDisablePersistentGpuMemoryBuffer); +} + bool IsGpuRasterizationEnabled() { const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); diff --git a/content/browser/gpu/compositor_util.h b/content/browser/gpu/compositor_util.h index fab9099..8bffb5b 100644 --- a/content/browser/gpu/compositor_util.h +++ b/content/browser/gpu/compositor_util.h @@ -28,6 +28,10 @@ CONTENT_EXPORT bool IsOneCopyUploadEnabled(); // Only one of one-copy and zero-copy can be enabled at a time. CONTENT_EXPORT bool IsZeroCopyUploadEnabled(); +// Returns true if a persistent GpuMemoryBuffer can be used and is on (via +// flags, or platform default). +CONTENT_EXPORT bool IsPersistentGpuMemoryBufferEnabled(); + // Returns true if gpu rasterization is on (via flags) for the renderer. CONTENT_EXPORT bool IsGpuRasterizationEnabled(); diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 8347b1d..372d45f 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -1149,20 +1149,22 @@ static void AppendCompositorCommandLineFlags(base::CommandLine* command_line) { command_line->AppendSwitch(switches::kEnableZeroCopy); if (!IsOneCopyUploadEnabled()) command_line->AppendSwitch(switches::kDisableOneCopy); + if (IsPersistentGpuMemoryBufferEnabled()) + command_line->AppendSwitch(switches::kEnablePersistentGpuMemoryBuffer); if (IsForceGpuRasterizationEnabled()) command_line->AppendSwitch(switches::kForceGpuRasterization); + gfx::BufferUsage buffer_usage = IsPersistentGpuMemoryBufferEnabled() + ? gfx::BufferUsage::PERSISTENT_MAP + : gfx::BufferUsage::MAP; std::vector<unsigned> image_targets( static_cast<size_t>(gfx::BufferFormat::LAST) + 1, GL_TEXTURE_2D); for (size_t format = 0; format < static_cast<size_t>(gfx::BufferFormat::LAST) + 1; format++) { image_targets[format] = BrowserGpuMemoryBufferManager::GetImageTextureTarget( - static_cast<gfx::BufferFormat>(format), - // TODO(danakj): When one-copy supports partial update, change - // this usage to PERSISTENT_MAP for one-copy. - gfx::BufferUsage::MAP); + static_cast<gfx::BufferFormat>(format), buffer_usage); } command_line->AppendSwitchASCII(switches::kContentImageTextureTarget, UintVectorToString(image_targets)); diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index e2c0689..98c50a8 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -208,6 +208,10 @@ const char kDisablePepper3d[] = "disable-pepper-3d"; // Disables the Permissions API. const char kDisablePermissionsAPI[] = "disable-permissions-api"; +// Disables the use of persistent GPU memory buffers for partial raster. +const char kDisablePersistentGpuMemoryBuffer[] = + "disable-persistent-gpu-memory-buffer"; + // Disables compositor-accelerated touch-screen pinch gestures. const char kDisablePinch[] = "disable-pinch"; @@ -384,6 +388,10 @@ const char kEnableOneCopy[] = "enable-one-copy"; // kForceOverlayFullscreenVideo for layout tests. http://crbug.com/511376 const char kEnableOverlayFullscreenVideo[] = "enable-overlay-fullscreen-video"; +// Enables the use of persistent GPU memory buffers for partial raster. +const char kEnablePersistentGpuMemoryBuffer[] = + "enable-persistent-gpu-memory-buffer"; + // Enables compositor-accelerated touch-screen pinch gestures. const char kEnablePinch[] = "enable-pinch"; diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index ec6ff1a..d85a94a 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h @@ -71,6 +71,7 @@ CONTENT_EXPORT extern const char kDisableNotifications[]; CONTENT_EXPORT extern const char kDisableOneCopy[]; extern const char kDisablePepper3d[]; CONTENT_EXPORT extern const char kDisablePermissionsAPI[]; +CONTENT_EXPORT extern const char kDisablePersistentGpuMemoryBuffer[]; CONTENT_EXPORT extern const char kDisablePinch[]; CONTENT_EXPORT extern const char kDisablePluginsDiscovery[]; CONTENT_EXPORT extern const char kDisablePresentationAPI[]; @@ -119,6 +120,7 @@ extern const char kEnableMemoryBenchmarking[]; CONTENT_EXPORT extern const char kEnableNetworkInformation[]; CONTENT_EXPORT extern const char kEnableOneCopy[]; CONTENT_EXPORT extern const char kEnableOverlayFullscreenVideo[]; +CONTENT_EXPORT extern const char kEnablePersistentGpuMemoryBuffer[]; CONTENT_EXPORT extern const char kEnablePinch[]; CONTENT_EXPORT extern const char kEnablePluginPlaceholderTesting[]; CONTENT_EXPORT extern const char kEnablePreciseMemoryInfo[]; diff --git a/content/renderer/gpu/compositor_dependencies.h b/content/renderer/gpu/compositor_dependencies.h index 8a60c3d..4c81865 100644 --- a/content/renderer/gpu/compositor_dependencies.h +++ b/content/renderer/gpu/compositor_dependencies.h @@ -40,6 +40,7 @@ class CompositorDependencies { virtual bool IsDistanceFieldTextEnabled() = 0; virtual bool IsZeroCopyEnabled() = 0; virtual bool IsOneCopyEnabled() = 0; + virtual bool IsPersistentGpuMemoryBufferEnabled() = 0; virtual bool IsElasticOverscrollEnabled() = 0; virtual std::vector<unsigned> GetImageTextureTargets() = 0; virtual scoped_refptr<base::SingleThreadTaskRunner> diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index a4474954..f69dc63 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc @@ -303,6 +303,8 @@ void RenderWidgetCompositor::Initialize() { compositor_deps_->IsDistanceFieldTextEnabled(); settings.use_zero_copy = compositor_deps_->IsZeroCopyEnabled(); settings.use_one_copy = compositor_deps_->IsOneCopyEnabled(); + settings.use_persistent_map_for_gpu_memory_buffers = + compositor_deps_->IsPersistentGpuMemoryBufferEnabled(); settings.enable_elastic_overscroll = compositor_deps_->IsElasticOverscrollEnabled(); settings.use_image_texture_targets = diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 071c622..41f5dc7 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -653,6 +653,8 @@ void RenderThreadImpl::Init() { is_zero_copy_enabled_ = command_line.HasSwitch(switches::kEnableZeroCopy); is_one_copy_enabled_ = !command_line.HasSwitch(switches::kDisableOneCopy); + is_persistent_gpu_memory_buffer_enabled_ = + command_line.HasSwitch(switches::kEnablePersistentGpuMemoryBuffer); #if defined(OS_MACOSX) && !defined(OS_IOS) is_elastic_overscroll_enabled_ = base::mac::IsOSLionOrLater(); @@ -1477,6 +1479,10 @@ bool RenderThreadImpl::IsOneCopyEnabled() { return is_one_copy_enabled_; } +bool RenderThreadImpl::IsPersistentGpuMemoryBufferEnabled() { + return is_persistent_gpu_memory_buffer_enabled_; +} + bool RenderThreadImpl::IsElasticOverscrollEnabled() { return is_elastic_overscroll_enabled_; } diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index d6d6187..a7b2c74 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h @@ -194,6 +194,7 @@ class CONTENT_EXPORT RenderThreadImpl bool IsDistanceFieldTextEnabled() override; bool IsZeroCopyEnabled() override; bool IsOneCopyEnabled() override; + bool IsPersistentGpuMemoryBufferEnabled() override; bool IsElasticOverscrollEnabled() override; std::vector<unsigned> GetImageTextureTargets() override; scoped_refptr<base::SingleThreadTaskRunner> @@ -615,6 +616,7 @@ class CONTENT_EXPORT RenderThreadImpl bool is_distance_field_text_enabled_; bool is_zero_copy_enabled_; bool is_one_copy_enabled_; + bool is_persistent_gpu_memory_buffer_enabled_; bool is_elastic_overscroll_enabled_; std::vector<unsigned> use_image_texture_targets_; bool is_gather_pixel_refs_enabled_; diff --git a/content/test/fake_compositor_dependencies.cc b/content/test/fake_compositor_dependencies.cc index c0e29a9..64be534 100644 --- a/content/test/fake_compositor_dependencies.cc +++ b/content/test/fake_compositor_dependencies.cc @@ -46,6 +46,10 @@ bool FakeCompositorDependencies::IsOneCopyEnabled() { return false; } +bool FakeCompositorDependencies::IsPersistentGpuMemoryBufferEnabled() { + return false; +} + bool FakeCompositorDependencies::IsElasticOverscrollEnabled() { return false; } diff --git a/content/test/fake_compositor_dependencies.h b/content/test/fake_compositor_dependencies.h index c7f193e..464cbd3 100644 --- a/content/test/fake_compositor_dependencies.h +++ b/content/test/fake_compositor_dependencies.h @@ -26,6 +26,7 @@ class FakeCompositorDependencies : public CompositorDependencies { bool IsDistanceFieldTextEnabled() override; bool IsZeroCopyEnabled() override; bool IsOneCopyEnabled() override; + bool IsPersistentGpuMemoryBufferEnabled() override; bool IsElasticOverscrollEnabled() override; std::vector<unsigned> GetImageTextureTargets() override; scoped_refptr<base::SingleThreadTaskRunner> |