Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Unified Diff: cc/resource_provider.cc

Issue 12197004: cc: Enforce correct recycling in resource pool. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/resource_provider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698