Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4639)

Unified Diff: cc/output/gl_renderer.cc

Issue 208213003: Plumb overlay processing into DirectRenderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Exporting resources Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698