summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjbroman <jbroman@chromium.org>2015-08-18 09:24:46 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-18 16:26:02 +0000
commit5f7f7193b3a7cf794458045044b2eaa8971f68b2 (patch)
tree7ae84ddee5e6c153d9127595a21feb14c8b313ce
parenta51f77dfec1168f0725bb3056fc1a96a57a8cfe1 (diff)
downloadchromium_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.cc30
-rw-r--r--cc/trees/layer_tree_host_pixeltest_tiles.cc7
-rw-r--r--chrome/browser/chromeos/login/chrome_restart_request.cc1
-rw-r--r--content/browser/gpu/compositor_util.cc8
-rw-r--r--content/browser/gpu/compositor_util.h4
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc10
-rw-r--r--content/public/common/content_switches.cc8
-rw-r--r--content/public/common/content_switches.h2
-rw-r--r--content/renderer/gpu/compositor_dependencies.h1
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc2
-rw-r--r--content/renderer/render_thread_impl.cc6
-rw-r--r--content/renderer/render_thread_impl.h2
-rw-r--r--content/test/fake_compositor_dependencies.cc4
-rw-r--r--content/test/fake_compositor_dependencies.h1
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>