OLD | NEW |
---|---|
(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 | |
OLD | NEW |