diff options
author | christiank <christiank@opera.com> | 2015-12-10 13:31:31 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-10 21:33:20 +0000 |
commit | 10fc39d36c0ba481056ec91a2984e02fd1127cf4 (patch) | |
tree | 39970d082f022ce1b38d7a74ab0b8bb20e7042f7 /cc/raster | |
parent | a25128084bd5061934fd5c0f9730817f304ad8a4 (diff) | |
download | chromium_src-10fc39d36c0ba481056ec91a2984e02fd1127cf4.zip chromium_src-10fc39d36c0ba481056ec91a2984e02fd1127cf4.tar.gz chromium_src-10fc39d36c0ba481056ec91a2984e02fd1127cf4.tar.bz2 |
Allow one-copy and zero-copy task tile worker pools to use compressed textures.
BUG=434699
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Committed: https://crrev.com/7d60ce9a132a88ead407a2a58c91edc431e68259
Cr-Commit-Position: refs/heads/master@{#364326}
Review URL: https://codereview.chromium.org/1379783002
Cr-Commit-Position: refs/heads/master@{#364484}
Diffstat (limited to 'cc/raster')
-rw-r--r-- | cc/raster/one_copy_tile_task_worker_pool.cc | 79 | ||||
-rw-r--r-- | cc/raster/one_copy_tile_task_worker_pool.h | 6 | ||||
-rw-r--r-- | cc/raster/tile_task_worker_pool.cc | 79 | ||||
-rw-r--r-- | cc/raster/tile_task_worker_pool_perftest.cc | 5 | ||||
-rw-r--r-- | cc/raster/tile_task_worker_pool_unittest.cc | 5 | ||||
-rw-r--r-- | cc/raster/zero_copy_tile_task_worker_pool.cc | 22 | ||||
-rw-r--r-- | cc/raster/zero_copy_tile_task_worker_pool.h | 6 |
7 files changed, 123 insertions, 79 deletions
diff --git a/cc/raster/one_copy_tile_task_worker_pool.cc b/cc/raster/one_copy_tile_task_worker_pool.cc index 2867734..c7b07b7 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.cc +++ b/cc/raster/one_copy_tile_task_worker_pool.cc @@ -181,11 +181,11 @@ scoped_ptr<TileTaskWorkerPool> OneCopyTileTaskWorkerPool::Create( int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format) { + ResourceFormat preferred_tile_format) { return make_scoped_ptr<TileTaskWorkerPool>(new OneCopyTileTaskWorkerPool( task_runner, task_graph_runner, resource_provider, max_copy_texture_chromium_size, use_partial_raster, - max_staging_buffer_usage_in_bytes, use_rgba_4444_texture_format)); + max_staging_buffer_usage_in_bytes, preferred_tile_format)); } OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( @@ -195,7 +195,7 @@ OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format) + ResourceFormat preferred_tile_format) : task_runner_(task_runner), task_graph_runner_(task_graph_runner), namespace_token_(task_graph_runner->GetNamespaceToken()), @@ -208,7 +208,7 @@ OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool( use_partial_raster_(use_partial_raster), bytes_scheduled_since_last_flush_(0), max_staging_buffer_usage_in_bytes_(max_staging_buffer_usage_in_bytes), - use_rgba_4444_texture_format_(use_rgba_4444_texture_format), + preferred_tile_format_(preferred_tile_format), staging_buffer_usage_in_bytes_(0), free_staging_buffer_usage_in_bytes_(0), staging_buffer_expiration_delay_( @@ -281,9 +281,13 @@ void OneCopyTileTaskWorkerPool::CheckForCompletedTasks() { ResourceFormat OneCopyTileTaskWorkerPool::GetResourceFormat( bool must_support_alpha) const { - return use_rgba_4444_texture_format_ - ? RGBA_4444 - : resource_provider_->best_texture_format(); + if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) && + (DoesResourceFormatSupportAlpha(preferred_tile_format_) || + !must_support_alpha)) { + return preferred_tile_format_; + } + + return resource_provider_->best_texture_format(); } bool OneCopyTileTaskWorkerPool::GetResourceRequiresSwizzle( @@ -427,32 +431,41 @@ void OneCopyTileTaskWorkerPool::PlaybackAndCopyOnWorkerThread( #endif } - int bytes_per_row = - (BitsPerPixel(resource->format()) * resource->size().width()) / 8; - int chunk_size_in_rows = - std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); - // Align chunk size to 4. Required to support compressed texture formats. - chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); - int y = 0; - int height = resource->size().height(); - while (y < height) { - // Copy at most |chunk_size_in_rows|. - int rows_to_copy = std::min(chunk_size_in_rows, height - y); - DCHECK_GT(rows_to_copy, 0); - - gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id, - resource_lock->texture_id(), 0, y, 0, y, - resource->size().width(), rows_to_copy, false, - false, false); - y += rows_to_copy; - - // Increment |bytes_scheduled_since_last_flush_| by the amount of memory - // used for this copy operation. - bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; - - if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) { - gl->ShallowFlushCHROMIUM(); - bytes_scheduled_since_last_flush_ = 0; + // Since compressed texture's cannot be pre-allocated we might have an + // unallocated resource in which case we need to perform a full size copy. + if (IsResourceFormatCompressed(resource->format())) { + gl->CompressedCopyTextureCHROMIUM(GL_TEXTURE_2D, + staging_buffer->texture_id, + resource_lock->texture_id()); + } else { + int bytes_per_row = + (BitsPerPixel(resource->format()) * resource->size().width()) / 8; + int chunk_size_in_rows = + std::max(1, max_bytes_per_copy_operation_ / bytes_per_row); + // Align chunk size to 4. Required to support compressed texture formats. + chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4); + int y = 0; + int height = resource->size().height(); + while (y < height) { + // Copy at most |chunk_size_in_rows|. + int rows_to_copy = std::min(chunk_size_in_rows, height - y); + DCHECK_GT(rows_to_copy, 0); + + gl->CopySubTextureCHROMIUM(GL_TEXTURE_2D, staging_buffer->texture_id, + resource_lock->texture_id(), 0, y, 0, y, + resource->size().width(), rows_to_copy, + false, false, false); + y += rows_to_copy; + + // Increment |bytes_scheduled_since_last_flush_| by the amount of memory + // used for this copy operation. + bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row; + + if (bytes_scheduled_since_last_flush_ >= + max_bytes_per_copy_operation_) { + gl->ShallowFlushCHROMIUM(); + bytes_scheduled_since_last_flush_ = 0; + } } } diff --git a/cc/raster/one_copy_tile_task_worker_pool.h b/cc/raster/one_copy_tile_task_worker_pool.h index 8dc861f..8ba2516 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.h +++ b/cc/raster/one_copy_tile_task_worker_pool.h @@ -50,7 +50,7 @@ class CC_EXPORT OneCopyTileTaskWorkerPool int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); // Overridden from TileTaskWorkerPool: TileTaskRunner* AsTileTaskRunner() override; @@ -92,7 +92,7 @@ class CC_EXPORT OneCopyTileTaskWorkerPool int max_copy_texture_chromium_size, bool use_partial_raster, int max_staging_buffer_usage_in_bytes, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); private: struct StagingBuffer { @@ -149,7 +149,7 @@ class CC_EXPORT OneCopyTileTaskWorkerPool StagingBufferDeque busy_buffers_; int bytes_scheduled_since_last_flush_; const int max_staging_buffer_usage_in_bytes_; - bool use_rgba_4444_texture_format_; + ResourceFormat preferred_tile_format_; int staging_buffer_usage_in_bytes_; int free_staging_buffer_usage_in_bytes_; const base::TimeDelta staging_buffer_expiration_delay_; diff --git a/cc/raster/tile_task_worker_pool.cc b/cc/raster/tile_task_worker_pool.cc index b55f69d..8194625 100644 --- a/cc/raster/tile_task_worker_pool.cc +++ b/cc/raster/tile_task_worker_pool.cc @@ -6,6 +6,7 @@ #include "base/trace_event/trace_event.h" #include "cc/playback/display_list_raster_source.h" +#include "cc/raster/texture_compressor.h" #include "skia/ext/refptr.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDrawFilter.h" @@ -40,11 +41,11 @@ static bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) { case RGBA_4444: case RGBA_8888: case BGRA_8888: + case ETC1: return true; case ALPHA_8: case LUMINANCE_8: case RGB_565: - case ETC1: case RED_8: return false; } @@ -81,8 +82,6 @@ void TileTaskWorkerPool::PlaybackToMemory( // Uses kPremul_SkAlphaType since the result is not known to be opaque. SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType); - SkColorType buffer_color_type = ResourceFormatToSkColorType(format); - bool needs_copy = buffer_color_type != info.colorType(); // Use unknown pixel geometry to disable LCD text. SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry); @@ -99,33 +98,59 @@ void TileTaskWorkerPool::PlaybackToMemory( if (!include_images) image_filter = skia::AdoptRef(new SkipImageFilter); - if (!needs_copy) { - skia::RefPtr<SkSurface> surface = skia::AdoptRef( - SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); - skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); - canvas->setDrawFilter(image_filter.get()); - raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, - canvas_playback_rect, scale); - return; - } - - skia::RefPtr<SkSurface> surface = - skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); - skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); - canvas->setDrawFilter(image_filter.get()); - // TODO(reveman): Improve partial raster support by reducing the size of - // playback rect passed to PlaybackToCanvas. crbug.com/519070 - raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, - canvas_bitmap_rect, scale); - { TRACE_EVENT0("cc", "TileTaskWorkerPool::PlaybackToMemory::ConvertPixels"); - SkImageInfo dst_info = - SkImageInfo::Make(info.width(), info.height(), buffer_color_type, - info.alphaType(), info.profileType()); - bool rv = canvas->readPixels(dst_info, memory, stride, 0, 0); - DCHECK(rv); + switch (format) { + case RGBA_8888: + case BGRA_8888: { + skia::RefPtr<SkSurface> surface = skia::AdoptRef( + SkSurface::NewRasterDirect(info, memory, stride, &surface_props)); + skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); + canvas->setDrawFilter(image_filter.get()); + raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, + canvas_playback_rect, scale); + return; + } + case RGBA_4444: + case ETC1: { + skia::RefPtr<SkSurface> surface = + skia::AdoptRef(SkSurface::NewRaster(info, &surface_props)); + skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); + canvas->setDrawFilter(image_filter.get()); + // TODO(reveman): Improve partial raster support by reducing the size of + // playback rect passed to PlaybackToCanvas. crbug.com/519070 + raster_source->PlaybackToCanvas(canvas.get(), canvas_bitmap_rect, + canvas_bitmap_rect, scale); + + if (format == ETC1) { + DCHECK_EQ(size.width() % 4, 0); + DCHECK_EQ(size.height() % 4, 0); + scoped_ptr<TextureCompressor> texture_compressor = + TextureCompressor::Create(TextureCompressor::kFormatETC1); + texture_compressor->Compress( + reinterpret_cast<const uint8_t*>( + surface->peekPixels(nullptr, nullptr)), + reinterpret_cast<uint8_t*>(memory), size.width(), size.height(), + TextureCompressor::kQualityHigh); + } else { + SkImageInfo dst_info = SkImageInfo::Make( + info.width(), info.height(), ResourceFormatToSkColorType(format), + info.alphaType(), info.profileType()); + bool rv = canvas->readPixels(dst_info, memory, stride, 0, 0); + DCHECK(rv); + } + return; + } + case ALPHA_8: + case LUMINANCE_8: + case RGB_565: + case RED_8: + NOTREACHED(); + return; + } + + NOTREACHED(); } } diff --git a/cc/raster/tile_task_worker_pool_perftest.cc b/cc/raster/tile_task_worker_pool_perftest.cc index 70902c8..1e1ff1c 100644 --- a/cc/raster/tile_task_worker_pool_perftest.cc +++ b/cc/raster/tile_task_worker_pool_perftest.cc @@ -254,7 +254,7 @@ class TileTaskWorkerPoolPerfTest Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( task_runner_.get(), task_graph_runner_.get(), - resource_provider_.get(), false); + resource_provider_.get(), PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: Create3dOutputSurfaceAndResourceProvider(); @@ -262,7 +262,8 @@ class TileTaskWorkerPoolPerfTest task_runner_.get(), task_graph_runner_.get(), context_provider_.get(), resource_provider_.get(), std::numeric_limits<int>::max(), false, - std::numeric_limits<int>::max(), false); + std::numeric_limits<int>::max(), + PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_GPU: Create3dOutputSurfaceAndResourceProvider(); diff --git a/cc/raster/tile_task_worker_pool_unittest.cc b/cc/raster/tile_task_worker_pool_unittest.cc index 62239c1..c5d3a41 100644 --- a/cc/raster/tile_task_worker_pool_unittest.cc +++ b/cc/raster/tile_task_worker_pool_unittest.cc @@ -146,14 +146,15 @@ class TileTaskWorkerPoolTest Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create( base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, - resource_provider_.get(), false); + resource_provider_.get(), PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY: Create3dOutputSurfaceAndResourceProvider(); tile_task_worker_pool_ = OneCopyTileTaskWorkerPool::Create( base::ThreadTaskRunnerHandle::Get().get(), &task_graph_runner_, context_provider_.get(), resource_provider_.get(), - kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, false); + kMaxBytesPerCopyOperation, false, kMaxStagingBuffers, + PlatformColor::BestTextureFormat()); break; case TILE_TASK_WORKER_POOL_TYPE_GPU: Create3dOutputSurfaceAndResourceProvider(); diff --git a/cc/raster/zero_copy_tile_task_worker_pool.cc b/cc/raster/zero_copy_tile_task_worker_pool.cc index 8830c1f..c2358a6 100644 --- a/cc/raster/zero_copy_tile_task_worker_pool.cc +++ b/cc/raster/zero_copy_tile_task_worker_pool.cc @@ -65,22 +65,22 @@ scoped_ptr<TileTaskWorkerPool> ZeroCopyTileTaskWorkerPool::Create( base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format) { - return make_scoped_ptr<TileTaskWorkerPool>(new ZeroCopyTileTaskWorkerPool( - task_runner, task_graph_runner, resource_provider, - use_rgba_4444_texture_format)); + ResourceFormat preferred_tile_format) { + return make_scoped_ptr<TileTaskWorkerPool>( + new ZeroCopyTileTaskWorkerPool(task_runner, task_graph_runner, + resource_provider, preferred_tile_format)); } ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool( base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format) + ResourceFormat preferred_tile_format) : task_runner_(task_runner), task_graph_runner_(task_graph_runner), namespace_token_(task_graph_runner->GetNamespaceToken()), resource_provider_(resource_provider), - use_rgba_4444_texture_format_(use_rgba_4444_texture_format) {} + preferred_tile_format_(preferred_tile_format) {} ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() { } @@ -122,9 +122,13 @@ void ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks() { ResourceFormat ZeroCopyTileTaskWorkerPool::GetResourceFormat( bool must_support_alpha) const { - return use_rgba_4444_texture_format_ - ? RGBA_4444 - : resource_provider_->best_texture_format(); + if (resource_provider_->IsResourceFormatSupported(preferred_tile_format_) && + (DoesResourceFormatSupportAlpha(preferred_tile_format_) || + !must_support_alpha)) { + return preferred_tile_format_; + } + + return resource_provider_->best_texture_format(); } bool ZeroCopyTileTaskWorkerPool::GetResourceRequiresSwizzle( diff --git a/cc/raster/zero_copy_tile_task_worker_pool.h b/cc/raster/zero_copy_tile_task_worker_pool.h index 3ca9b06..79be7f5 100644 --- a/cc/raster/zero_copy_tile_task_worker_pool.h +++ b/cc/raster/zero_copy_tile_task_worker_pool.h @@ -29,7 +29,7 @@ class CC_EXPORT ZeroCopyTileTaskWorkerPool : public TileTaskWorkerPool, base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); // Overridden from TileTaskWorkerPool: TileTaskRunner* AsTileTaskRunner() override; @@ -52,7 +52,7 @@ class CC_EXPORT ZeroCopyTileTaskWorkerPool : public TileTaskWorkerPool, ZeroCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner, TaskGraphRunner* task_graph_runner, ResourceProvider* resource_provider, - bool use_rgba_4444_texture_format); + ResourceFormat preferred_tile_format); private: scoped_refptr<base::trace_event::ConvertableToTraceFormat> StateAsValue() @@ -63,7 +63,7 @@ class CC_EXPORT ZeroCopyTileTaskWorkerPool : public TileTaskWorkerPool, const NamespaceToken namespace_token_; ResourceProvider* resource_provider_; - bool use_rgba_4444_texture_format_; + ResourceFormat preferred_tile_format_; Task::Vector completed_tasks_; |