Chromium Code Reviews| Index: cc/resource_provider.cc |
| diff --git a/cc/resource_provider.cc b/cc/resource_provider.cc |
| index e6983543e480c9770a0e1437f55d97564db36837..6dded1baf773a9736595ed13e368a034135c39e9 100644 |
| --- a/cc/resource_provider.cc |
| +++ b/cc/resource_provider.cc |
| @@ -48,6 +48,21 @@ static bool isTextureFormatSupportedForStorage(GLenum format) |
| return (format == GL_RGBA || format == GL_BGRA_EXT); |
| } |
| +static unsigned createTextureId(WebGraphicsContext3D* context3d) |
| +{ |
| + unsigned textureId = 0; |
| + GLC(context3d, textureId = context3d->createTexture()); |
| + GLC(context3d, context3d->bindTexture(GL_TEXTURE_2D, textureId)); |
| + |
| + // Set texture properties. |
|
piman
2013/02/11 19:32:49
nit: no need for this comment.
reveman
2013/02/11 20:29:57
Done.
|
| + 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)); |
| + |
| + return textureId; |
| +} |
| + |
| ResourceProvider::Resource::Resource() |
| : glId(0) |
| , glPixelBufferId(0) |
| @@ -192,17 +207,11 @@ ResourceProvider::ResourceId ResourceProvider::createGLTexture(const gfx::Size& |
| DCHECK_LE(size.height(), m_maxTextureSize); |
| DCHECK(m_threadChecker.CalledOnValidThread()); |
| - unsigned textureId = 0; |
| WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| 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)); |
| + // Create and set texture properties. Allocation is delayed until needed. |
| + unsigned textureId = createTextureId(context3d); |
| 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)); |
| @@ -1051,6 +1060,32 @@ bool ResourceProvider::didSetPixelsComplete(ResourceId id) { |
| return true; |
| } |
| +void ResourceProvider::abortSetPixels(ResourceId id) { |
| + DCHECK(m_threadChecker.CalledOnValidThread()); |
| + ResourceMap::iterator it = m_resources.find(id); |
| + CHECK(it != m_resources.end()); |
| + Resource* resource = &it->second; |
| + DCHECK(resource->lockedForWrite); |
| + DCHECK(resource->pendingSetPixels); |
| + |
| + if (resource->glId) { |
| + WebGraphicsContext3D* context3d = m_outputSurface->Context3D(); |
| + DCHECK(context3d); |
| + DCHECK(resource->glUploadQueryId); |
| + // CHROMIUM_async_pixel_transfers currently doesn't have a way to |
| + // abort an upload. The best we can do is delete the query and |
| + // the texture. |
| + context3d->deleteQueryEXT(resource->glUploadQueryId); |
| + resource->glUploadQueryId = 0; |
| + context3d->deleteTexture(resource->glId); |
| + resource->glId = createTextureId(context3d); |
| + resource->allocated = false; |
| + } |
| + |
| + resource->pendingSetPixels = false; |
| + unlockForWrite(id); |
| +} |
| + |
| void ResourceProvider::allocateForTesting(ResourceId id) { |
| ResourceMap::iterator it = m_resources.find(id); |
| CHECK(it != m_resources.end()); |