Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 0133b277d66461809010534a6e56e07fc9c47a92..b0131a9489af9629337e98f0e958180c19bbe9ec 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -2300,6 +2300,14 @@ void GLRenderer::DoGetFramebufferPixels( |
NULL, |
GL_STREAM_READ)); |
+ WebKit::WebGLId query = 0; |
+ if (is_async) { |
+ query = context_->createQueryEXT(); |
+ GLC(context_, context_->beginQueryEXT( |
+ GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM, |
+ query)); |
+ } |
+ |
GLC(context_, |
context_->readPixels(window_rect.x(), |
window_rect.y(), |
@@ -2325,6 +2333,7 @@ void GLRenderer::DoGetFramebufferPixels( |
base::Unretained(this), |
cleanup_callback, |
buffer, |
+ query, |
dest_pixels, |
window_rect.size()); |
// Save the finished_callback so it can be cancelled. |
@@ -2335,10 +2344,11 @@ void GLRenderer::DoGetFramebufferPixels( |
pending_async_read_pixels_.front()->buffer = buffer; |
if (is_async) { |
- unsigned sync_point = context_->insertSyncPoint(); |
- SyncPointHelper::SignalSyncPoint( |
+ GLC(context_, context_->endQueryEXT( |
+ GL_ASYNC_PIXEL_TRANSFERS_COMPLETED_CHROMIUM)); |
+ SyncPointHelper::SignalQuery( |
context_, |
- sync_point, |
+ query, |
finished_callback); |
} else { |
resource_provider_->Finish(); |
@@ -2351,10 +2361,15 @@ void GLRenderer::DoGetFramebufferPixels( |
void GLRenderer::FinishedReadback( |
const AsyncGetFramebufferPixelsCleanupCallback& cleanup_callback, |
unsigned source_buffer, |
+ unsigned query, |
uint8* dest_pixels, |
gfx::Size size) { |
DCHECK(!pending_async_read_pixels_.empty()); |
+ if (query != 0) { |
+ GLC(context_, context_->deleteQueryEXT(query)); |
+ } |
+ |
PendingAsyncReadPixels* current_read = pending_async_read_pixels_.back(); |
// Make sure we service the readbacks in order. |
DCHECK_EQ(source_buffer, current_read->buffer); |