Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 30fde1addc0491ccf2482b8ac6c450dcad65f481..92af7bc34dc09ca578c4ed4067b9c3943ecf8ecf 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -458,6 +458,13 @@ void GLRenderer::ClearFramebuffer(DrawingFrame* frame, |
} |
} |
+static ResourceProvider::ResourceId WaitOnResourceSyncPoints( |
+ ResourceProvider* resource_provider, |
+ ResourceProvider::ResourceId resource_id) { |
+ resource_provider->WaitSyncPointIfNeeded(resource_id); |
+ return resource_id; |
+} |
+ |
void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
if (frame->device_viewport_rect.IsEmpty()) |
return; |
@@ -492,6 +499,19 @@ void GLRenderer::BeginDrawingFrame(DrawingFrame* frame) { |
} |
resource_provider_->SetReadLockFence(read_lock_fence.get()); |
+ // Insert WaitSyncPointCHROMIUM on quad resources prior to drawing the frame, |
+ // so that drawing can proceed without GL context switching interruptions. |
+ DrawQuad::ResourceIteratorCallback wait_on_resource_syncpoints_callback = |
+ base::Bind(&WaitOnResourceSyncPoints, resource_provider_); |
+ |
+ for (size_t i = 0; i < frame->render_passes_in_draw_order->size(); ++i) { |
+ RenderPass* pass = frame->render_passes_in_draw_order->at(i); |
+ for (size_t j = 0; j < pass->quad_list.size(); ++j) { |
+ DrawQuad* quad = pass->quad_list[j]; |
+ quad->IterateResources(wait_on_resource_syncpoints_callback); |
+ } |
+ } |
+ |
// TODO(enne): Do we need to reinitialize all of this state per frame? |
ReinitializeGLState(); |
} |