| Index: cc/output/direct_renderer.cc
|
| diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
|
| index 0ae4179deaef141473f276f50eb503cba852f5cb..5867fce57771024c64b6f8e57332b122e5eca4f1 100644
|
| --- a/cc/output/direct_renderer.cc
|
| +++ b/cc/output/direct_renderer.cc
|
| @@ -12,8 +12,6 @@
|
| #include "base/metrics/histogram.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "cc/base/math_util.h"
|
| -#include "cc/output/bsp_tree.h"
|
| -#include "cc/output/bsp_walk_action.h"
|
| #include "cc/output/copy_output_request.h"
|
| #include "cc/quads/draw_quad.h"
|
| #include "ui/gfx/geometry/rect_conversions.h"
|
| @@ -301,27 +299,22 @@
|
| EnsureScissorTestDisabled();
|
| }
|
|
|
| -bool DirectRenderer::ShouldSkipQuad(const DrawQuad& quad,
|
| - const gfx::Rect& render_pass_scissor) {
|
| - if (render_pass_scissor.IsEmpty())
|
| - return true;
|
| -
|
| - if (quad.isClipped()) {
|
| - gfx::Rect r = quad.clipRect();
|
| - r.Intersect(render_pass_scissor);
|
| - return r.IsEmpty();
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| void DirectRenderer::SetScissorStateForQuadWithRenderPassScissor(
|
| const DrawingFrame* frame,
|
| const DrawQuad& quad,
|
| - const gfx::Rect& render_pass_scissor) {
|
| + const gfx::Rect& render_pass_scissor,
|
| + bool* should_skip_quad) {
|
| gfx::Rect quad_scissor_rect = render_pass_scissor;
|
| +
|
| if (quad.isClipped())
|
| quad_scissor_rect.Intersect(quad.clipRect());
|
| +
|
| + if (quad_scissor_rect.IsEmpty()) {
|
| + *should_skip_quad = true;
|
| + return;
|
| + }
|
| +
|
| + *should_skip_quad = false;
|
| SetScissorTestRectInDrawSpace(frame, quad_scissor_rect);
|
| }
|
|
|
| @@ -337,46 +330,6 @@
|
|
|
| void DirectRenderer::FinishDrawingQuadList() {}
|
|
|
| -void DirectRenderer::DoDrawPolygon(const DrawPolygon& poly,
|
| - DrawingFrame* frame,
|
| - const gfx::Rect& render_pass_scissor,
|
| - bool using_scissor_as_optimization) {
|
| - if (using_scissor_as_optimization) {
|
| - SetScissorStateForQuadWithRenderPassScissor(frame, *poly.original_ref(),
|
| - render_pass_scissor);
|
| - } else {
|
| - SetScissorStateForQuad(frame, *poly.original_ref());
|
| - }
|
| -
|
| - // If the poly has not been split, then it is just a normal DrawQuad,
|
| - // and we should save any extra processing that would have to be done.
|
| - if (!poly.is_split()) {
|
| - DoDrawQuad(frame, poly.original_ref(), NULL);
|
| - return;
|
| - }
|
| -
|
| - std::vector<gfx::QuadF> quads;
|
| - poly.ToQuads2D(&quads);
|
| - for (size_t i = 0; i < quads.size(); ++i) {
|
| - DoDrawQuad(frame, poly.original_ref(), &quads[i]);
|
| - }
|
| -}
|
| -
|
| -void DirectRenderer::FlushPolygons(ScopedPtrDeque<DrawPolygon>* poly_list,
|
| - DrawingFrame* frame,
|
| - const gfx::Rect& render_pass_scissor,
|
| - bool using_scissor_as_optimization) {
|
| - if (poly_list->empty()) {
|
| - return;
|
| - }
|
| -
|
| - BspTree bsp_tree(poly_list);
|
| - BspWalkActionDrawPolygon action_handler(this, frame, render_pass_scissor,
|
| - using_scissor_as_optimization);
|
| - bsp_tree.TraverseWithActionHandler(&action_handler);
|
| - DCHECK(poly_list->empty());
|
| -}
|
| -
|
| void DirectRenderer::DrawRenderPass(DrawingFrame* frame,
|
| const RenderPass* render_pass) {
|
| TRACE_EVENT0("cc", "DirectRenderer::DrawRenderPass");
|
| @@ -416,49 +369,21 @@
|
| }
|
|
|
| const QuadList& quad_list = render_pass->quad_list;
|
| - ScopedPtrDeque<DrawPolygon> poly_list;
|
| -
|
| - int next_polygon_id = 0;
|
| - int last_sorting_context_id = 0;
|
| for (auto it = quad_list.BackToFrontBegin(); it != quad_list.BackToFrontEnd();
|
| ++it) {
|
| const DrawQuad& quad = **it;
|
| - gfx::QuadF send_quad(quad.visible_rect);
|
| -
|
| - if (using_scissor_as_optimization &&
|
| - ShouldSkipQuad(quad, render_pass_scissor)) {
|
| - continue;
|
| - }
|
| -
|
| - if (last_sorting_context_id != quad.shared_quad_state->sorting_context_id) {
|
| - last_sorting_context_id = quad.shared_quad_state->sorting_context_id;
|
| - FlushPolygons(&poly_list, frame, render_pass_scissor,
|
| - using_scissor_as_optimization);
|
| - }
|
| -
|
| - // This layer is in a 3D sorting context so we add it to the list of
|
| - // polygons to go into the BSP tree.
|
| - if (quad.shared_quad_state->sorting_context_id != 0) {
|
| - scoped_ptr<DrawPolygon> new_polygon(new DrawPolygon(
|
| - *it, quad.visible_rect, quad.quadTransform(), next_polygon_id++));
|
| - if (new_polygon->points().size() > 2u) {
|
| - poly_list.push_back(new_polygon.Pass());
|
| - }
|
| - continue;
|
| - }
|
| -
|
| - // We are not in a 3d sorting context, so we should draw the quad normally.
|
| + bool should_skip_quad = false;
|
| +
|
| if (using_scissor_as_optimization) {
|
| - SetScissorStateForQuadWithRenderPassScissor(frame, quad,
|
| - render_pass_scissor);
|
| + SetScissorStateForQuadWithRenderPassScissor(
|
| + frame, quad, render_pass_scissor, &should_skip_quad);
|
| } else {
|
| SetScissorStateForQuad(frame, quad);
|
| }
|
|
|
| - DoDrawQuad(frame, &quad, nullptr);
|
| - }
|
| - FlushPolygons(&poly_list, frame, render_pass_scissor,
|
| - using_scissor_as_optimization);
|
| + if (!should_skip_quad)
|
| + DoDrawQuad(frame, &quad);
|
| + }
|
| FinishDrawingQuadList();
|
| }
|
|
|
|
|