summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/layers/texture_layer_impl_unittest.cc6
-rw-r--r--cc/layers/texture_layer_unittest.cc48
-rw-r--r--cc/resources/resource_provider.cc18
-rw-r--r--cc/resources/resource_provider.h15
-rw-r--r--cc/resources/resource_provider_unittest.cc67
-rw-r--r--third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp5
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,