Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 89b1e00554a01a3e2eed1ac300305bae578e7be0..a3a936e34cbebe820195865aabfbb0186c280386 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -2000,6 +2000,8 @@ void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
GLC(gl_, gl_->Disable(GL_BLEND)); |
blend_shadow_ = false; |
+ |
+ ScheduleOverlays(frame); |
} |
void GLRenderer::FinishDrawingQuadList() { FlushTextureQuadCache(); } |
@@ -2171,6 +2173,11 @@ void GLRenderer::SwapBuffers(const CompositorFrameMetadata& metadata) { |
} |
output_surface_->SwapBuffers(&compositor_frame); |
+ // Release previously used overlay resources and hold onto the pending ones |
+ // until the next swap buffers. |
+ in_use_overlay_resources_.clear(); |
+ in_use_overlay_resources_.swap(pending_overlay_resources_); |
alexst (slow to review)
2014/03/24 23:25:40
This particular section, I am not 100% certain abo
piman
2014/03/25 00:08:08
The ScopedReadLockGL is not enough to prevent the
|
+ |
swap_buffer_rect_ = gfx::Rect(); |
// We don't have real fences, so we mark read fences as passed |
@@ -3047,4 +3054,43 @@ bool GLRenderer::IsContextLost() { |
return output_surface_->context_provider()->IsContextLost(); |
} |
+void GLRenderer::ScheduleOverlays(DrawingFrame* frame) { |
+ if (!frame->overlay_passes_in_draw_order) |
+ return; |
+ |
+ const RenderPassList* pass_list = frame->overlay_passes_in_draw_order; |
+ int plane_z_order = 1; |
+ for (RenderPassList::const_reverse_iterator it = pass_list->rbegin(); |
+ it != pass_list->rend(); |
+ ++it) { |
+ RenderPass* pass = *it; |
+ if (pass->overlay_state != RenderPass::SIMPLE_OVERLAY) |
+ continue; |
piman
2014/03/25 00:08:08
I wonder if it could make sense to construct the o
|
+ |
+ DCHECK_EQ(pass->quad_list.size(), 1U); |
+ const DrawQuad* candidate_quad = pass->quad_list.front(); |
+ DCHECK_EQ(candidate_quad->material, DrawQuad::TEXTURE_CONTENT); |
+ const TextureDrawQuad& quad = |
+ *TextureDrawQuad::MaterialCast(candidate_quad); |
+ |
+ pending_overlay_resources_.push_back( |
+ make_scoped_ptr(new ResourceProvider::ScopedReadLockGL( |
+ resource_provider(), quad.resource_id))); |
+ |
+ OverlayCandidate::OverlayTransform overlay_transform = |
+ OverlayCandidate::GetOverlayTransform(quad.quadTransform(), |
+ quad.flipped); |
+ gfx::Rect display_bounds = |
+ OverlayCandidate::GetOverlayRect(quad.quadTransform(), quad.rect); |
+ gfx::RectF uv_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right); |
piman
2014/03/25 00:08:08
Mmh, a lot of these we computed previously when tr
|
+ |
+ context_support_->ScheduleOverlayPlane( |
+ plane_z_order++, |
+ overlay_transform, |
+ pending_overlay_resources_.back()->texture_id(), |
+ display_bounds, |
+ uv_rect); |
+ } |
+} |
+ |
} // namespace cc |