зеркало из https://github.com/mozilla/gecko-dev.git
Bug 607653 - avoid temporary fbos/textures on transformed layers, when possible. r=roc a=approval2.0
This commit is contained in:
Родитель
5e5c60f5e0
Коммит
4d098d2cca
|
@ -332,7 +332,9 @@ ContainerLayer::DefaultComputeEffectiveTransforms(const gfx3DMatrix& aTransformT
|
|||
useIntermediateSurface = PR_TRUE;
|
||||
} else {
|
||||
useIntermediateSurface = PR_FALSE;
|
||||
if (!mEffectiveTransform.IsIdentity()) {
|
||||
gfxMatrix contTransform;
|
||||
if (!mEffectiveTransform.Is2D(&contTransform) ||
|
||||
!contTransform.PreservesAxisAlignedRectangles()) {
|
||||
for (Layer* child = GetFirstChild(); child; child = child->GetNextSibling()) {
|
||||
const nsIntRect *clipRect = child->GetEffectiveClipRect();
|
||||
/* We can't (easily) forward our transform to children with a non-empty clip
|
||||
|
|
|
@ -171,6 +171,7 @@ ContainerLayerD3D10::RenderLayer()
|
|||
|
||||
gfx3DMatrix oldViewMatrix;
|
||||
|
||||
gfxMatrix contTransform;
|
||||
if (useIntermediate) {
|
||||
device()->OMGetRenderTargets(1, getter_AddRefs(previousRTView), NULL);
|
||||
|
||||
|
@ -203,6 +204,12 @@ ContainerLayerD3D10::RenderLayer()
|
|||
|
||||
previousViewportSize = mD3DManager->GetViewport();
|
||||
mD3DManager->SetViewport(nsIntSize(visibleRect.Size()));
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
PRBool is2d =
|
||||
#endif
|
||||
GetEffectiveTransform().Is2D(&contTransform);
|
||||
NS_ASSERTION(is2d, "Transform must be 2D");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -239,6 +246,24 @@ ContainerLayerD3D10::RenderLayer()
|
|||
|
||||
D3D10_RECT d3drect;
|
||||
if (!useIntermediate) {
|
||||
if (clipRect) {
|
||||
gfxRect cliprect(r.left, r.top, r.right - r.left, r.bottom - r.top);
|
||||
gfxRect trScissor = contTransform.TransformBounds(cliprect);
|
||||
trScissor.Round();
|
||||
nsIntRect trIntScissor;
|
||||
if (gfxUtils::GfxRectToIntRect(trScissor, &trIntScissor)) {
|
||||
r.left = trIntScissor.x;
|
||||
r.top = trIntScissor.y;
|
||||
r.right = trIntScissor.XMost();
|
||||
r.bottom = trIntScissor.YMost();
|
||||
} else {
|
||||
r.left = 0;
|
||||
r.top = 0;
|
||||
r.right = visibleRect.width;
|
||||
r.bottom = visibleRect.height;
|
||||
clipRect = nsnull;
|
||||
}
|
||||
}
|
||||
// Scissor rect should be an intersection of the old and current scissor.
|
||||
r.left = NS_MAX<PRInt32>(oldScissor.left, r.left);
|
||||
r.right = NS_MIN<PRInt32>(oldScissor.right, r.right);
|
||||
|
|
|
@ -166,6 +166,7 @@ ContainerLayerD3D9::RenderLayer()
|
|||
nsIntRect visibleRect = mVisibleRegion.GetBounds();
|
||||
PRBool useIntermediate = UseIntermediateSurface();
|
||||
|
||||
gfxMatrix contTransform;
|
||||
if (useIntermediate) {
|
||||
device()->GetRenderTarget(0, getter_AddRefs(previousRenderTarget));
|
||||
device()->CreateTexture(visibleRect.width, visibleRect.height, 1,
|
||||
|
@ -193,6 +194,12 @@ ContainerLayerD3D9::RenderLayer()
|
|||
|
||||
device()->GetVertexShaderConstantF(CBmProjection, &oldViewMatrix[0][0], 4);
|
||||
device()->SetVertexShaderConstantF(CBmProjection, &viewMatrix._11, 4);
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
PRBool is2d =
|
||||
#endif
|
||||
GetEffectiveTransform().Is2D(&contTransform);
|
||||
NS_ASSERTION(is2d, "Transform must be 2D");
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -230,6 +237,25 @@ ContainerLayerD3D9::RenderLayer()
|
|||
renderSurface->GetDesc(&desc);
|
||||
|
||||
if (!useIntermediate) {
|
||||
// Transform clip rect
|
||||
if (clipRect) {
|
||||
gfxRect cliprect(r.left, r.top, r.right - r.left, r.bottom - r.top);
|
||||
gfxRect trScissor = contTransform.TransformBounds(cliprect);
|
||||
trScissor.Round();
|
||||
nsIntRect trIntScissor;
|
||||
if (gfxUtils::GfxRectToIntRect(trScissor, &trIntScissor)) {
|
||||
r.left = trIntScissor.x;
|
||||
r.top = trIntScissor.y;
|
||||
r.right = trIntScissor.XMost();
|
||||
r.bottom = trIntScissor.YMost();
|
||||
} else {
|
||||
r.left = 0;
|
||||
r.top = 0;
|
||||
r.right = visibleRect.width;
|
||||
r.bottom = visibleRect.height;
|
||||
clipRect = nsnull;
|
||||
}
|
||||
}
|
||||
// Intersect with current clip rect.
|
||||
r.left = NS_MAX<PRInt32>(oldClipRect.left, r.left);
|
||||
r.right = NS_MIN<PRInt32>(oldClipRect.right, r.right);
|
||||
|
|
|
@ -160,6 +160,7 @@ ContainerRender(Container* aContainer,
|
|||
float opacity = aContainer->GetEffectiveOpacity();
|
||||
const gfx3DMatrix& transform = aContainer->GetEffectiveTransform();
|
||||
bool needsFramebuffer = aContainer->UseIntermediateSurface();
|
||||
gfxMatrix contTransform;
|
||||
if (needsFramebuffer) {
|
||||
aManager->CreateFBOWithTexture(visibleRect.width,
|
||||
visibleRect.height,
|
||||
|
@ -176,6 +177,11 @@ ContainerRender(Container* aContainer,
|
|||
aContainer->gl()->fClear(LOCAL_GL_COLOR_BUFFER_BIT);
|
||||
} else {
|
||||
frameBuffer = aPreviousFrameBuffer;
|
||||
#ifdef DEBUG
|
||||
PRBool is2d =
|
||||
#endif
|
||||
transform.Is2D(&contTransform);
|
||||
NS_ASSERTION(is2d, "Transform must be 2D");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -197,6 +203,14 @@ ContainerRender(Container* aContainer,
|
|||
continue;
|
||||
}
|
||||
scissorRect = *clipRect;
|
||||
if (!needsFramebuffer) {
|
||||
gfxRect r(scissorRect.x, scissorRect.y, scissorRect.width, scissorRect.height);
|
||||
gfxRect trScissor = contTransform.TransformBounds(r);
|
||||
trScissor.Round();
|
||||
if (!gfxUtils::GfxRectToIntRect(trScissor, &scissorRect)) {
|
||||
scissorRect = visibleRect;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (needsFramebuffer) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче