Chromium Code Reviews| 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 |