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
3 // found in the LICENSE file.
5 #include "cc/quad_culler.h"
7 #include "cc/append_quads_data.h"
8 #include "cc/debug_border_draw_quad.h"
9 #include "cc/debug_colors.h"
10 #include "cc/layer_impl.h"
11 #include "cc/occlusion_tracker.h"
12 #include "cc/overdraw_metrics.h"
13 #include "cc/render_pass.h"
14 #include "third_party/skia/include/core/SkColor.h"
15 #include "ui/gfx/transform.h"
19 QuadCuller::QuadCuller(QuadList
& quadList
, SharedQuadStateList
& sharedQuadStateList
, const LayerImpl
* layer
, const OcclusionTrackerImpl
& occlusionTracker
, bool showCullingWithDebugBorderQuads
, bool forSurface
)
20 : m_quadList(quadList
)
21 , m_sharedQuadStateList(sharedQuadStateList
)
22 , m_currentSharedQuadState(0)
24 , m_occlusionTracker(occlusionTracker
)
25 , m_showCullingWithDebugBorderQuads(showCullingWithDebugBorderQuads
)
26 , m_forSurface(forSurface
)
30 SharedQuadState
* QuadCuller::useSharedQuadState(scoped_ptr
<SharedQuadState
> sharedQuadState
)
32 // FIXME: If all quads are culled for the sharedQuadState, we can drop it from the list.
33 m_currentSharedQuadState
= sharedQuadState
.get();
34 m_sharedQuadStateList
.push_back(sharedQuadState
.Pass());
35 return m_currentSharedQuadState
;
38 static inline bool appendQuadInternal(scoped_ptr
<DrawQuad
> drawQuad
, const gfx::Rect
& culledRect
, QuadList
& quadList
, const OcclusionTrackerImpl
& occlusionTracker
, const LayerImpl
* layer
, bool createDebugBorderQuads
)
40 bool keepQuad
= !culledRect
.IsEmpty();
42 drawQuad
->visible_rect
= culledRect
;
44 occlusionTracker
.overdrawMetrics().didCullForDrawing(drawQuad
->quadTransform(), drawQuad
->rect
, culledRect
);
45 gfx::Rect opaqueDrawRect
= drawQuad
->opacity() == 1.0f
? drawQuad
->opaque_rect
: gfx::Rect();
46 occlusionTracker
.overdrawMetrics().didDraw(drawQuad
->quadTransform(), culledRect
, opaqueDrawRect
);
49 if (createDebugBorderQuads
&& !drawQuad
->IsDebugQuad() && drawQuad
->visible_rect
!= drawQuad
->rect
) {
50 SkColor color
= DebugColors::CulledTileBorderColor();
51 float width
= DebugColors::CulledTileBorderWidth(layer
? layer
->layerTreeImpl() : NULL
);
52 scoped_ptr
<DebugBorderDrawQuad
> debugBorderQuad
= DebugBorderDrawQuad::Create();
53 debugBorderQuad
->SetNew(drawQuad
->shared_quad_state
, drawQuad
->visible_rect
, color
, width
);
54 quadList
.push_back(debugBorderQuad
.PassAs
<DrawQuad
>());
57 // Pass the quad after we're done using it.
58 quadList
.push_back(drawQuad
.Pass());
63 bool QuadCuller::append(scoped_ptr
<DrawQuad
> drawQuad
, AppendQuadsData
& appendQuadsData
)
65 DCHECK(drawQuad
->shared_quad_state
== m_currentSharedQuadState
);
66 DCHECK(!m_sharedQuadStateList
.empty());
67 DCHECK(m_sharedQuadStateList
.back() == m_currentSharedQuadState
);
70 bool hasOcclusionFromOutsideTargetSurface
;
71 bool implDrawTransformIsUnknown
= false;
74 culledRect
= m_occlusionTracker
.unoccludedContributingSurfaceContentRect(m_layer
, false, drawQuad
->rect
, &hasOcclusionFromOutsideTargetSurface
);
76 culledRect
= m_occlusionTracker
.unoccludedContentRect(m_layer
->renderTarget(), drawQuad
->rect
, drawQuad
->quadTransform(), implDrawTransformIsUnknown
, drawQuad
->clippedRectInTarget(), &hasOcclusionFromOutsideTargetSurface
);
78 appendQuadsData
.hadOcclusionFromOutsideTargetSurface
|= hasOcclusionFromOutsideTargetSurface
;
80 return appendQuadInternal(drawQuad
.Pass(), culledRect
, m_quadList
, m_occlusionTracker
, m_layer
, m_showCullingWithDebugBorderQuads
);