Index: cc/layer_tree_host_impl.cc |
diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc |
index 408e8417971f300adfce4cb83a855ddaf80153bc..dd6d1f57d7d8d7a0665a007cbac47f0541969566 100644 |
--- a/cc/layer_tree_host_impl.cc |
+++ b/cc/layer_tree_host_impl.cc |
@@ -481,8 +481,6 @@ static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* roo |
// doesn't have any bounds and so can't generate this itself. |
// FIXME: Make the gutter quads generated by the solid color layer (make it smarter about generating quads to fill unoccluded areas). |
- DCHECK(rootLayer->screenSpaceTransform().IsInvertible()); |
- |
gfx::Rect rootTargetRect = rootLayer->renderSurface()->contentRect(); |
float opacity = 1; |
SharedQuadState* sharedQuadState = quadCuller.useSharedQuadState(SharedQuadState::Create()); |
@@ -494,10 +492,16 @@ static void appendQuadsToFillScreen(RenderPass* targetRenderPass, LayerImpl* roo |
opacity); |
AppendQuadsData appendQuadsData; |
- gfx::Transform transformToLayerSpace = MathUtil::inverse(rootLayer->screenSpaceTransform()); |
+ |
+ // Even though we always expect the screen space transform to be invertible if we |
+ // reach this code, we still try to handle the uninvertible case for Release mode. |
+ DCHECK(rootLayer->screenSpaceTransform().IsInvertible()); |
+ gfx::Transform transformToLayerSpace(gfx::Transform::kSkipInitialization); |
+ if (!rootLayer->screenSpaceTransform().GetInverse(&transformToLayerSpace)) |
+ transformToLayerSpace.MakeIdentity(); |
for (Region::Iterator fillRects(fillRegion); fillRects.has_rect(); fillRects.next()) { |
// The root layer transform is composed of translations and scales only, |
- // no perspective, so mapping is sufficient. |
+ // no perspective, so mapping is sufficient (as opposed to projecting). |
gfx::Rect layerRect = MathUtil::mapClippedRect(transformToLayerSpace, fillRects.rect()); |
// Skip the quad culler and just append the quads directly to avoid |
// occlusion checks. |
@@ -1264,9 +1268,12 @@ InputHandlerClient::ScrollStatus LayerTreeHostImpl::scrollBegin(gfx::Point viewp |
static gfx::Vector2dF scrollLayerWithViewportSpaceDelta(PinchZoomViewport* viewport, LayerImpl& layerImpl, float scaleFromViewportToScreenSpace, gfx::PointF viewportPoint, gfx::Vector2dF viewportDelta) |
{ |
// Layers with non-invertible screen space transforms should not have passed the scroll hit |
- // test in the first place. |
+ // test in the first place. Even though we always expect the screen space transform to be invertible |
+ // if we reach this code, we still try to handle the uninvertible case for Release mode. |
DCHECK(layerImpl.screenSpaceTransform().IsInvertible()); |
- gfx::Transform inverseScreenSpaceTransform = MathUtil::inverse(layerImpl.screenSpaceTransform()); |
+ gfx::Transform inverseScreenSpaceTransform(gfx::Transform::kSkipInitialization); |
+ if (!layerImpl.screenSpaceTransform().GetInverse(&inverseScreenSpaceTransform)) |
+ inverseScreenSpaceTransform.MakeIdentity(); |
gfx::PointF screenSpacePoint = gfx::ScalePoint(viewportPoint, scaleFromViewportToScreenSpace); |