| Index: cc/raster/one_copy_raster_buffer_provider.cc
|
| diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc
|
| index 816820b02f3ea13bd0da90de2bead452279ce364..0c228868e158bd91ec6385acdbf7ff3b2875fdf4 100644
|
| --- a/cc/raster/one_copy_raster_buffer_provider.cc
|
| +++ b/cc/raster/one_copy_raster_buffer_provider.cc
|
| @@ -31,10 +31,11 @@ class RasterBufferImpl : public RasterBuffer {
|
| ResourceProvider* resource_provider,
|
| ResourceFormat resource_format,
|
| const Resource* resource,
|
| - uint64_t previous_content_id)
|
| + uint64_t previous_content_id,
|
| + bool use_mailbox)
|
| : worker_pool_(worker_pool),
|
| resource_(resource),
|
| - lock_(resource_provider, resource->id()),
|
| + lock_(resource_provider, resource->id(), use_mailbox),
|
| previous_content_id_(previous_content_id) {}
|
|
|
| ~RasterBufferImpl() override {}
|
| @@ -75,11 +76,12 @@ std::unique_ptr<RasterBufferProvider> OneCopyRasterBufferProvider::Create(
|
| int max_copy_texture_chromium_size,
|
| bool use_partial_raster,
|
| int max_staging_buffer_usage_in_bytes,
|
| - ResourceFormat preferred_tile_format) {
|
| + ResourceFormat preferred_tile_format,
|
| + bool async_worker_context_enabled) {
|
| return base::WrapUnique<RasterBufferProvider>(new OneCopyRasterBufferProvider(
|
| task_runner, resource_provider, max_copy_texture_chromium_size,
|
| use_partial_raster, max_staging_buffer_usage_in_bytes,
|
| - preferred_tile_format));
|
| + preferred_tile_format, async_worker_context_enabled));
|
| }
|
|
|
| OneCopyRasterBufferProvider::OneCopyRasterBufferProvider(
|
| @@ -88,7 +90,8 @@ OneCopyRasterBufferProvider::OneCopyRasterBufferProvider(
|
| int max_copy_texture_chromium_size,
|
| bool use_partial_raster,
|
| int max_staging_buffer_usage_in_bytes,
|
| - ResourceFormat preferred_tile_format)
|
| + ResourceFormat preferred_tile_format,
|
| + bool async_worker_context_enabled)
|
| : resource_provider_(resource_provider),
|
| max_bytes_per_copy_operation_(
|
| max_copy_texture_chromium_size
|
| @@ -97,7 +100,8 @@ OneCopyRasterBufferProvider::OneCopyRasterBufferProvider(
|
| : kMaxBytesPerCopyOperation),
|
| use_partial_raster_(use_partial_raster),
|
| bytes_scheduled_since_last_flush_(0),
|
| - preferred_tile_format_(preferred_tile_format) {
|
| + preferred_tile_format_(preferred_tile_format),
|
| + async_worker_context_enabled_(async_worker_context_enabled) {
|
| staging_pool_ = StagingBufferPool::Create(task_runner, resource_provider,
|
| use_partial_raster,
|
| max_staging_buffer_usage_in_bytes);
|
| @@ -112,9 +116,9 @@ OneCopyRasterBufferProvider::AcquireBufferForRaster(
|
| uint64_t previous_content_id) {
|
| // TODO(danakj): If resource_content_id != 0, we only need to copy/upload
|
| // the dirty rect.
|
| - return base::WrapUnique<RasterBuffer>(
|
| - new RasterBufferImpl(this, resource_provider_, resource->format(),
|
| - resource, previous_content_id));
|
| + return base::WrapUnique<RasterBuffer>(new RasterBufferImpl(
|
| + this, resource_provider_, resource->format(), resource,
|
| + previous_content_id, async_worker_context_enabled_));
|
| }
|
|
|
| void OneCopyRasterBufferProvider::ReleaseBufferForRaster(
|
| @@ -125,10 +129,12 @@ void OneCopyRasterBufferProvider::ReleaseBufferForRaster(
|
| void OneCopyRasterBufferProvider::OrderingBarrier() {
|
| TRACE_EVENT0("cc", "OneCopyRasterBufferProvider::OrderingBarrier");
|
|
|
| - resource_provider_->output_surface()
|
| - ->context_provider()
|
| - ->ContextGL()
|
| - ->OrderingBarrierCHROMIUM();
|
| + gpu::gles2::GLES2Interface* gl =
|
| + resource_provider_->output_surface()->context_provider()->ContextGL();
|
| +
|
| + GLuint64 fence = gl->InsertFenceSyncCHROMIUM();
|
| + gl->OrderingBarrierCHROMIUM();
|
| + gl->GenUnverifiedSyncTokenCHROMIUM(fence, sync_token_.GetData());
|
| }
|
|
|
| ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat(
|
| @@ -243,6 +249,11 @@ void OneCopyRasterBufferProvider::CopyOnWorkerThread(
|
| gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
|
| DCHECK(gl);
|
|
|
| + // Synchronize with compositor.
|
| + DCHECK(sync_token_.HasData());
|
| + gl->WaitSyncTokenCHROMIUM(sync_token_.GetConstData());
|
| +
|
| + unsigned resource_texture_id = resource_lock->ProduceTextureId();
|
| unsigned image_target =
|
| resource_provider_->GetImageTextureTarget(resource->format());
|
|
|
| @@ -293,7 +304,7 @@ void OneCopyRasterBufferProvider::CopyOnWorkerThread(
|
| // unallocated resource in which case we need to perform a full size copy.
|
| if (IsResourceFormatCompressed(resource->format())) {
|
| gl->CompressedCopyTextureCHROMIUM(staging_buffer->texture_id,
|
| - resource_lock->texture_id());
|
| + resource_texture_id);
|
| } else {
|
| int bytes_per_row = ResourceUtil::UncheckedWidthInBytes<int>(
|
| resource->size().width(), resource->format());
|
| @@ -309,7 +320,7 @@ void OneCopyRasterBufferProvider::CopyOnWorkerThread(
|
| DCHECK_GT(rows_to_copy, 0);
|
|
|
| gl->CopySubTextureCHROMIUM(
|
| - staging_buffer->texture_id, resource_lock->texture_id(), 0, y, 0, y,
|
| + staging_buffer->texture_id, resource_texture_id, 0, y, 0, y,
|
| resource->size().width(), rows_to_copy, false, false, false);
|
| y += rows_to_copy;
|
|
|
| @@ -333,6 +344,8 @@ void OneCopyRasterBufferProvider::CopyOnWorkerThread(
|
| #endif
|
| }
|
|
|
| + resource_lock->ReleaseTextureId();
|
| +
|
| const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
|
|
|
| // Barrier to sync worker context output to cc context.
|
|
|