Index: cc/output/direct_renderer.cc |
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc |
index be5d2bff5be469716352781daae22a622c48d4ed..c2c8aff3986994529c93e62b8c702e780ef1886a 100644 |
--- a/cc/output/direct_renderer.cc |
+++ b/cc/output/direct_renderer.cc |
@@ -56,6 +56,13 @@ static gfx::Transform window_matrix(int x, int y, int width, int height) { |
namespace cc { |
+static ResourceProvider::ResourceId WaitOnResourceSyncPoints( |
+ ResourceProvider* resource_provider, |
+ ResourceProvider::ResourceId resource_id) { |
+ resource_provider->WaitSyncPointIfNeeded(resource_id); |
+ return resource_id; |
+} |
+ |
DirectRenderer::DrawingFrame::DrawingFrame() |
: root_render_pass(NULL), current_render_pass(NULL), current_texture(NULL) { |
} |
@@ -225,6 +232,20 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
// viewport size is never set. |
output_surface_->Reshape(device_viewport_rect.size(), device_scale_factor); |
+ // Insert WaitSyncPointCHROMIUM on quad resources prior to drawing the frame, |
+ // so that drawing can proceed without GL context switching interruptions. |
+ // crbug.com/394547 |
danakj
2014/08/13 23:05:19
git blame will point to the bug, i think you can d
vmiura
2014/08/15 21:20:39
Done.
|
+ DrawQuad::ResourceIteratorCallback wait_on_resource_syncpoints_callback = |
+ base::Bind(&WaitOnResourceSyncPoints, resource_provider_); |
+ |
+ for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
+ RenderPass* pass = 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); |
+ } |
+ } |
+ |
BeginDrawingFrame(&frame); |
for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { |
RenderPass* pass = render_passes_in_draw_order->at(i); |