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

Side by Side Diff: cc/output/overlay_renderer.cc

Issue 197223003: Start of hardware overlay support in CC with Ubercompositor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/output/overlay_renderer.h"
6
7 #include "cc/output/output_surface.h"
8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/texture_draw_quad.h"
10 #include "ui/gfx/rect_conversions.h"
11 #include "ui/gfx/transform.h"
12
13 namespace cc {
14
15 namespace {
16
17 class SingleOverlayOnTop : public OverlayRenderer::Strategy {
18 public:
19 SingleOverlayOnTop(OverlayCandidates* capability_checker,
20 ResourceProvider* resource_provider);
21 virtual bool Attempt(RenderPassList* render_passes_in_draw_order) OVERRIDE;
22
23 private:
24 OverlayCandidates* capability_checker_;
25 ResourceProvider* resource_provider_;
piman 2014/03/14 03:42:34 nit: DISALLOW_COPY_AND_ASSIGN
alexst (slow to review) 2014/03/14 19:54:22 Done.
26 };
27
28 SingleOverlayOnTop::SingleOverlayOnTop(OverlayCandidates* capability_checker,
29 ResourceProvider* resource_provider)
30 : capability_checker_(capability_checker),
31 resource_provider_(resource_provider) {}
32
33 bool SingleOverlayOnTop::Attempt(RenderPassList* render_passes_in_draw_order) {
piman 2014/03/14 03:42:34 I think it would be nice to expose this so that we
alexst (slow to review) 2014/03/14 19:54:22 I was planning to do it as we added more strategie
34 // Only attempt to handle very simple case for now.
35 if (render_passes_in_draw_order->size() != 1 || !capability_checker_)
36 return false;
37
38 RenderPass* root_render_pass = render_passes_in_draw_order->back();
39 DCHECK(root_render_pass);
40
41 QuadList& quad_list = root_render_pass->quad_list;
42 QuadList::BackToFrontIterator candidate_quad = quad_list.BackToFrontEnd();
43 for (QuadList::BackToFrontIterator it = quad_list.BackToFrontBegin();
44 it != quad_list.BackToFrontEnd();
45 ++it) {
46 const DrawQuad& quad = *(*it);
47 // Don't try for multiple surfaces or if something is on top of
48 // our candidate.
49 if (candidate_quad != quad_list.BackToFrontEnd())
50 return false;
piman 2014/03/14 03:42:34 You're only setting candidate_quad right before yo
alexst (slow to review) 2014/03/14 19:54:22 You are right, I was simplifying old test code for
51
52 if (quad.material == DrawQuad::TEXTURE_CONTENT) {
53 ResourceProvider::ResourceId resource_id =
54 TextureDrawQuad::MaterialCast(*it)->resource_id;
55
56 if (!resource_provider_->HasNativeBufferBacking(resource_id))
57 continue;
58
59 candidate_quad = it;
60 break;
61 }
62 }
63
64 // Found nothing useful.
65 if (candidate_quad == quad_list.BackToFrontEnd())
66 return false;
67
68 // Add our primary surface.
69 OverlayCandidates::OverlaySurfaceCandidateList candidates;
70 OverlayCandidates::OverlaySurfaceCandidate main_image;
71 main_image.display_rect = root_render_pass->output_rect;
72 main_image.format = RGBA_8888;
73 candidates.push_back(main_image);
74
75 // Add the overlay.
76 OverlayCandidates::OverlaySurfaceCandidate candidate;
77 const TextureDrawQuad& quad = *TextureDrawQuad::MaterialCast(*candidate_quad);
78 gfx::RectF float_rect(quad.rect);
79 quad.quadTransform().TransformRect(&float_rect);
piman 2014/03/14 03:42:34 This really computes the bounding box of the trans
alexst (slow to review) 2014/03/14 19:54:22 This meant to have a check for identity or transla
80 candidate.display_rect = gfx::ToNearestRect(float_rect);
81 candidate.crop_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right);
82 candidate.format = RGBA_8888;
83 candidates.push_back(candidate);
84
85 // Check for support.
86 capability_checker_->CheckOverlaySupport(&candidates);
enne (OOO) 2014/03/14 18:13:41 I'm sure there's a wrinkle I'm not seeing, but why
alexst (slow to review) 2014/03/14 19:54:22 Exactly right. Maybe HW can't handle 4 things, but
87
88 // If the candidate can be handled by an overlay, create a pass for it.
89 if (candidates[1].overlay_handled) {
90 scoped_ptr<RenderPass> overlay_pass = RenderPass::Create();
91 overlay_pass->overlay_state = RenderPass::SIMPLE_OVERLAY;
92
93 scoped_ptr<DrawQuad> overlay_quad =
94 quad_list.take((candidate_quad + 1).base());
piman 2014/03/14 03:42:34 I think it would be clearer if candidate_quad was
95 quad_list.erase((candidate_quad + 1).base());
96 overlay_pass->quad_list.push_back(overlay_quad.PassAs<DrawQuad>());
piman 2014/03/14 03:42:34 nit: just Pass() ?
97 render_passes_in_draw_order->insert(render_passes_in_draw_order->begin(),
98 overlay_pass.PassAs<RenderPass>());
piman 2014/03/14 03:42:34 nit: just Pass()?
99 }
100 return true;
101 }
102 }
103
104 OverlayRenderer::OverlayRenderer(OutputSurface* surface,
105 ResourceProvider* resource_provider) {
106 DCHECK(surface);
107 OverlayCandidates* candidates = surface->overlay_candidates();
108 if (candidates) {
109 strategies_.push_back(scoped_ptr<Strategy>(
110 new SingleOverlayOnTop(candidates, resource_provider)));
111 }
112 }
113
114 OverlayRenderer::~OverlayRenderer() {}
115
116 void OverlayRenderer::ProcessForOverlays(
117 RenderPassList* render_passes_in_draw_order) {
118 for (size_t i = 0; i < strategies_.size(); i++) {
piman 2014/03/14 03:42:34 nit: use iterators and win on the bounds checks.
119 if (strategies_[i]->Attempt(render_passes_in_draw_order))
120 return;
121 }
122 }
123
124 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698