Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index 89b1e00554a01a3e2eed1ac300305bae578e7be0..4dc877f53d5658824030d1ed874c8b86f01c7f3b 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -201,6 +201,7 @@ GLRenderer::GLRenderer(RendererClient* client, |
TextureMailboxDeleter* texture_mailbox_deleter, |
int highp_threshold_min) |
: DirectRenderer(client, settings, output_surface, resource_provider), |
+ overlay_child_(0), |
offscreen_framebuffer_id_(0), |
shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), |
gl_(output_surface->context_provider()->ContextGL()), |
@@ -2000,6 +2001,8 @@ void GLRenderer::FinishDrawingFrame(DrawingFrame* frame) { |
GLC(gl_, gl_->Disable(GL_BLEND)); |
blend_shadow_ = false; |
+ |
+ ScheduleOverlays(frame); |
} |
void GLRenderer::FinishDrawingQuadList() { FlushTextureQuadCache(); } |
@@ -2171,6 +2174,22 @@ 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. |
+ ReturnedResourceArray unused_overlay_resources; |
+ for (TransferableResourceArray::const_iterator it = |
+ in_use_overlay_resources_.begin(); |
+ it != in_use_overlay_resources_.end(); |
+ ++it) { |
+ unused_overlay_resources.push_back(it->ToReturnedResource()); |
+ } |
piman
2014/03/26 03:43:33
nit: TransferableResource::ReturnResources
|
+ |
+ if (unused_overlay_resources.size()) |
piman
2014/03/26 03:43:33
nit: if (!unused_overlay_resources.empty())
|
+ resource_provider()->ReceiveReturnsFromParent(unused_overlay_resources); |
+ |
+ in_use_overlay_resources_.clear(); |
+ in_use_overlay_resources_.swap(pending_overlay_resources_); |
+ |
swap_buffer_rect_ = gfx::Rect(); |
// We don't have real fences, so we mark read fences as passed |
@@ -3047,4 +3066,74 @@ bool GLRenderer::IsContextLost() { |
return output_surface_->context_provider()->IsContextLost(); |
} |
+static void CollectResources(const ReturnedResourceArray& returned) {} |
alexst (slow to review)
2014/03/26 01:23:51
Since these resources never crossed any process bo
piman
2014/03/26 03:43:33
This will be called from DeclareUsedResourcesFromC
|
+ |
+static ResourceProvider::ResourceId ResourceRemapHelper( |
+ const ResourceProvider::ResourceIdMap& child_to_parent_map, |
+ ResourceProvider::ResourceIdArray* resources_in_frame, |
+ ResourceProvider::ResourceId id) { |
+ |
+ ResourceProvider::ResourceIdMap::const_iterator it = |
+ child_to_parent_map.find(id); |
+ |
+ DCHECK(it != child_to_parent_map.end()); |
+ DCHECK_EQ(it->first, id); |
+ ResourceProvider::ResourceId remapped_id = it->second; |
+ resources_in_frame->push_back(id); |
+ return remapped_id; |
+} |
+ |
+void GLRenderer::ScheduleOverlays(DrawingFrame* frame) { |
+ if (!frame->overlay_list.size()) |
+ return; |
+ |
+ if (!overlay_child_) { |
+ overlay_child_ = |
+ resource_provider_->CreateChild(base::Bind(&CollectResources)); |
+ } |
+ |
+ ResourceProvider::ResourceIdArray resources; |
+ OverlayCandidateList& overlays = frame->overlay_list; |
+ OverlayCandidateList::iterator it; |
+ for (it = overlays.begin(); it != overlays.end(); ++it) { |
+ const OverlayCandidate& overlay = *it; |
+ // Skip primary plane. |
+ if (overlay.plane_z_order == 0) |
+ continue; |
+ |
+ DCHECK(overlay.resource_id); |
+ resources.push_back(overlay.resource_id); |
+ } |
+ |
+ // Make sure the overlay resources appear as exported until it is |
+ // safe to return them to their respective renderers. |
+ resource_provider()->PrepareSendToParent(resources, |
+ &pending_overlay_resources_); |
+ resource_provider()->ReceiveFromChild(overlay_child_, |
+ pending_overlay_resources_); |
piman
2014/03/26 03:43:33
So, this is unexpected. Looking at this code, it k
|
+ |
+ const ResourceProvider::ResourceIdMap& resource_map = |
+ resource_provider_->GetChildToParentMap(overlay_child_); |
+ resources.clear(); |
+ for (it = overlays.begin(); it != overlays.end(); ++it) { |
+ const OverlayCandidate& overlay = *it; |
+ if (overlay.plane_z_order == 0) |
+ continue; |
+ |
+ ResourceProvider::ResourceId overlay_id = |
+ ResourceRemapHelper(resource_map, &resources, overlay.resource_id); |
+ |
+ ResourceProvider::ScopedReadLockGL overlay_resource_lock( |
+ resource_provider(), overlay_id); |
+ |
+ context_support_->ScheduleOverlayPlane(overlay.plane_z_order, |
+ overlay.transform, |
+ overlay_resource_lock.texture_id(), |
+ overlay.display_rect, |
+ overlay.uv_rect); |
+ } |
+ |
+ resource_provider()->DeclareUsedResourcesFromChild(overlay_child_, resources); |
+} |
+ |
} // namespace cc |