| Index: cc/resource_provider.cc
|
| diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc
|
| index 67d3adfb05d339b547b6ab831703494ee3326446..e6983543e480c9770a0e1437f55d97564db36837 100644
|
| --- a/cc/resource_provider.cc
|
| +++ b/cc/resource_provider.cc
|
| @@ -61,6 +61,8 @@ ResourceProvider::Resource::Resource()
|
| , markedForDeletion(false)
|
| , pendingSetPixels(false)
|
| , allocated(false)
|
| + , enableReadLockFences(false)
|
| + , readLockFence(NULL)
|
| , size()
|
| , format(0)
|
| , filter(0)
|
| @@ -85,6 +87,8 @@ ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size,
|
| , markedForDeletion(false)
|
| , pendingSetPixels(false)
|
| , allocated(false)
|
| + , enableReadLockFences(false)
|
| + , readLockFence(NULL)
|
| , size(size)
|
| , format(format)
|
| , filter(filter)
|
| @@ -105,6 +109,8 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe
|
| , markedForDeletion(false)
|
| , pendingSetPixels(false)
|
| , allocated(false)
|
| + , enableReadLockFences(false)
|
| + , readLockFence(NULL)
|
| , size(size)
|
| , format(format)
|
| , filter(filter)
|
| @@ -328,6 +334,7 @@ void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx:
|
| DCHECK(!resource->lockForReadCount);
|
| DCHECK(!resource->external);
|
| DCHECK(!resource->exported);
|
| + DCHECK(readLockFenceHasPassed(resource));
|
| lazyAllocate(resource);
|
|
|
| if (resource->glId) {
|
| @@ -435,6 +442,9 @@ const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id)
|
| }
|
|
|
| resource->lockForReadCount++;
|
| + if (resource->enableReadLockFences)
|
| + resource->readLockFence = m_currentReadLockFence;
|
| +
|
| return resource;
|
| }
|
|
|
| @@ -459,12 +469,26 @@ const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id)
|
| DCHECK(!resource->lockForReadCount);
|
| DCHECK(!resource->exported);
|
| DCHECK(!resource->external);
|
| + DCHECK(readLockFenceHasPassed(resource));
|
| lazyAllocate(resource);
|
|
|
| resource->lockedForWrite = true;
|
| return resource;
|
| }
|
|
|
| +bool ResourceProvider::canLockForWrite(ResourceId id)
|
| +{
|
| + DCHECK(m_threadChecker.CalledOnValidThread());
|
| + ResourceMap::iterator it = m_resources.find(id);
|
| + CHECK(it != m_resources.end());
|
| + Resource* resource = &it->second;
|
| + return !resource->lockedForWrite &&
|
| + !resource->lockForReadCount &&
|
| + !resource->exported &&
|
| + !resource->external &&
|
| + readLockFenceHasPassed(resource);
|
| +}
|
| +
|
| void ResourceProvider::unlockForWrite(ResourceId id)
|
| {
|
| DCHECK(m_threadChecker.CalledOnValidThread());
|
| @@ -886,6 +910,7 @@ void ResourceProvider::setPixelsFromBuffer(ResourceId id)
|
| DCHECK(!resource->lockForReadCount);
|
| DCHECK(!resource->external);
|
| DCHECK(!resource->exported);
|
| + DCHECK(readLockFenceHasPassed(resource));
|
| lazyAllocate(resource);
|
|
|
| if (resource->glId) {
|
| @@ -949,6 +974,7 @@ void ResourceProvider::beginSetPixels(ResourceId id)
|
| Resource* resource = &it->second;
|
| DCHECK(!resource->pendingSetPixels);
|
| DCHECK(resource->glId || resource->allocated);
|
| + DCHECK(readLockFenceHasPassed(resource));
|
|
|
| bool allocate = !resource->allocated;
|
| resource->allocated = true;
|
| @@ -1038,7 +1064,6 @@ void ResourceProvider::lazyAllocate(Resource* resource) {
|
|
|
| if (resource->allocated || !resource->glId)
|
| return;
|
| -
|
| resource->allocated = true;
|
| WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
|
| gfx::Size& size = resource->size;
|
| @@ -1051,5 +1076,12 @@ void ResourceProvider::lazyAllocate(Resource* resource) {
|
| GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
|
| }
|
|
|
| +void ResourceProvider::enableReadLockFences(ResourceProvider::ResourceId id, bool enable) {
|
| + DCHECK(m_threadChecker.CalledOnValidThread());
|
| + ResourceMap::iterator it = m_resources.find(id);
|
| + CHECK(it != m_resources.end());
|
| + Resource* resource = &it->second;
|
| + resource->enableReadLockFences = enable;
|
| +}
|
|
|
| } // namespace cc
|
|
|