Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(923)

Unified Diff: cc/raster/one_copy_raster_buffer_provider.cc

Issue 1951193002: cc: Add mailbox support to ResourceProvider write locks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@worker_context_stream
Patch Set: fix gpu Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698