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

Unified Diff: cc/resource_provider.cc

Issue 11412043: cc: Add asynchronous setPixel interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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
« 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 6aaca18cdd28f38513527c269a1d8c1305e0934f..956f39096d33a7e37c052be0c05c6531234fbbfa 100644
--- a/cc/resource_provider.cc
+++ b/cc/resource_provider.cc
@@ -50,6 +50,7 @@ static bool isTextureFormatSupportedForStorage(GLenum format)
ResourceProvider::Resource::Resource()
: glId(0)
, glPixelBufferId(0)
+ , glUploadQueryId(0)
, pixels(0)
, pixelBuffer(0)
, pool(0)
@@ -58,6 +59,7 @@ ResourceProvider::Resource::Resource()
, external(false)
, exported(false)
, markedForDeletion(false)
+ , pendingSetPixels(false)
, size()
, format(0)
, filter(0)
@@ -68,6 +70,7 @@ ResourceProvider::Resource::Resource()
ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Size& size, GLenum format, GLenum filter)
: glId(textureId)
, glPixelBufferId(0)
+ , glUploadQueryId(0)
, pixels(0)
, pixelBuffer(0)
, pool(pool)
@@ -76,6 +79,7 @@ ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
, external(false)
, exported(false)
, markedForDeletion(false)
+ , pendingSetPixels(false)
, size(size)
, format(format)
, filter(filter)
@@ -86,6 +90,7 @@ ResourceProvider::Resource::Resource(unsigned textureId, int pool, const gfx::Si
ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size& size, GLenum format, GLenum filter)
: glId(0)
, glPixelBufferId(0)
+ , glUploadQueryId(0)
, pixels(pixels)
, pixelBuffer(0)
, pool(pool)
@@ -94,6 +99,7 @@ ResourceProvider::Resource::Resource(uint8_t* pixels, int pool, const gfx::Size&
, external(false)
, exported(false)
, markedForDeletion(false)
+ , pendingSetPixels(false)
, size(size)
, format(format)
, filter(filter)
@@ -241,6 +247,11 @@ void ResourceProvider::deleteResourceInternal(ResourceMap::iterator it)
DCHECK(context3d);
GLC(context3d, context3d->deleteTexture(resource->glId));
}
+ if (resource->glUploadQueryId) {
+ WebGraphicsContext3D* context3d = m_outputSurface->context3D();
+ DCHECK(context3d);
+ GLC(context3d, context3d->deleteQueryEXT(resource->glUploadQueryId));
+ }
if (resource->glPixelBufferId) {
WebGraphicsContext3D* context3d = m_outputSurface->context3D();
DCHECK(context3d);
@@ -868,4 +879,73 @@ void ResourceProvider::bindForSampling(ResourceProvider::ResourceId resourceId,
}
}
+void ResourceProvider::beginSetPixels(ResourceId id)
+{
+ DCHECK(m_threadChecker.CalledOnValidThread());
+ ResourceMap::iterator it = m_resources.find(id);
+ CHECK(it != m_resources.end());
+ Resource* resource = &it->second;
+ DCHECK(!resource->pendingSetPixels);
+
+ lockForWrite(id);
+
+ if (resource->glId) {
+ WebGraphicsContext3D* context3d = m_outputSurface->context3D();
+ DCHECK(context3d);
+ DCHECK(resource->glPixelBufferId);
+ context3d->bindTexture(GL_TEXTURE_2D, resource->glId);
+ context3d->bindBuffer(
+ GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
+ resource->glPixelBufferId);
+ if (!resource->glUploadQueryId)
+ resource->glUploadQueryId = context3d->createQueryEXT();
+ 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);
+ context3d->endQueryEXT(GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM);
+ context3d->bindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
+ }
+
+ if (resource->pixels)
+ setPixelsFromBuffer(id);
+
+ resource->pendingSetPixels = true;
+}
+
+bool ResourceProvider::didSetPixelsComplete(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);
+ unsigned complete = 1;
+ context3d->getQueryObjectuivEXT(
+ resource->glUploadQueryId,
+ GL_QUERY_RESULT_AVAILABLE_EXT,
+ &complete);
+ if (!complete)
+ return false;
+ }
+
+ resource->pendingSetPixels = false;
+ unlockForWrite(id);
+
+ return true;
+}
+
} // 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