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.
7 #include "CCQuadCuller.h"
9 #include "CCAppendQuadsData.h"
10 #include "CCDebugBorderDrawQuad.h"
11 #include "CCLayerImpl.h"
12 #include "CCOcclusionTracker.h"
13 #include "CCOverdrawMetrics.h"
14 #include "CCRenderPass.h"
16 #include "third_party/skia/include/core/SkColor.h"
17 #include <public/WebTransformationMatrix.h>
23 static const int debugTileBorderWidth
= 1;
24 static const int debugTileBorderAlpha
= 120;
25 static const int debugTileBorderColorRed
= 160;
26 static const int debugTileBorderColorGreen
= 100;
27 static const int debugTileBorderColorBlue
= 0;
29 CCQuadCuller::CCQuadCuller(CCQuadList
& quadList
, CCSharedQuadStateList
& sharedQuadStateList
, CCLayerImpl
* layer
, const CCOcclusionTrackerImpl
* occlusionTracker
, bool showCullingWithDebugBorderQuads
, bool forSurface
)
30 : m_quadList(quadList
)
31 , m_sharedQuadStateList(sharedQuadStateList
)
32 , m_currentSharedQuadState(0)
34 , m_occlusionTracker(occlusionTracker
)
35 , m_showCullingWithDebugBorderQuads(showCullingWithDebugBorderQuads
)
36 , m_forSurface(forSurface
)
40 CCSharedQuadState
* CCQuadCuller::useSharedQuadState(scoped_ptr
<CCSharedQuadState
> sharedQuadState
)
42 sharedQuadState
->id
= m_sharedQuadStateList
.size();
44 // FIXME: If all quads are culled for the sharedQuadState, we can drop it from the list.
45 m_currentSharedQuadState
= sharedQuadState
.get();
46 m_sharedQuadStateList
.append(sharedQuadState
.Pass());
47 return m_currentSharedQuadState
;
50 static inline bool appendQuadInternal(scoped_ptr
<CCDrawQuad
> drawQuad
, const IntRect
& culledRect
, CCQuadList
& quadList
, const CCOcclusionTrackerImpl
& occlusionTracker
, bool createDebugBorderQuads
)
52 bool keepQuad
= !culledRect
.isEmpty();
54 drawQuad
->setQuadVisibleRect(culledRect
);
56 occlusionTracker
.overdrawMetrics().didCullForDrawing(drawQuad
->quadTransform(), drawQuad
->quadRect(), culledRect
);
57 occlusionTracker
.overdrawMetrics().didDraw(drawQuad
->quadTransform(), culledRect
, drawQuad
->opaqueRect());
60 if (createDebugBorderQuads
&& !drawQuad
->isDebugQuad() && drawQuad
->quadVisibleRect() != drawQuad
->quadRect()) {
61 SkColor borderColor
= SkColorSetARGB(debugTileBorderAlpha
, debugTileBorderColorRed
, debugTileBorderColorGreen
, debugTileBorderColorBlue
);
62 quadList
.append(CCDebugBorderDrawQuad::create(drawQuad
->sharedQuadState(), drawQuad
->quadVisibleRect(), borderColor
, debugTileBorderWidth
).PassAs
<CCDrawQuad
>());
65 // Pass the quad after we're done using it.
66 quadList
.append(drawQuad
.Pass());
71 bool CCQuadCuller::append(scoped_ptr
<CCDrawQuad
> drawQuad
, CCAppendQuadsData
& appendQuadsData
)
73 ASSERT(drawQuad
->sharedQuadState() == m_currentSharedQuadState
);
74 ASSERT(drawQuad
->sharedQuadStateId() == m_currentSharedQuadState
->id
);
75 ASSERT(!m_sharedQuadStateList
.isEmpty());
76 ASSERT(m_sharedQuadStateList
.last() == m_currentSharedQuadState
);
79 bool hasOcclusionFromOutsideTargetSurface
;
82 culledRect
= m_occlusionTracker
->unoccludedContributingSurfaceContentRect(m_layer
, false, drawQuad
->quadRect(), &hasOcclusionFromOutsideTargetSurface
);
84 culledRect
= m_occlusionTracker
->unoccludedContentRect(m_layer
, drawQuad
->quadRect(), &hasOcclusionFromOutsideTargetSurface
);
86 appendQuadsData
.hadOcclusionFromOutsideTargetSurface
|= hasOcclusionFromOutsideTargetSurface
;
88 return appendQuadInternal(drawQuad
.Pass(), culledRect
, m_quadList
, *m_occlusionTracker
, m_showCullingWithDebugBorderQuads
);