diff options
Diffstat (limited to 'cc/resources/resource_provider.cc')
-rw-r--r-- | cc/resources/resource_provider.cc | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index 8913b0c..2878e30 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc @@ -1575,12 +1575,12 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( return; ReturnedResourceArray to_return; + to_return.reserve(unused.size()); + std::vector<GLbyte*> unverified_sync_tokens; - GLES2Interface* gl = ContextGL(); bool need_sync_token = false; - for (size_t i = 0; i < unused.size(); ++i) { - ResourceId local_id = unused[i]; - + GLES2Interface* gl = ContextGL(); + for (ResourceId local_id : unused) { ResourceMap::iterator it = resources_.find(local_id); CHECK(it != resources_.end()); Resource& resource = it->second; @@ -1627,11 +1627,11 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( ReturnedResource returned; returned.id = child_id; - returned.sync_token = resource.mailbox().sync_token(); + if (resource.needs_sync_token()) + need_sync_token = true; + else + returned.sync_token = resource.mailbox().sync_token(); - need_sync_token |= - (Resource::LOCALLY_USED == resource.synchronization_state() && - IsGpuResourceType(resource.type)); returned.count = resource.imported_count; returned.lost = is_lost; to_return.push_back(returned); @@ -1640,17 +1640,35 @@ void ResourceProvider::DeleteAndReturnUnusedResourcesToChild( child_info->child_to_parent_map.erase(child_id); resource.imported_count = 0; DeleteResourceInternal(it, style); + + // Before returning any sync tokens, they must be verified. Note that we + // need to verify the sync token inside of the "to_return" array. + if (to_return.back().sync_token.HasData() && + !to_return.back().sync_token.verified_flush()) { + unverified_sync_tokens.push_back(to_return.back().sync_token.GetData()); + } } + + gpu::SyncToken new_sync_token; if (need_sync_token && child_info->needs_sync_tokens) { DCHECK(gl); - const GLuint64 fence_sync = gl->InsertFenceSyncCHROMIUM(); - gl->ShallowFlushCHROMIUM(); - - gpu::SyncToken sync_token; - gl->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); - for (size_t i = 0; i < to_return.size(); ++i) { - if (!to_return[i].sync_token.HasData()) - to_return[i].sync_token = sync_token; + const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); + gl->OrderingBarrierCHROMIUM(); + gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, new_sync_token.GetData()); + unverified_sync_tokens.push_back(new_sync_token.GetData()); + } + + if (!unverified_sync_tokens.empty()) { + DCHECK(gl); + gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), + unverified_sync_tokens.size()); + } + + if (new_sync_token.HasData()) { + DCHECK(need_sync_token && child_info->needs_sync_tokens); + for (ReturnedResource& returned_resource : to_return) { + if (!returned_resource.sync_token.HasData()) + returned_resource.sync_token = new_sync_token; } } |