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. |