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

Unified Diff: cc/resource_provider.cc

Issue 11622008: cc: Defer texture allocation (to allow async allocations). (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Track uninitialized textures. Fix tests. Created 8 years 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
Index: cc/resource_provider.cc
diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc
index c2b44d28e8e0885674e6233fe0024ab0227616bd..876f53c44d5006993049d3e97469b29b9a8c38e8 100644
--- a/cc/resource_provider.cc
+++ b/cc/resource_provider.cc
@@ -60,6 +60,7 @@ ResourceProvider::Resource::Resource()
, exported(false)
, markedForDeletion(false)
, pendingSetPixels(false)
+ , allocated(false)
, size()
, format(0)
, filter(0)
@@ -79,6 +80,7 @@ ResourceProvider::Resource::Resource(unsigned textureId, const gfx::Size& size,
, exported(false)
, markedForDeletion(false)
, pendingSetPixels(false)
+ , allocated(false)
, size(size)
, format(format)
, filter(filter)
@@ -98,6 +100,7 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, const gfx::Size& size, GLe
, exported(false)
, markedForDeletion(false)
, pendingSetPixels(false)
+ , allocated(false)
, size(size)
, format(format)
, filter(filter)
@@ -173,6 +176,23 @@ ResourceProvider::ResourceId ResourceProvider::createManagedResource(const gfx::
return 0;
}
+ResourceProvider::ResourceId ResourceProvider::createAllocatedResource(const gfx::Size& size, GLenum format, TextureUsageHint hint)
+{
+ ResourceProvider::ResourceId id = createResource(size, format, hint);
+ if (id)
+ lazyAllocate(id);
+ return id;
+}
+
+ResourceProvider::ResourceId ResourceProvider::createAllocatedManagedResource(const gfx::Size& size, GLenum format, TextureUsageHint hint)
+{
+ ResourceProvider::ResourceId id = createManagedResource(size, format, hint);
+ if (id)
+ lazyAllocate(id);
+ return id;
+}
+
+
ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size& size, GLenum format, GLenum texturePool, TextureUsageHint hint)
{
DCHECK_LE(size.width(), m_maxTextureSize);
@@ -184,22 +204,19 @@ ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size&
DCHECK(context3d);
GLC(context3d, textureId = context3d->createTexture());
GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId));
+
+ // Set texture properties. Allocation is delayed until needed.
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, texturePool));
-
if (m_useTextureUsageHint && hint == TextureUsageFramebuffer)
GLC(context3d, context3d->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE));
- if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) {
- GLenum storageFormat = textureToStorageFormat(format);
- GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageFormat, size.width(), size.height()));
- } else
- GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
ResourceId id = m_nextId++;
Resource resource(textureId, size, format, GL_LINEAR);
+ resource.allocated = false;
m_resources[id] = resource;
return id;
}
@@ -212,6 +229,7 @@ ResourceProvider::ResourceId ResourceProvider::createBitmap(const gfx::Size& siz
ResourceId id = m_nextId++;
Resource resource(pixels, size, GL_RGBA, GL_LINEAR);
+ resource.allocated = true;
m_resources[id] = resource;
return id;
}
@@ -231,6 +249,7 @@ ResourceProvider::ResourceId ResourceProvider::createResourceFromExternalTexture
ResourceId id = m_nextId++;
Resource resource(textureId, gfx::Size(), 0, GL_LINEAR);
resource.external = true;
+ resource.allocated = true;
m_resources[id] = resource;
return id;
}
@@ -241,9 +260,9 @@ void ResourceProvider::deleteResource(ResourceId id)
ResourceMap::iterator it = m_resources.find(id);
CHECK(it != m_resources.end());
Resource* resource = &it->second;
- DCHECK(!resource->lockedForWrite);
DCHECK(!resource->lockForReadCount);
DCHECK(!resource->markedForDeletion);
+ DCHECK(resource->pendingSetPixels || !resource->lockedForWrite);
if (resource->exported) {
resource->markedForDeletion = true;
@@ -296,8 +315,10 @@ void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx:
DCHECK(!resource->lockForReadCount);
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ lazyAllocate(resource);
if (resource->glId) {
+ DCHECK(!resource->pendingSetPixels);
WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
DCHECK(context3d);
DCHECK(m_textureUploader.get());
@@ -311,6 +332,7 @@ void ResourceProvider::setPixels(ResourceId id, const uint8_t* image, const gfx:
}
if (resource->pixels) {
+ DCHECK(resource->allocated);
DCHECK(resource->format == GL_RGBA);
SkBitmap srcFull;
srcFull.setConfig(SkBitmap::kARGB_8888_Config, imageRect.width(), imageRect.height());
@@ -385,6 +407,7 @@ const ResourceProvider::Resource* ResourceProvider::lockForRead(ResourceId id)
Resource* resource = &it->second;
DCHECK(!resource->lockedForWrite);
DCHECK(!resource->exported);
+ DCHECK(resource->allocated); // Texture uninitialized! setPixels or lockForWrite first.
piman 2012/12/18 22:41:38 nit: 2 spaces before comments
resource->lockForReadCount++;
return resource;
}
@@ -410,6 +433,8 @@ const ResourceProvider::Resource* ResourceProvider::lockForWrite(ResourceId id)
DCHECK(!resource->lockForReadCount);
DCHECK(!resource->exported);
DCHECK(!resource->external);
+ lazyAllocate(resource);
+
resource->lockedForWrite = true;
return resource;
}
@@ -646,6 +671,8 @@ void ResourceProvider::receiveFromChild(int child, const TransferableResourceLis
ResourceId id = m_nextId++;
Resource resource(textureId, it->size, it->format, it->filter);
resource.mailbox.setName(it->mailbox.name);
+ // Don't allocate a texture for a child.
+ resource.allocated = true;
m_resources[id] = resource;
childInfo.parentToChildMap[id] = it->id;
childInfo.childToParentMap[it->id] = id;
@@ -686,6 +713,7 @@ bool ResourceProvider::transferResource(WebGraphicsContext3D* context, ResourceI
DCHECK(!source->lockedForWrite);
DCHECK(!source->lockForReadCount);
DCHECK(!source->external);
+ DCHECK(source->allocated);
if (source->exported)
return false;
resource->id = id;
@@ -833,6 +861,7 @@ void ResourceProvider::setPixelsFromBuffer(ResourceId id)
DCHECK(!resource->lockForReadCount);
DCHECK(!resource->external);
DCHECK(!resource->exported);
+ lazyAllocate(resource);
if (resource->glId) {
WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
@@ -895,6 +924,7 @@ void ResourceProvider::beginSetPixels(ResourceId id)
Resource* resource = &it->second;
DCHECK(!resource->pendingSetPixels);
+ resource->allocated = true;
lockForWrite(id);
if (resource->glId) {
@@ -910,15 +940,27 @@ void ResourceProvider::beginSetPixels(ResourceId id)
context3d->beginQueryEXT(
GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM,
resource->glUploadQueryId);
- context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
- 0, /* level */
- 0, /* x */
- 0, /* y */
- resource->size.width(),
- resource->size.height(),
- resource->format,
- GL_UNSIGNED_BYTE,
- NULL);
+ if (!resource->allocated) {
+ context3d->asyncTexImage2DCHROMIUM(GL_TEXTURE_2D,
+ 0, /* level */
+ resource->format,
+ resource->size.width(),
+ resource->size.height(),
+ 0, /* border */
+ resource->format,
+ GL_UNSIGNED_BYTE,
+ NULL);
+ } else {
+ context3d->asyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
+ 0, /* level */
+ 0, /* x */
+ 0, /* y */
+ resource->size.width(),
+ resource->size.height(),
+ resource->format,
+ GL_UNSIGNED_BYTE,
+ NULL);
+ }
context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
}
@@ -956,4 +998,30 @@ bool ResourceProvider::didSetPixelsComplete(ResourceId id) {
return true;
}
+void ResourceProvider::lazyAllocate(ResourceId id) {
+ ResourceMap::iterator it = m_resources.find(id);
+ CHECK(it != m_resources.end());
+ Resource* resource = &it->second;
+ lazyAllocate(resource);
+}
+
+void ResourceProvider::lazyAllocate(Resource* resource) {
+ DCHECK(resource);
+ DCHECK(resource->glId || resource->allocated);
+
+ if (resource->allocated || !resource->glId)
+ return;
+
+ resource->allocated = true;
+ WebGraphicsContext3D* context3d = m_outputSurface->Context3D();
+ gfx::Size& size = resource->size;
+ GLenum format = resource->format;
+ if (m_useTextureStorageExt && isTextureFormatSupportedForStorage(format)) {
+ GLenum storageFormat = textureToStorageFormat(format);
+ GLC(context3d, context3d->texStorage2DEXT(GL_TEXTURE_2D, 1, storageFormat, size.width(), size.height()));
+ } else
+ GLC(context3d, context3d->texImage2D(GL_TEXTURE_2D, 0, format, size.width(), size.height(), 0, format, GL_UNSIGNED_BYTE, 0));
+}
+
+
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698