summaryrefslogtreecommitdiff
path: root/src/nv30_exa.c
diff options
context:
space:
mode:
authorMaarten Maathuis <madman2003@gmail.com>2008-01-25 23:31:58 +0100
committerMaarten Maathuis <madman2003@gmail.com>2008-01-25 23:31:58 +0100
commit9f932eb684814e2a04c83d5aee172b9e020d82a3 (patch)
treed283fba6ab5ada303cb8ee4b7277b569d52dafc3 /src/nv30_exa.c
parentafca5f2665a62ef2d025c15f07fe1cdc2b40d8d5 (diff)
downloadxorg-driver-xf86-video-nouveau-9f932eb684814e2a04c83d5aee172b9e020d82a3.tar.gz
NV30EXA: Fix viewport setup + switch to triangle based composite.
Diffstat (limited to 'src/nv30_exa.c')
-rw-r--r--src/nv30_exa.c102
1 files changed, 51 insertions, 51 deletions
diff --git a/src/nv30_exa.c b/src/nv30_exa.c
index 3a003fc..85cba07 100644
--- a/src/nv30_exa.c
+++ b/src/nv30_exa.c
@@ -408,25 +408,26 @@ NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict)
uint32_t pitch = (uint32_t)exaGetPixmapPitch(pPix);
- int x = pPict->pDrawable->x;
- int y = pPict->pDrawable->y;
- int w = pPict->pDrawable->width;
- int h = pPict->pDrawable->height;
- BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_HORIZ, 5);
- OUT_RING ((w<<16)|x);
- OUT_RING ((h<<16)|y);
+ BEGIN_RING(Nv3D, NV34TCL_RT_FORMAT, 3);
OUT_RING (fmt->card_fmt); /* format */
OUT_RING (pitch << 16 | pitch);
OUT_PIXMAPl(pPix, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
- BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 2);
- OUT_RING ((w-1+x)<<16);
- OUT_RING ((h-1+y)<<16);
- BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1);
+ /* This is confirmed to be needed for nv30, please leave it alone. */
if (pNv->NVArch == 0x30) {
+ int x = pPict->pDrawable->x;
+ int y = pPict->pDrawable->y;
+ int w = pPict->pDrawable->width;
+ int h = pPict->pDrawable->height;
+
+ BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_HORIZ, 2);
+ OUT_RING ((w<<16)|x);
+ OUT_RING ((h<<16)|y);
+ BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 2);
+ OUT_RING ((w-1+x)<<16);
+ OUT_RING ((h-1+y)<<16);
+ BEGIN_RING(Nv3D, NV34TCL_VIEWPORT_TX_ORIGIN, 1);
OUT_RING((y<<16)|x);
- } else {
- OUT_RING(0);
}
return TRUE;
@@ -553,7 +554,7 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict,
OUT_RING (pmPict?3:1);
BEGIN_RING(Nv3D, NV34TCL_VERTEX_BEGIN_END, 1);
- OUT_RING (8); /* GL_QUADS */
+ OUT_RING (NV34TCL_VERTEX_BEGIN_END_TRIANGLES);
return TRUE;
}
@@ -602,55 +603,54 @@ NV30EXAComposite(PixmapPtr pdPix, int srcX , int srcY,
{
ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
NVPtr pNv = NVPTR(pScrn);
- float sX0, sX1, sX2, sY0, sY1, sY2, sX3, sY3;
- float mX0, mX1, mX2, mY0, mY1, mY2, mX3, mY3;
+ float sX0, sX1, sX2, sY0, sY1, sY2;
+ float mX0, mX1, mX2, mY0, mY1, mY2;
NV30EXA_STATE;
+ /* We're drawing a triangle, we need to scissor it to a quad. */
+ /* The scissors are here for a good reason, we don't get the full image, but just a part. */
+ /* Handling the cliprects is done for us already. */
+ BEGIN_RING(Nv3D, NV34TCL_SCISSOR_HORIZ, 2);
+ OUT_RING ((width << 16) | dstX);
+ OUT_RING ((height << 16) | dstY);
+
#if 0
ErrorF("Composite [%dx%d] (%d,%d)IN(%d,%d)OP(%d,%d)\n",width,height,srcX,srcY,maskX,maskY,dstX,dstY);
#endif
- NV30EXATransformCoord(state->unit[0].transform, srcX, srcY,
- state->unit[0].width,
- state->unit[0].height, &sX0, &sY0);
- NV30EXATransformCoord(state->unit[0].transform,
- srcX + width, srcY,
- state->unit[0].width,
- state->unit[0].height, &sX1, &sY1);
+ NV30EXATransformCoord(state->unit[0].transform,
+ srcX, srcY - height,
+ state->unit[0].width,
+ state->unit[0].height, &sX0, &sY0);
NV30EXATransformCoord(state->unit[0].transform,
- srcX + width, srcY + height,
- state->unit[0].width,
- state->unit[0].height, &sX2, &sY2);
+ srcX, srcY + height,
+ state->unit[0].width,
+ state->unit[0].height, &sX1, &sY1);
NV30EXATransformCoord(state->unit[0].transform,
- srcX, srcY + height,
- state->unit[0].width,
- state->unit[0].height, &sX3, &sY3);
+ srcX + 2*width, srcY + height,
+ state->unit[0].width,
+ state->unit[0].height, &sX2, &sY2);
if (state->have_mask) {
- NV30EXATransformCoord(state->unit[1].transform, maskX, maskY,
- state->unit[1].width,
- state->unit[1].height, &mX0, &mY0);
+ NV30EXATransformCoord(state->unit[1].transform,
+ maskX, maskY - height,
+ state->unit[1].width,
+ state->unit[1].height, &mX0, &mY0);
NV30EXATransformCoord(state->unit[1].transform,
- maskX + width, maskY,
- state->unit[1].width,
- state->unit[1].height, &mX1, &mY1);
+ maskX, maskY + height,
+ state->unit[1].width,
+ state->unit[1].height, &mX1, &mY1);
NV30EXATransformCoord(state->unit[1].transform,
- maskX + width, maskY + height,
- state->unit[1].width,
- state->unit[1].height, &mX2, &mY2);
- NV30EXATransformCoord(state->unit[1].transform,
- maskX, maskY + height,
- state->unit[1].width,
- state->unit[1].height, &mX3, &mY3);
-
- CV_OUTm(sX0 , sY0 , mX0, mY0, dstX , dstY);
- CV_OUTm(sX1 , sY1 , mX1, mY1, dstX + width, dstY);
- CV_OUTm(sX2 , sY2 , mX2, mY2, dstX + width, dstY + height);
- CV_OUTm(sX3 , sY3 , mX3, mY3, dstX , dstY + height);
+ maskX + 2*width, maskY + height,
+ state->unit[1].width,
+ state->unit[1].height, &mX2, &mY2);
+
+ CV_OUTm(sX0 , sY0 , mX0, mY0, dstX , dstY - height);
+ CV_OUTm(sX1 , sY1 , mX1, mY1, dstX , dstY + height);
+ CV_OUTm(sX2 , sY2 , mX2, mY2, dstX + 2*width , dstY + height);
} else {
- CV_OUT(sX0 , sY0 , dstX , dstY);
- CV_OUT(sX1 , sY1 , dstX + width, dstY);
- CV_OUT(sX2 , sY2 , dstX + width, dstY + height);
- CV_OUT(sX3 , sY3 , dstX , dstY + height);
+ CV_OUT(sX0 , sY0 , dstX , dstY - height);
+ CV_OUT(sX1 , sY1 , dstX , dstY + height);
+ CV_OUT(sX2 , sY2 , dstX + 2*width , dstY + height);
}
}