diff options
author | Maarten Maathuis <madman2003@gmail.com> | 2008-01-25 23:31:58 +0100 |
---|---|---|
committer | Maarten Maathuis <madman2003@gmail.com> | 2008-01-25 23:31:58 +0100 |
commit | 9f932eb684814e2a04c83d5aee172b9e020d82a3 (patch) | |
tree | d283fba6ab5ada303cb8ee4b7277b569d52dafc3 /src/nv30_exa.c | |
parent | afca5f2665a62ef2d025c15f07fe1cdc2b40d8d5 (diff) | |
download | xorg-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.c | 102 |
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); } } |