OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/direct_renderer.h" | 5 #include "cc/output/direct_renderer.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <unordered_map> | 9 #include <unordered_map> |
10 #include <utility> | 10 #include <utility> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/numerics/safe_conversions.h" | 14 #include "base/numerics/safe_conversions.h" |
15 #include "base/trace_event/trace_event.h" | 15 #include "base/trace_event/trace_event.h" |
16 #include "cc/base/math_util.h" | 16 #include "cc/base/math_util.h" |
17 #include "cc/output/bsp_tree.h" | 17 #include "cc/output/bsp_tree.h" |
18 #include "cc/output/bsp_walk_action.h" | 18 #include "cc/output/bsp_walk_action.h" |
19 #include "cc/output/copy_output_request.h" | 19 #include "cc/output/copy_output_request.h" |
| 20 #include "cc/output/renderer_settings.h" |
20 #include "cc/quads/draw_quad.h" | 21 #include "cc/quads/draw_quad.h" |
| 22 #include "cc/resources/scoped_resource.h" |
21 #include "ui/gfx/geometry/quad_f.h" | 23 #include "ui/gfx/geometry/quad_f.h" |
22 #include "ui/gfx/geometry/rect_conversions.h" | 24 #include "ui/gfx/geometry/rect_conversions.h" |
23 #include "ui/gfx/transform.h" | 25 #include "ui/gfx/transform.h" |
24 | 26 |
25 static gfx::Transform OrthoProjectionMatrix(float left, | 27 static gfx::Transform OrthoProjectionMatrix(float left, |
26 float right, | 28 float right, |
27 float bottom, | 29 float bottom, |
28 float top) { | 30 float top) { |
29 // Use the standard formula to map the clipping frustum to the cube from | 31 // Use the standard formula to map the clipping frustum to the cube from |
30 // [-1, -1, -1] to [1, 1, 1]. | 32 // [-1, -1, -1] to [1, 1, 1]. |
(...skipping 23 matching lines...) Expand all Loading... |
54 | 56 |
55 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) | 57 // Map from ([-1, -1] to [1, 1]) -> ([0, 0] to [1, 1]) |
56 canvas.Translate3d(0.5, 0.5, 0.5); | 58 canvas.Translate3d(0.5, 0.5, 0.5); |
57 canvas.Scale3d(0.5, 0.5, 0.5); | 59 canvas.Scale3d(0.5, 0.5, 0.5); |
58 | 60 |
59 return canvas; | 61 return canvas; |
60 } | 62 } |
61 | 63 |
62 namespace cc { | 64 namespace cc { |
63 | 65 |
64 DirectRenderer::DrawingFrame::DrawingFrame() | 66 DirectRenderer::DrawingFrame::DrawingFrame() = default; |
65 : root_render_pass(NULL), current_render_pass(NULL), current_texture(NULL) { | 67 DirectRenderer::DrawingFrame::~DrawingFrame() = default; |
| 68 |
| 69 DirectRenderer::DirectRenderer(const RendererSettings* settings, |
| 70 OutputSurface* output_surface, |
| 71 ResourceProvider* resource_provider) |
| 72 : settings_(settings), |
| 73 output_surface_(output_surface), |
| 74 resource_provider_(resource_provider), |
| 75 overlay_processor_(new OverlayProcessor(output_surface)) { |
| 76 // TODO(danakj): This should not be happening in the constructor. |
| 77 overlay_processor_->Initialize(); |
66 } | 78 } |
67 | 79 |
68 DirectRenderer::DrawingFrame::~DrawingFrame() {} | 80 DirectRenderer::~DirectRenderer() = default; |
69 | 81 |
70 // | |
71 // static | 82 // static |
72 gfx::RectF DirectRenderer::QuadVertexRect() { | 83 gfx::RectF DirectRenderer::QuadVertexRect() { |
73 return gfx::RectF(-0.5f, -0.5f, 1.f, 1.f); | 84 return gfx::RectF(-0.5f, -0.5f, 1.f, 1.f); |
74 } | 85 } |
75 | 86 |
76 // static | 87 // static |
77 void DirectRenderer::QuadRectTransform(gfx::Transform* quad_rect_transform, | 88 void DirectRenderer::QuadRectTransform(gfx::Transform* quad_rect_transform, |
78 const gfx::Transform& quad_transform, | 89 const gfx::Transform& quad_transform, |
79 const gfx::RectF& quad_rect) { | 90 const gfx::RectF& quad_rect) { |
80 *quad_rect_transform = quad_transform; | 91 *quad_rect_transform = quad_transform; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 const DrawingFrame* frame, | 132 const DrawingFrame* frame, |
122 const gfx::Rect& draw_rect) const { | 133 const gfx::Rect& draw_rect) const { |
123 gfx::Rect window_rect = draw_rect; | 134 gfx::Rect window_rect = draw_rect; |
124 window_rect -= current_draw_rect_.OffsetFromOrigin(); | 135 window_rect -= current_draw_rect_.OffsetFromOrigin(); |
125 window_rect += current_viewport_rect_.OffsetFromOrigin(); | 136 window_rect += current_viewport_rect_.OffsetFromOrigin(); |
126 if (FlippedFramebuffer(frame)) | 137 if (FlippedFramebuffer(frame)) |
127 window_rect.set_y(current_surface_size_.height() - window_rect.bottom()); | 138 window_rect.set_y(current_surface_size_.height() - window_rect.bottom()); |
128 return window_rect; | 139 return window_rect; |
129 } | 140 } |
130 | 141 |
131 DirectRenderer::DirectRenderer(const RendererSettings* settings, | |
132 OutputSurface* output_surface, | |
133 ResourceProvider* resource_provider) | |
134 : Renderer(settings), | |
135 output_surface_(output_surface), | |
136 resource_provider_(resource_provider), | |
137 overlay_processor_(new OverlayProcessor(output_surface)) { | |
138 overlay_processor_->Initialize(); | |
139 } | |
140 | |
141 DirectRenderer::~DirectRenderer() {} | |
142 | |
143 const TileDrawQuad* DirectRenderer::CanPassBeDrawnDirectly( | 142 const TileDrawQuad* DirectRenderer::CanPassBeDrawnDirectly( |
144 const RenderPass* pass) { | 143 const RenderPass* pass) { |
145 return nullptr; | 144 return nullptr; |
146 } | 145 } |
147 | 146 |
| 147 void DirectRenderer::SetVisible(bool visible) { |
| 148 if (visible_ == visible) |
| 149 return; |
| 150 visible_ = visible; |
| 151 DidChangeVisibility(); |
| 152 } |
| 153 |
148 void DirectRenderer::DecideRenderPassAllocationsForFrame( | 154 void DirectRenderer::DecideRenderPassAllocationsForFrame( |
149 const RenderPassList& render_passes_in_draw_order) { | 155 const RenderPassList& render_passes_in_draw_order) { |
150 render_pass_bypass_quads_.clear(); | 156 render_pass_bypass_quads_.clear(); |
151 | 157 |
152 std::unordered_map<RenderPassId, gfx::Size, RenderPassIdHash> | 158 std::unordered_map<RenderPassId, gfx::Size, RenderPassIdHash> |
153 render_passes_in_frame; | 159 render_passes_in_frame; |
154 RenderPass* root_render_pass = render_passes_in_draw_order.back().get(); | 160 RenderPass* root_render_pass = render_passes_in_draw_order.back().get(); |
155 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) { | 161 for (size_t i = 0; i < render_passes_in_draw_order.size(); ++i) { |
156 RenderPass* pass = render_passes_in_draw_order[i].get(); | 162 RenderPass* pass = render_passes_in_draw_order[i].get(); |
157 if (pass != root_render_pass) { | 163 if (pass != root_render_pass) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 if (!resource) | 199 if (!resource) |
194 resource = ScopedResource::Create(resource_provider_); | 200 resource = ScopedResource::Create(resource_provider_); |
195 } | 201 } |
196 } | 202 } |
197 | 203 |
198 void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, | 204 void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order, |
199 float device_scale_factor, | 205 float device_scale_factor, |
200 const gfx::ColorSpace& device_color_space, | 206 const gfx::ColorSpace& device_color_space, |
201 const gfx::Rect& device_viewport_rect, | 207 const gfx::Rect& device_viewport_rect, |
202 const gfx::Rect& device_clip_rect) { | 208 const gfx::Rect& device_clip_rect) { |
203 DCHECK(visible()); | 209 DCHECK(visible_); |
204 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); | 210 TRACE_EVENT0("cc", "DirectRenderer::DrawFrame"); |
205 UMA_HISTOGRAM_COUNTS( | 211 UMA_HISTOGRAM_COUNTS( |
206 "Renderer4.renderPassCount", | 212 "Renderer4.renderPassCount", |
207 base::saturated_cast<int>(render_passes_in_draw_order->size())); | 213 base::saturated_cast<int>(render_passes_in_draw_order->size())); |
208 | 214 |
209 RenderPass* root_render_pass = render_passes_in_draw_order->back().get(); | 215 RenderPass* root_render_pass = render_passes_in_draw_order->back().get(); |
210 DCHECK(root_render_pass); | 216 DCHECK(root_render_pass); |
211 | 217 |
212 DrawingFrame frame; | 218 DrawingFrame frame; |
213 frame.render_passes_in_draw_order = render_passes_in_draw_order; | 219 frame.render_passes_in_draw_order = render_passes_in_draw_order; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 } | 371 } |
366 | 372 |
367 void DirectRenderer::SetScissorTestRectInDrawSpace( | 373 void DirectRenderer::SetScissorTestRectInDrawSpace( |
368 const DrawingFrame* frame, | 374 const DrawingFrame* frame, |
369 const gfx::Rect& draw_space_rect) { | 375 const gfx::Rect& draw_space_rect) { |
370 gfx::Rect window_space_rect = | 376 gfx::Rect window_space_rect = |
371 MoveFromDrawToWindowSpace(frame, draw_space_rect); | 377 MoveFromDrawToWindowSpace(frame, draw_space_rect); |
372 SetScissorTestRect(window_space_rect); | 378 SetScissorTestRect(window_space_rect); |
373 } | 379 } |
374 | 380 |
375 void DirectRenderer::FinishDrawingQuadList() {} | |
376 | |
377 void DirectRenderer::DoDrawPolygon(const DrawPolygon& poly, | 381 void DirectRenderer::DoDrawPolygon(const DrawPolygon& poly, |
378 DrawingFrame* frame, | 382 DrawingFrame* frame, |
379 const gfx::Rect& render_pass_scissor, | 383 const gfx::Rect& render_pass_scissor, |
380 bool use_render_pass_scissor) { | 384 bool use_render_pass_scissor) { |
381 SetScissorStateForQuad(frame, *poly.original_ref(), render_pass_scissor, | 385 SetScissorStateForQuad(frame, *poly.original_ref(), render_pass_scissor, |
382 use_render_pass_scissor); | 386 use_render_pass_scissor); |
383 | 387 |
384 // If the poly has not been split, then it is just a normal DrawQuad, | 388 // If the poly has not been split, then it is just a normal DrawQuad, |
385 // and we should save any extra processing that would have to be done. | 389 // and we should save any extra processing that would have to be done. |
386 if (!poly.is_split()) { | 390 if (!poly.is_split()) { |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 auto iter = render_pass_textures_.find(id); | 573 auto iter = render_pass_textures_.find(id); |
570 return iter != render_pass_textures_.end() && iter->second->id(); | 574 return iter != render_pass_textures_.end() && iter->second->id(); |
571 } | 575 } |
572 | 576 |
573 // static | 577 // static |
574 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { | 578 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { |
575 return render_pass->output_rect.size(); | 579 return render_pass->output_rect.size(); |
576 } | 580 } |
577 | 581 |
578 } // namespace cc | 582 } // namespace cc |
OLD | NEW |