diff options
-rw-r--r-- | cc/layers/texture_layer_impl_unittest.cc | 6 | ||||
-rw-r--r-- | cc/layers/texture_layer_unittest.cc | 48 | ||||
-rw-r--r-- | cc/resources/resource_provider.cc | 18 | ||||
-rw-r--r-- | cc/resources/resource_provider.h | 15 | ||||
-rw-r--r-- | cc/resources/resource_provider_unittest.cc | 67 | ||||
-rw-r--r-- | third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp | 5 |
6 files changed, 129 insertions, 30 deletions
diff --git a/cc/layers/texture_layer_impl_unittest.cc b/cc/layers/texture_layer_impl_unittest.cc index 93e3342..4e6a044 100644 --- a/cc/layers/texture_layer_impl_unittest.cc +++ b/cc/layers/texture_layer_impl_unittest.cc @@ -53,7 +53,11 @@ TEST(TextureLayerImplTest, Occlusion) { gpu::Mailbox mailbox; impl.output_surface()->context_provider()->ContextGL()->GenMailboxCHROMIUM( mailbox.name); - TextureMailbox texture_mailbox(mailbox, gpu::SyncToken(), GL_TEXTURE_2D); + TextureMailbox texture_mailbox( + mailbox, + gpu::SyncToken(gpu::CommandBufferNamespace::GPU_IO, 0x123, + gpu::CommandBufferId::FromUnsafeValue(0x234), 0x456), + GL_TEXTURE_2D); TextureLayerImpl* texture_layer_impl = impl.AddChildToRoot<TextureLayerImpl>(); diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index 45e5976..6b28008 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc @@ -669,9 +669,11 @@ class TextureLayerImplWithMailboxThreadedCallback : public LayerTreeTest { base::Bind( &TextureLayerImplWithMailboxThreadedCallback::ReleaseCallback, base::Unretained(this))); - layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), - gpu::SyncToken(), GL_TEXTURE_2D), - std::move(callback)); + layer_->SetTextureMailbox( + TextureMailbox(MailboxFromChar(mailbox_char), + SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)), + GL_TEXTURE_2D), + std::move(callback)); } void BeginTest() override { @@ -778,15 +780,18 @@ class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { protected: TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {} - static void ReleaseCallback(const gpu::SyncToken& sync_token, + static void ReleaseCallback(const gpu::SyncToken& original_sync_token, + const gpu::SyncToken& release_sync_token, bool lost_resource) {} void SetMailbox(char mailbox_char) { + const gpu::SyncToken sync_token = + SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)); scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( - base::Bind( - &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); + base::Bind(&TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback, + sync_token)); layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), - gpu::SyncToken(), GL_TEXTURE_2D), + sync_token, GL_TEXTURE_2D), std::move(callback)); } @@ -1073,8 +1078,8 @@ class TextureLayerNoExtraCommitForMailboxTest return true; } - *texture_mailbox = - TextureMailbox(MailboxFromChar('1'), gpu::SyncToken(), GL_TEXTURE_2D); + *texture_mailbox = TextureMailbox(MailboxFromChar('1'), + SyncTokenFromUInt(0x123), GL_TEXTURE_2D); *release_callback = SingleReleaseCallback::Create( base::Bind(&TextureLayerNoExtraCommitForMailboxTest::MailboxReleased, base::Unretained(this))); @@ -1085,6 +1090,7 @@ class TextureLayerNoExtraCommitForMailboxTest // Source frame number during callback is the same as the source frame // on which it was released. EXPECT_EQ(1, layer_tree_host()->source_frame_number()); + EXPECT_TRUE(sync_token.HasData()); EndTest(); } @@ -1176,11 +1182,13 @@ class TextureLayerChangeInvisibleMailboxTest } TextureMailbox MakeMailbox(char name) { - return TextureMailbox(MailboxFromChar(name), gpu::SyncToken(), + return TextureMailbox(MailboxFromChar(name), + SyncTokenFromUInt(static_cast<uint32_t>(name)), GL_TEXTURE_2D); } void MailboxReleased(const gpu::SyncToken& sync_token, bool lost_resource) { + EXPECT_TRUE(sync_token.HasData()); ++mailbox_returned_; } @@ -1300,8 +1308,8 @@ class TextureLayerReleaseResourcesBase TextureMailbox* mailbox, scoped_ptr<SingleReleaseCallback>* release_callback, bool use_shared_memory) override { - *mailbox = - TextureMailbox(MailboxFromChar('1'), gpu::SyncToken(), GL_TEXTURE_2D); + *mailbox = TextureMailbox(MailboxFromChar('1'), SyncTokenFromUInt(1), + GL_TEXTURE_2D); *release_callback = SingleReleaseCallback::Create( base::Bind(&TextureLayerReleaseResourcesBase::MailboxReleased, base::Unretained(this))); @@ -1373,9 +1381,11 @@ class TextureLayerWithMailboxMainThreadDeleted : public LayerTreeTest { base::Bind( &TextureLayerWithMailboxMainThreadDeleted::ReleaseCallback, base::Unretained(this))); - layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), - gpu::SyncToken(), GL_TEXTURE_2D), - std::move(callback)); + layer_->SetTextureMailbox( + TextureMailbox(MailboxFromChar(mailbox_char), + SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)), + GL_TEXTURE_2D), + std::move(callback)); } void SetupTree() override { @@ -1442,9 +1452,11 @@ class TextureLayerWithMailboxImplThreadDeleted : public LayerTreeTest { base::Bind( &TextureLayerWithMailboxImplThreadDeleted::ReleaseCallback, base::Unretained(this))); - layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), - gpu::SyncToken(), GL_TEXTURE_2D), - std::move(callback)); + layer_->SetTextureMailbox( + TextureMailbox(MailboxFromChar(mailbox_char), + SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char)), + GL_TEXTURE_2D), + std::move(callback)); } void SetupTree() override { diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index 53cd750..d4a7087 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc @@ -1040,7 +1040,6 @@ ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { DCHECK(thread_checker_.CalledOnValidThread()); - resource_->SetSynchronized(); resource_provider_->UnlockForWrite(resource_); } @@ -1068,6 +1067,7 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: resource_provider_->LazyCreateImage(resource_); resource_->dirty_image = true; resource_->is_overlay_candidate = true; + resource_->SetSynchronized(); // GpuMemoryBuffer provides direct access to the memory used by the GPU. // Read lock fences are required to ensure that we're not trying to map a @@ -1327,7 +1327,20 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, std::vector<Resource*> resources; resources.reserve(resource_ids.size()); for (const ResourceId id : resource_ids) { - resources.push_back(GetResource(id)); + Resource* resource = GetResource(id); + // Check the synchronization and sync token state when delegated sync points + // are required. The only case where we allow a sync token to not be set is + // the case where the image is dirty. In that case we will bind the image + // lazily and generate a sync token at that point. + DCHECK(!output_surface_->capabilities().delegated_sync_points_required || + resource->dirty_image || !resource->needs_sync_token()); + + // If we are validating the resource to be sent, the resource cannot be + // in a LOCALLY_USED state. It must have been properly synchronized. + DCHECK(!output_surface_->capabilities().delegated_sync_points_required || + Resource::LOCALLY_USED != resource->synchronization_state()); + + resources.push_back(resource); } // Lazily create any mailboxes and verify all unverified sync tokens. @@ -1362,6 +1375,7 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, } for (Resource* resource : need_synchronization_resources) { resource->UpdateSyncToken(new_sync_token); + resource->SetSynchronized(); } // Transfer Resources diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h index 1e1ab1c..399ac1d 100644 --- a/cc/resources/resource_provider.h +++ b/cc/resources/resource_provider.h @@ -483,19 +483,20 @@ class CC_EXPORT ResourceProvider // a sync token arrives from an external resource (such as a child or // parent), it is automatically initialized as NEEDS_WAIT as well // since we still need to wait on it before the resource is synchronized - // on the current context. + // on the current context. It is an error to use the resource locally for + // reading or writing if the resource is in this state. NEEDS_WAIT, // The SYNCHRONIZED state indicates that the resource has been properly // synchronized locally. This can either synchronized externally (such // as the case of software rasterized bitmaps), or synchronized // internally using a sync token that has been waited upon. In the - // former case which was synchronized externally, a corresponding sync - // token will not exist. In the latter case which was synchronized from - // the NEEDS_WAIT state, a corresponding sync token will exist which - // is assocaited with the resource. This sync token is still valid and - // still associated with the resource and can be passed as an external - // resource for others to wait on. + // former case where the resource was synchronized externally, a + // corresponding sync token will not exist. In the latter case which was + // synchronized from the NEEDS_WAIT state, a corresponding sync token will + // exist which is assocaited with the resource. This sync token is still + // valid and still associated with the resource and can be passed as an + // external resource for others to wait on. SYNCHRONIZED, }; diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc index e971734..d3eb264 100644 --- a/cc/resources/resource_provider_unittest.cc +++ b/cc/resources/resource_provider_unittest.cc @@ -672,6 +672,10 @@ TEST_P(ResourceProviderTest, TransferGLResources) { resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id3); resource_ids_to_transfer.push_back(id4); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -932,6 +936,8 @@ TEST_P(ResourceProviderTestNoSyncToken, TransferGLResources) { resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id3); TransferableResourceArray list; + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); ASSERT_EQ(3u, list.size()); @@ -1005,6 +1011,10 @@ TEST_P(ResourceProviderTest, ReadLockCountStopsReturnToChildOrDelete) { // Transfer some resources to the parent. ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1070,6 +1080,10 @@ TEST_P(ResourceProviderTest, ReadLockFenceStopsReturnToChildOrDelete) { // Transfer some resources to the parent. ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1129,6 +1143,10 @@ TEST_P(ResourceProviderTest, ReadLockFenceDestroyChild) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1191,6 +1209,10 @@ TEST_P(ResourceProviderTest, ReadLockFenceContextLost) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1258,6 +1280,10 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id3); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1305,6 +1331,10 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1371,6 +1401,10 @@ TEST_P(ResourceProviderTest, TransferSoftwareResources) { resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); resource_ids_to_transfer.push_back(id3); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1439,6 +1473,7 @@ TEST_P(ResourceProviderTest, TransferGLToSoftware) { size, ResourceProvider::TEXTURE_HINT_IMMUTABLE, format); uint8_t data1[4] = { 1, 2, 3, 4 }; child_resource_provider->CopyToResource(id1, data1, size); + child_resource_provider->GenerateSyncTokenForResource(id1); ReturnedResourceArray returned_to_child; int child_id = @@ -1446,6 +1481,7 @@ TEST_P(ResourceProviderTest, TransferGLToSoftware) { { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); + TransferableResourceArray list; child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1492,6 +1528,10 @@ TEST_P(ResourceProviderTest, TransferInvalidSoftware) { { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1546,6 +1586,10 @@ TEST_P(ResourceProviderTest, DeleteExportedResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1579,6 +1623,10 @@ TEST_P(ResourceProviderTest, DeleteExportedResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(mapped_id1); resource_ids_to_transfer.push_back(mapped_id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1642,6 +1690,10 @@ TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id1); resource_ids_to_transfer.push_back(id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1675,6 +1727,10 @@ TEST_P(ResourceProviderTest, DestroyChildWithExportedResources) { ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(mapped_id1); resource_ids_to_transfer.push_back(mapped_id2); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1749,6 +1805,10 @@ TEST_P(ResourceProviderTest, DeleteTransferredResources) { // Transfer some resource to the parent. ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1802,6 +1862,10 @@ TEST_P(ResourceProviderTest, UnuseTransferredResources) { // Transfer some resource to the parent. ResourceProvider::ResourceIdArray resource_ids_to_transfer; resource_ids_to_transfer.push_back(id); + + child_resource_provider_->GenerateSyncTokenForResources( + resource_ids_to_transfer); + TransferableResourceArray list; child_resource_provider_->PrepareSendToParent(resource_ids_to_transfer, &list); @@ -1987,6 +2051,9 @@ class ResourceProviderTestTextureFilters : public ResourceProviderTest { EXPECT_CALL(*child_context, produceTextureDirectCHROMIUM(_, GL_TEXTURE_2D, _)); + + child_resource_provider->GenerateSyncTokenForResources( + resource_ids_to_transfer); child_resource_provider->PrepareSendToParent(resource_ids_to_transfer, &list); Mock::VerifyAndClearExpectations(child_context); diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp index 7456fa0..dca9edb 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp @@ -673,9 +673,10 @@ bool Canvas2DLayerBridge::prepareMailbox(WebExternalTextureMailbox* outMailbox, mailboxInfo.m_image.clear(); } else { // FIXME: We'd rather insert a syncpoint than perform a flush here, - // but currentlythe canvas will flicker if we don't flush here. + // but currently the canvas will flicker if we don't flush here. + const WGC3Duint64 fenceSync = webContext->insertFenceSyncCHROMIUM(); webContext->flush(); - // mailboxInfo.m_mailbox.syncPoint = webContext->insertSyncPoint(); + mailboxInfo.m_mailbox.validSyncToken = webContext->genSyncTokenCHROMIUM(fenceSync, mailboxInfo.m_mailbox.syncToken); } webContext->bindTexture(GL_TEXTURE_2D, 0); // Because we are changing the texture binding without going through skia, |