1 // Copyright 2011 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 "cc/render_pass.h"
9 #include "cc/layer_impl.h"
10 #include "cc/math_util.h"
11 #include "cc/occlusion_tracker.h"
12 #include "cc/quad_culler.h"
13 #include "cc/shared_quad_state.h"
14 #include "cc/solid_color_draw_quad.h"
15 #include "third_party/skia/include/core/SkImageFilter.h"
17 using WebKit::WebTransformationMatrix
;
21 scoped_ptr
<RenderPass
> RenderPass::create(Id id
, gfx::Rect outputRect
, const WebKit::WebTransformationMatrix
& transformToRootTarget
)
23 return make_scoped_ptr(new RenderPass(id
, outputRect
, transformToRootTarget
));
26 RenderPass::RenderPass(Id id
, gfx::Rect outputRect
, const WebKit::WebTransformationMatrix
& transformToRootTarget
)
28 , m_transformToRootTarget(transformToRootTarget
)
29 , m_outputRect(outputRect
)
30 , m_hasTransparentBackground(true)
31 , m_hasOcclusionFromOutsideTargetSurface(false)
34 DCHECK(id
.layerId
> 0);
35 DCHECK(id
.index
>= 0);
38 RenderPass::~RenderPass()
40 SkSafeUnref(m_filter
);
43 scoped_ptr
<RenderPass
> RenderPass::copy(Id newId
) const
45 DCHECK(newId
!= m_id
);
47 scoped_ptr
<RenderPass
> copyPass(create(newId
, m_outputRect
, m_transformToRootTarget
));
48 copyPass
->setDamageRect(m_damageRect
);
49 copyPass
->setHasTransparentBackground(m_hasTransparentBackground
);
50 copyPass
->setHasOcclusionFromOutsideTargetSurface(m_hasOcclusionFromOutsideTargetSurface
);
51 copyPass
->setFilters(m_filters
);
52 copyPass
->setBackgroundFilters(m_backgroundFilters
);
53 copyPass
->setFilter(m_filter
);
54 return copyPass
.Pass();
57 void RenderPass::appendQuadsForLayer(LayerImpl
* layer
, OcclusionTrackerImpl
* occlusionTracker
, AppendQuadsData
& appendQuadsData
)
59 const bool forSurface
= false;
60 QuadCuller
quadCuller(m_quadList
, m_sharedQuadStateList
, layer
, occlusionTracker
, layer
->hasDebugBorders(), forSurface
);
62 layer
->appendQuads(quadCuller
, appendQuadsData
);
65 void RenderPass::appendQuadsForRenderSurfaceLayer(LayerImpl
* layer
, const RenderPass
* contributingRenderPass
, OcclusionTrackerImpl
* occlusionTracker
, AppendQuadsData
& appendQuadsData
)
67 const bool forSurface
= true;
68 QuadCuller
quadCuller(m_quadList
, m_sharedQuadStateList
, layer
, occlusionTracker
, layer
->hasDebugBorders(), forSurface
);
70 bool isReplica
= false;
71 layer
->renderSurface()->appendQuads(quadCuller
, appendQuadsData
, isReplica
, contributingRenderPass
->id());
73 // Add replica after the surface so that it appears below the surface.
74 if (layer
->hasReplica()) {
76 layer
->renderSurface()->appendQuads(quadCuller
, appendQuadsData
, isReplica
, contributingRenderPass
->id());
80 void RenderPass::appendQuadsToFillScreen(LayerImpl
* rootLayer
, SkColor screenBackgroundColor
, const OcclusionTrackerImpl
& occlusionTracker
)
82 if (!rootLayer
|| !screenBackgroundColor
)
85 Region fillRegion
= occlusionTracker
.computeVisibleRegionInScreen();
86 if (fillRegion
.IsEmpty())
89 bool forSurface
= false;
90 QuadCuller
quadCuller(m_quadList
, m_sharedQuadStateList
, rootLayer
, &occlusionTracker
, rootLayer
->hasDebugBorders(), forSurface
);
92 // Manually create the quad state for the gutter quads, as the root layer
93 // doesn't have any bounds and so can't generate this itself.
94 // FIXME: Make the gutter quads generated by the solid color layer (make it smarter about generating quads to fill unoccluded areas).
95 gfx::Rect rootTargetRect
= rootLayer
->renderSurface()->contentRect();
98 SharedQuadState
* sharedQuadState
= quadCuller
.useSharedQuadState(SharedQuadState::create(rootLayer
->drawTransform(), rootTargetRect
, rootTargetRect
, opacity
, opaque
));
99 DCHECK(rootLayer
->screenSpaceTransform().isInvertible());
100 WebTransformationMatrix transformToLayerSpace
= rootLayer
->screenSpaceTransform().inverse();
101 for (Region::Iterator
fillRects(fillRegion
); fillRects
.has_rect(); fillRects
.next()) {
102 // The root layer transform is composed of translations and scales only, no perspective, so mapping is sufficient.
103 gfx::Rect layerRect
= MathUtil::mapClippedRect(transformToLayerSpace
, fillRects
.rect());
104 // Skip the quad culler and just append the quads directly to avoid occlusion checks.
105 m_quadList
.append(SolidColorDrawQuad::create(sharedQuadState
, layerRect
, screenBackgroundColor
).PassAs
<DrawQuad
>());
109 void RenderPass::setFilter(SkImageFilter
* filter
) {
110 SkRefCnt_SafeAssign(m_filter
, filter
);