| 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 |