Bug 607653 - avoid temporary fbos/textures on transformed layers, when possible. r=roc a=approval2.0

This commit is contained in:
Oleg Romashin 2010-11-30 08:02:46 +02:00
Родитель 5e5c60f5e0
Коммит 4d098d2cca
4 изменённых файлов: 68 добавлений и 1 удалений

Просмотреть файл

@ -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) {