Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index b638cb749126649edbb6fe13e4626d946efb3bbf..3a59c0b97cf7b2f12d66aa3f891d4321b39d587d 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -1130,6 +1130,35 @@ SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface( |
return resource_->sk_surface.get(); |
} |
+ResourceProvider::SynchronousFence::SynchronousFence( |
+ gpu::gles2::GLES2Interface* gl) |
+ : gl_(gl), has_synchronized_(true) { |
+} |
+ |
+ResourceProvider::SynchronousFence::~SynchronousFence() { |
+} |
+ |
+void ResourceProvider::SynchronousFence::Set() { |
+ has_synchronized_ = false; |
+} |
+ |
+bool ResourceProvider::SynchronousFence::HasPassed() { |
+ if (!has_synchronized_) { |
+ has_synchronized_ = true; |
+ Synchronize(); |
+ } |
+ return true; |
+} |
+ |
+void ResourceProvider::SynchronousFence::Wait() { |
+ HasPassed(); |
+} |
+ |
+void ResourceProvider::SynchronousFence::Synchronize() { |
+ TRACE_EVENT0("cc", "ResourceProvider::SynchronousFence::Synchronize"); |
+ gl_->Finish(); |
+} |
+ |
ResourceProvider::ResourceProvider( |
OutputSurface* output_surface, |
SharedBitmapManager* shared_bitmap_manager, |
@@ -2023,11 +2052,12 @@ void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { |
gl->BindTexture(source_resource->target, source_resource->gl_id); |
BindImageForSampling(source_resource); |
} |
- DCHECK(use_sync_query_) << "CHROMIUM_sync_query extension missing"; |
- if (!source_resource->gl_read_lock_query_id) |
- gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id); |
- gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, |
- source_resource->gl_read_lock_query_id); |
+ if (use_sync_query_) { |
+ if (!source_resource->gl_read_lock_query_id) |
+ gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id); |
+ gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, |
+ source_resource->gl_read_lock_query_id); |
+ } |
DCHECK(!dest_resource->image_id); |
dest_resource->allocated = true; |
gl->CopyTextureCHROMIUM(dest_resource->target, |
@@ -2036,11 +2066,22 @@ void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) { |
0, |
GLInternalFormat(dest_resource->format), |
GLDataType(dest_resource->format)); |
- // End query and create a read lock fence that will prevent access to |
- // source resource until CopyTextureCHROMIUM command has completed. |
- gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); |
- source_resource->read_lock_fence = make_scoped_refptr( |
- new QueryFence(gl, source_resource->gl_read_lock_query_id)); |
+ if (source_resource->gl_read_lock_query_id) { |
+ // End query and create a read lock fence that will prevent access to |
+ // source resource until CopyTextureCHROMIUM command has completed. |
+ gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); |
+ source_resource->read_lock_fence = make_scoped_refptr( |
+ new QueryFence(gl, source_resource->gl_read_lock_query_id)); |
+ } else { |
+ // Create a SynchronousFence when CHROMIUM_sync_query extension is missing. |
+ // Try to use one synchronous fence for as many CopyResource operations as |
+ // possible as that reduce the number of times we have to synchronize with |
+ // the GL. |
+ if (!synchronous_fence_.get() || synchronous_fence_->has_synchronized()) |
+ synchronous_fence_ = make_scoped_refptr(new SynchronousFence(gl)); |
+ source_resource->read_lock_fence = synchronous_fence_; |
+ source_resource->read_lock_fence->Set(); |
+ } |
} |
void ResourceProvider::WaitSyncPointIfNeeded(ResourceId id) { |