configure.ac | 2 src/Makefile.am | 4 src/drmmode_display.c | 30 - src/nouveau_dri2.c | 32 - src/nouveau_exa.c | 29 - src/nouveau_local.h | 186 ++++++--- src/nouveau_wfb.c | 4 src/nouveau_xv.c | 69 ++- src/nv04_accel.h | 83 ++++ src/nv04_exa.c | 524 ++++++++++++-------------- src/nv04_xv_blit.c | 262 ++++++------- src/nv10_exa.c | 857 +++++++++++++++++++------------------------ src/nv30_exa.c | 975 +++++++++++++++++++++++++------------------------ src/nv30_shaders.c | 347 ----------------- src/nv30_shaders.h | 72 --- src/nv30_xv_tex.c | 302 +++++---------- src/nv40_exa.c | 994 +++++++++++++++++++++++++++++++------------------- src/nv40_xv_tex.c | 293 ++++++-------- src/nv50_accel.c | 670 +++++++++++++++++---------------- src/nv50_accel.h | 66 ++- src/nv50_exa.c | 895 ++++++++++++++++++++------------------------- src/nv50_xv.c | 381 +++++++------------ src/nv_accel_common.c | 582 ++++++++++++++--------------- src/nv_dma.c | 77 ++- src/nv_dma.h | 4 src/nv_driver.c | 43 +- src/nv_include.h | 11 src/nv_proto.h | 7 src/nv_shadow.c | 3 src/nv_type.h | 53 +- src/nvc0_accel.c | 841 +++++++++--------------------------------- src/nvc0_accel.h | 120 +++--- src/nvc0_exa.c | 974 +++++++++++++++++++++++------------------------- src/nvc0_shader.h | 444 ++++++++++++++++++++++ src/nvc0_xv.c | 374 +++++++----------- src/nve0_shader.h | 460 +++++++++++++++++++++++ 36 files changed, 5568 insertions(+), 5502 deletions(-)
New commits: commit 581564466c47ab0435ecca3cf4d82c03e1b30259 Author: Francisco Jerez <curroje...@riseup.net> Date: Tue May 8 14:02:44 2012 +0200 dri2: Don't try to page-flip pixmaps (fdo bug 49351). Reported-by: Marcin Slusarz <marcin.slus...@gmail.com> Signed-off-by: Francisco Jerez <curroje...@riseup.net> diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c index 73f2fc1..7e47575 100644 --- a/src/nouveau_dri2.c +++ b/src/nouveau_dri2.c @@ -328,7 +328,7 @@ nouveau_dri2_finish_swap(DrawablePtr draw, unsigned int frame, type = DRI2_EXCHANGE_COMPLETE; DamageRegionAppend(draw, ®); - if (DRI2CanFlip(draw)) { + if (nouveau_exa_pixmap_is_onscreen(dst_pix)) { type = DRI2_FLIP_COMPLETE; ret = drmmode_page_flip(draw, src_pix, violate_oml(draw) ? NULL : s, commit b1efc807392d372e6a232aad9d16ae6e1b1c1916 Author: Marcin Slusarz <marcin.slus...@gmail.com> Date: Sun Apr 15 13:46:42 2012 +0200 nv50: add missing pushbuf space check in NV50SyncToVBlank Regression from "WIP: port to new libdrm". diff --git a/src/nv50_accel.c b/src/nv50_accel.c index e140db9..42b27f0 100644 --- a/src/nv50_accel.c +++ b/src/nv50_accel.c @@ -44,6 +44,9 @@ NV50SyncToVBlank(PixmapPtr ppix, BoxPtr box) if (!crtcs) return; + if (!PUSH_SPACE(push, 10)) + return; + BEGIN_NV04(push, SUBC_NVSW(0x0060), 2); PUSH_DATA (push, pNv->vblank_sem->handle); PUSH_DATA (push, 0); commit 174f17072005971fee6e4eb76a273c3cc1aa10d3 Author: Ben Skeggs <bske...@redhat.com> Date: Tue Apr 24 21:55:03 2012 +1000 nv40/exa: return false from gradient picture setup Not implemented yet. Shouldn't hit this anyway, fallback in check_composite, but, best be safe :) Reported-by: Maarten Maathuis <madman2...@gmail.com> Signed-off-by: Ben Skeggs <bske...@redhat.com> diff --git a/src/nv40_exa.c b/src/nv40_exa.c index 10f15f1..2361552 100644 --- a/src/nv40_exa.c +++ b/src/nv40_exa.c @@ -233,7 +233,7 @@ NV40EXAPictSolid(NVPtr pNv, PicturePtr pPict, int unit) static Bool NV40EXAPictGradient(NVPtr pNv, PicturePtr pPict, int unit) { - return TRUE; + return FALSE; } static Bool commit 60edf2a87b928f413385443335493cb27da30a48 Author: Ben Skeggs <bske...@redhat.com> Date: Tue Apr 24 10:54:51 2012 +1000 nv40/exa: support for solid pictures Signed-off-by: Ben Skeggs <bske...@redhat.com> diff --git a/src/nv04_accel.h b/src/nv04_accel.h index 7100e85..e7b76c5 100644 --- a/src/nv04_accel.h +++ b/src/nv04_accel.h @@ -17,6 +17,7 @@ #define PFP_NV12_BILINEAR 0x00000700 #define PFP_NV12_BICUBIC 0x00000800 #define XV_TABLE 0x00001000 +#define SOLID(i) (0x00002000 + (i) * 0x100) /* subchannel assignments */ #define SUBC_M2MF(mthd) 0, (mthd) diff --git a/src/nv40_exa.c b/src/nv40_exa.c index fb9ec80..10f15f1 100644 --- a/src/nv40_exa.c +++ b/src/nv40_exa.c @@ -181,9 +181,64 @@ NV40_SetupBlend(ScrnInfoPtr pScrn, nv_pict_op_t *blend, } static Bool -NV40EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit) +NV40EXAPictSolid(NVPtr pNv, PicturePtr pPict, int unit) +{ + struct nouveau_pushbuf *push = pNv->pushbuf; + + PUSH_DATAu(push, pNv->scratch, SOLID(unit), 2); + PUSH_DATA (push, pPict->pSourcePict->solidFill.color); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV30_3D(TEX_OFFSET(unit)), 8); + PUSH_MTHDl(push, NV30_3D(TEX_OFFSET(unit)), pNv->scratch, SOLID(unit), + NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); + PUSH_DATA (push, NV40_3D_TEX_FORMAT_FORMAT_A8R8G8B8 | 0x8000 | + NV40_3D_TEX_FORMAT_LINEAR | + NV30_3D_TEX_FORMAT_DIMS_2D | + NV30_3D_TEX_FORMAT_NO_BORDER | + (1 << NV40_3D_TEX_FORMAT_MIPMAP_COUNT__SHIFT) | + NV30_3D_TEX_FORMAT_DMA0); + PUSH_DATA (push, NV30_3D_TEX_WRAP_S_REPEAT | + NV30_3D_TEX_WRAP_T_REPEAT | + NV30_3D_TEX_WRAP_R_REPEAT); + PUSH_DATA (push, NV40_3D_TEX_ENABLE_ENABLE); + PUSH_DATA (push, 0x0000aae4); + PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_NEAREST | + NV30_3D_TEX_FILTER_MAG_NEAREST | 0x3fd6); + PUSH_DATA (push, 0x00010001); + PUSH_DATA (push, 0x00000000); + BEGIN_NV04(push, NV40_3D(TEX_SIZE1(unit)), 1); + PUSH_DATA (push, 0x00100040); + + BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 17); + PUSH_DATA (push, unit * 4); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 1.0); + PUSH_DATAf(push, 0.0); + PUSH_DATAf(push, 0.0); + return TRUE; +} + +static Bool +NV40EXAPictGradient(NVPtr pNv, PicturePtr pPict, int unit) +{ + return TRUE; +} + +static Bool +NV40EXAPictTexture(NVPtr pNv, PixmapPtr pPix, PicturePtr pPict, int unit) { - NVPtr pNv = NVPTR(pScrn); unsigned reloc = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_WR; struct nouveau_pushbuf *push = pNv->pushbuf; struct nouveau_bo *bo = nouveau_pixmap_bo(pPix); @@ -279,6 +334,24 @@ NV40EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit) } static Bool +NV40EXAPicture(NVPtr pNv, PixmapPtr ppix, PicturePtr ppict, int unit) +{ + if (ppict->pDrawable) + return NV40EXAPictTexture(pNv, ppix, ppict, unit); + + switch (ppict->pSourcePict->type) { + case SourcePictTypeSolidFill: + return NV40EXAPictSolid(pNv, ppict, unit); + case SourcePictTypeLinear: + return NV40EXAPictGradient(pNv, ppict, unit); + default: + break; + } + + return FALSE; +} + +static Bool NV40_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PictFormatShort format) { NVPtr pNv = NVPTR(pScrn); @@ -305,13 +378,19 @@ static Bool NV40EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op) { nv_pict_texture_format_t *fmt; - int w, h; - - if (!pPict->pDrawable) - NOUVEAU_FALLBACK("Solid and gradient pictures unsupported\n"); + int w = 1, h = 1; - w = pPict->pDrawable->width; - h = pPict->pDrawable->height; + if (pPict->pDrawable) { + w = pPict->pDrawable->width; + h = pPict->pDrawable->height; + } else { + switch (pPict->pSourcePict->type) { + case SourcePictTypeSolidFill: + break; + default: + NOUVEAU_FALLBACK("gradient\n"); + } + } if ((w > 4096) || (h > 4096)) NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h); @@ -377,7 +456,7 @@ NV40EXAPrepareComposite(int op, PicturePtr psPict, PixmapPtr pmPix, PixmapPtr pdPix) { - ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum]; + ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); nv_pict_op_t *blend = NV40_GetPictOpRec(op); struct nouveau_pushbuf *push = pNv->pushbuf; @@ -392,11 +471,11 @@ NV40EXAPrepareComposite(int op, PicturePtr psPict, PICT_FORMAT_RGB(pmPict->format))); if (!NV40_SetupSurface(pScrn, pdPix, pdPict->format) || - !NV40EXATexture(pScrn, psPix, psPict, 0)) + !NV40EXAPicture(pNv, psPix, psPict, 0)) return FALSE; if (pmPict) { - if (!NV40EXATexture(pScrn, pmPix, pmPict, 1)) + if (!NV40EXAPicture(pNv, pmPix, pmPict, 1)) return FALSE; if (pdPict->format == PICT_a8) { commit 067b8416ad1ab3e71ebbb8db8bfb82ff6041939b Author: Ben Skeggs <bske...@redhat.com> Date: Mon Apr 23 17:49:57 2012 +1000 nv30/exa: implement support for solid pictures using register combiners Signed-off-by: Ben Skeggs <bske...@redhat.com> diff --git a/src/nv30_exa.c b/src/nv30_exa.c index 1b875ee..57979c2 100644 --- a/src/nv30_exa.c +++ b/src/nv30_exa.c @@ -320,6 +320,51 @@ NV30EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit) return TRUE; } +#define RCSRC_COL(i) (0x01 + (unit)) +#define RCSRC_TEX(i) (0x08 + (unit)) /* fragprog register */ +#define RCSEL_COLOR (0x00) +#define RCSEL_ALPHA (0x10) +#define RCINP_ZERO (0x00) +#define RCINP_ONE (0x20) +#define RCINP_A__SHIFT 24 +#define RCINP_B__SHIFT 16 + +static Bool +NV30EXAPicture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit, + uint32_t *color, uint32_t *alpha, uint32_t *solid) +{ + uint32_t shift, source; + + if (pPict && pPict->pDrawable) { + if (!NV30EXATexture(pScrn, pPix, pPict, unit)) + return FALSE; + *solid = 0x00000000; + source = RCSRC_TEX(unit); + } else + if (pPict) { + *solid = pPict->pSourcePict->solidFill.color; + source = RCSRC_COL(unit); + } + + if (pPict && PICT_FORMAT_RGB(pPict->format)) + *color = RCSEL_COLOR | source; + else + *color = RCSEL_ALPHA | RCINP_ZERO; + + if (pPict && PICT_FORMAT_A(pPict->format)) + *alpha = RCSEL_ALPHA | source; + else + *alpha = RCSEL_ALPHA | RCINP_ONE; + + if (unit) + shift = RCINP_B__SHIFT; + else + shift = RCINP_A__SHIFT; + *color <<= shift; + *alpha <<= shift; + return TRUE; +} + static Bool NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict) { @@ -347,13 +392,15 @@ static Bool NV30EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op) { nv_pict_texture_format_t *fmt; - int w, h; + int w = 1, h = 1; - if (!pPict->pDrawable) - NOUVEAU_FALLBACK("Solid and gradient pictures unsupported\n"); - - w = pPict->pDrawable->width; - h = pPict->pDrawable->height; + if (pPict->pDrawable) { + w = pPict->pDrawable->width; + h = pPict->pDrawable->height; + } else { + if (pPict->pSourcePict->type != SourcePictTypeSolidFill) + NOUVEAU_FALLBACK("gradient pictures unsupported\n"); + } if ((w > 4096) || (h > 4096)) NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h); @@ -423,48 +470,56 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, PixmapPtr pmPix, PixmapPtr pdPix) { - ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum]; + ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); nv_pict_op_t *blend = NV30_GetPictOpRec(op); struct nouveau_pushbuf *push = pNv->pushbuf; - uint32_t fragprog; + uint32_t sc, sa, mc, ma, solid[2]; if (!PUSH_SPACE(push, 128)) return FALSE; PUSH_RESET(push); + /* setup render target and blending */ + if (!NV30_SetupSurface(pScrn, pdPix, pdPict)) + return FALSE; NV30_SetupBlend(pScrn, blend, pdPict->format, (pmPict && pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format))); - if (!NV30_SetupSurface(pScrn, pdPix, pdPict) || - !NV30EXATexture(pScrn, psPix, psPict, 0)) + /* select picture sources */ + if (!NV30EXAPicture(pScrn, psPix, psPict, 0, &sc, &sa, &solid[0])) + return FALSE; + if (!NV30EXAPicture(pScrn, pmPix, pmPict, 1, &mc, &ma, &solid[1])) return FALSE; - if (pmPict) { - if (!NV30EXATexture(pScrn, pmPix, pmPict, 1)) - return FALSE; - - if (pdPict->format == PICT_a8) { - fragprog = PFP_C_A8; - } else - if (pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) { - if (blend->src_alpha) - fragprog = PFP_CCASA; - else - fragprog = PFP_CCA; - } else { - fragprog = PFP_C; - } - } else { - if (pdPict->format == PICT_a8) - fragprog = PFP_S_A8; + /* configure register combiners */ + BEGIN_NV04(push, NV30_3D(RC_IN_ALPHA(0)), 6); + PUSH_DATA (push, sa | ma); + if (pmPict && + pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) { + if (blend->src_alpha) + PUSH_DATA(push, sa | mc); else - fragprog = PFP_S; + PUSH_DATA(push, sc | mc); + } else { + PUSH_DATA(push, sc | ma); } + PUSH_DATA (push, solid[0]); + PUSH_DATA (push, solid[1]); + PUSH_DATA (push, 0x00000c00); + PUSH_DATA (push, 0x00000c00); + BEGIN_NV04(push, NV30_3D(RC_FINAL0), 3); + if (pdPict->format != PICT_a8) + PUSH_DATA (push, 0x0000000c); + else + PUSH_DATA (push, 0x0000001c); + PUSH_DATA (push, 0x00001c00); + PUSH_DATA (push, 0x01000101); + /* select fragprog which just sources textures for combiners */ BEGIN_NV04(push, NV30_3D(FP_ACTIVE_PROGRAM), 1); - PUSH_MTHD (push, NV30_3D(FP_ACTIVE_PROGRAM), pNv->scratch, fragprog, + PUSH_MTHD (push, NV30_3D(FP_ACTIVE_PROGRAM), pNv->scratch, PFP_PASS, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | NOUVEAU_BO_LOW | NOUVEAU_BO_OR, NV30_3D_FP_ACTIVE_PROGRAM_DMA0, @@ -474,7 +529,7 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, BEGIN_NV04(push, NV30_3D(FP_CONTROL), 1); PUSH_DATA (push, 0x00000000); BEGIN_NV04(push, NV30_3D(TEX_UNITS_ENABLE), 1); - PUSH_DATA (push, pmPict ? 3 : 1); + PUSH_DATA (push, 3); nouveau_pushbuf_bufctx(push, pNv->bufctx); if (nouveau_pushbuf_validate(push)) { @@ -630,8 +685,6 @@ NVAccelInitNV30TCL(ScrnInfoPtr pScrn) BEGIN_NV04(push, NV30_3D(MULTISAMPLE_CONTROL), 1); PUSH_DATA (push, 0xffff0000); - BEGIN_NV04(push, NV30_3D(RC_ENABLE), 1); - PUSH_DATA (push, 0); /* Attempt to setup a known state.. Probably missing a heap of * stuff here.. @@ -766,87 +819,15 @@ NVAccelInitNV30TCL(ScrnInfoPtr pScrn) PUSH_DATA (push, 4096<<16); PUSH_DATA (push, 4096<<16); - PUSH_DATAu(push, pNv->scratch, PFP_PASS, 1 * 4); - PUSH_DATA (push, 0x01403e81); /* mov r0, a[col0] */ + PUSH_DATAu(push, pNv->scratch, PFP_PASS, 2 * 4); + PUSH_DATA (push, 0x18009e80); /* txph r0, a[tex0], t[0] */ PUSH_DATA (push, 0x1c9dc801); PUSH_DATA (push, 0x0001c800); PUSH_DATA (push, 0x3fe1c800); - - PUSH_DATAu(push, pNv->scratch, PFP_S, 2 * 4); - PUSH_DATA (push, 0x18009e00); /* txp r0, a[tex0], t[0] */ - PUSH_DATA (push, 0x1c9dc801); + PUSH_DATA (push, 0x1802be83); /* txph r1, a[tex1], t[1] */ + PUSH_DATA (push, 0x1c9dc801); /* exit */ PUSH_DATA (push, 0x0001c800); PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x01401e81); /* mov r0, r0 */ - PUSH_DATA (push, 0x1c9dc800); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x0001c800); - - PUSH_DATAu(push, pNv->scratch, PFP_S_A8, 2 * 4); - PUSH_DATA (push, 0x18009000); /* txp r0.w, a[tex0], t[0] */ - PUSH_DATA (push, 0x1c9dc801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x01401e81); /* mov r0, r0.w */ - PUSH_DATA (push, 0x1c9dfe00); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x0001c800); - - PUSH_DATAu(push, pNv->scratch, PFP_C, 3 * 4); - PUSH_DATA (push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */ - PUSH_DATA (push, 0x1c9dc801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x18009e00); /* txp r0 (ne0.w), a[tex0], t[0] */ - PUSH_DATA (push, 0x1ff5c801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x02001e81); /* mul r0, r0, r1.w */ - PUSH_DATA (push, 0x1c9dc800); - PUSH_DATA (push, 0x0001fe04); - PUSH_DATA (push, 0x0001c800); - - PUSH_DATAu(push, pNv->scratch, PFP_C_A8, 3 * 4); - PUSH_DATA (push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */ - PUSH_DATA (push, 0x1c9dc801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x18009000); /* txp r0.w (ne0.w), a[tex0], t[0] */ - PUSH_DATA (push, 0x1ff5c801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x02001e81); /* mul r0, r0.w, r1.w */ - PUSH_DATA (push, 0x1c9dfe00); - PUSH_DATA (push, 0x0001fe04); - PUSH_DATA (push, 0x0001c800); - - PUSH_DATAu(push, pNv->scratch, PFP_CCA, 3 * 4); - PUSH_DATA (push, 0x18009f00); /* txpc0 r0, a[tex0], t[0] */ - PUSH_DATA (push, 0x1c9dc801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x1802be02); /* txp r1 (ne0), a[tex1], t[1] */ - PUSH_DATA (push, 0x1c95c801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x02001e81); /* mul r0, r0, r1 */ - PUSH_DATA (push, 0x1c9dc800); - PUSH_DATA (push, 0x0001c804); - PUSH_DATA (push, 0x0001c800); - - PUSH_DATAu(push, pNv->scratch, PFP_CCASA, 3 * 4); - PUSH_DATA (push, 0x18009102); /* txpc0 r1.w, a[tex0], t[0] */ - PUSH_DATA (push, 0x1c9dc801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x1802be00); /* txp r0 (ne0.w), a[tex1], t[1] */ - PUSH_DATA (push, 0x1ff5c801); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x3fe1c800); - PUSH_DATA (push, 0x02001e81); /* mul r0, r1.w, r0 */ - PUSH_DATA (push, 0x1c9dfe04); - PUSH_DATA (push, 0x0001c800); - PUSH_DATA (push, 0x0001c800); PUSH_DATAu(push, pNv->scratch, PFP_NV12_BILINEAR, 8 * 4); PUSH_DATA (push, 0x17028200); /* texr r0.x, a[tex0], t[1] */ diff --git a/src/nv30_xv_tex.c b/src/nv30_xv_tex.c index 52517c4..33c5602 100644 --- a/src/nv30_xv_tex.c +++ b/src/nv30_xv_tex.c @@ -271,6 +271,8 @@ NV30PutTextureImage(ScrnInfoPtr pScrn, struct nouveau_bo *src, int src_offset, PUSH_DATA (push, 0x0001000f); BEGIN_NV04(push, NV30_3D(FP_CONTROL), 1); PUSH_DATA (push, 0x00000001); + BEGIN_NV04(push, NV30_3D(RC_ENABLE), 1); + PUSH_DATA (push, 0x00000000); nouveau_pushbuf_bufctx(push, pNv->bufctx); if (nouveau_pushbuf_validate(push)) { commit b09a61780ea6710b679a6a099e35987e7a5f559f Author: Ben Skeggs <bske...@redhat.com> Date: Mon Apr 23 14:49:22 2012 +1000 nv10/exa: implement support for solid pictures Signed-off-by: Ben Skeggs <bske...@redhat.com> diff --git a/src/nv10_exa.c b/src/nv10_exa.c index b562e97..2da8cf6 100644 --- a/src/nv10_exa.c +++ b/src/nv10_exa.c @@ -66,11 +66,8 @@ static struct pict_format { }; static int -get_tex_format(PicturePtr pict) +get_tex_format(NVPtr pNv, PicturePtr pict) { - ScrnInfoPtr pScrn = xf86Screens[pict->pDrawable->pScreen->myNum]; - NVPtr pNv = NVPTR(pScrn); - /* If repeat is set we're always handling a 1x1 texture with * ARGB/XRGB destination, in that case we change the format to * use the POT (swizzled) matching format. @@ -145,20 +142,22 @@ effective_component_alpha(PicturePtr mask) } static Bool -check_texture(PicturePtr pict) +check_texture(NVPtr pNv, PicturePtr pict) { - int w, h; + int w = 1, h = 1; - if (!pict->pDrawable) - NOUVEAU_FALLBACK("Solid and gradient pictures unsupported\n"); - - w = pict->pDrawable->width; - h = pict->pDrawable->height; + if (pict->pDrawable) { + w = pict->pDrawable->width; + h = pict->pDrawable->height; + } else { + if (pict->pSourcePict->type != SourcePictTypeSolidFill) + NOUVEAU_FALLBACK("gradient pictures unsupported\n"); + } if (w > 2046 || h > 2046) NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h); - if (!get_tex_format(pict)) + if (!get_tex_format(pNv, pict)) return FALSE; if (pict->filter != PictFilterNearest && @@ -338,6 +337,9 @@ print_fallback_info(char *reason, int op, PicturePtr src, PicturePtr mask, Bool NV10EXACheckComposite(int op, PicturePtr src, PicturePtr mask, PicturePtr dst) { + ScrnInfoPtr pScrn = xf86Screens[dst->pDrawable->pScreen->myNum]; + NVPtr pNv = NVPTR(pScrn); + if (!check_pict_op(op)) { print_fallback_info("pictop", op, src, mask, dst); return FALSE; @@ -348,13 +350,13 @@ NV10EXACheckComposite(int op, PicturePtr src, PicturePtr mask, PicturePtr dst) return FALSE; } - if (!check_texture(src)) { + if (!check_texture(pNv, src)) { print_fallback_info("src", op, src, mask, dst); return FALSE; } if (mask) { - if (!check_texture(mask)) { + if (!check_texture(pNv, mask)) { print_fallback_info("mask", op, src, mask, dst); return FALSE; @@ -386,7 +388,7 @@ setup_texture(NVPtr pNv, int unit, PicturePtr pict, PixmapPtr pixmap) NV10_3D_TEX_FORMAT_WRAP_S_CLAMP_TO_EDGE | log2i(w) << 20 | log2i(h) << 16 | 1 << 12 | /* lod == 1 */ - get_tex_format(pict) | + get_tex_format(pNv, pict) | 0x50 /* UNK */; /* NPOT_SIZE expects an even number for width, we can round up uneven @@ -458,96 +460,6 @@ setup_render_target(NVPtr pNv, PicturePtr pict, PixmapPtr pixmap) return TRUE; } -/* - * This can be a bit difficult to understand at first glance. Reg - * combiners are described here: - * http://icps.u-strasbg.fr/~marchesin/perso/extensions/NV/register_combiners.html - * - * Single texturing setup, without honoring vertex colors (non default - * setup) is: Alpha RC 0 : a_0 * 1 + 0 * 0 RGB RC 0 : rgb_0 * 1 + 0 * - * 0 RC 1s are unused Final combiner uses default setup - * - * Default setup uses vertex rgb/alpha in place of 1s above, but we - * don't need that in 2D. - * - * Multi texturing setup, where we do TEX0 in TEX1 (masking) is: - * Alpha RC 0 : a_0 * a_1 + 0 * 0 - * RGB RC0 : rgb_0 * a_1 + 0 * 0 - * RC 1s are unused - * Final combiner uses default setup - */ - -/* Bind the combiner variable <input> to a constant 1. */ -#define RC_IN_ONE(input) \ - (NV10_3D_RC_IN_RGB_##input##_INPUT_ZERO | \ - NV10_3D_RC_IN_RGB_##input##_COMPONENT_USAGE_ALPHA | \ - NV10_3D_RC_IN_RGB_##input##_MAPPING_UNSIGNED_INVERT) - -/* Bind the combiner variable <input> to the specified channel from - * the texture unit <unit>. */ -#define RC_IN_TEX(input, chan, unit) \ - (NV10_3D_RC_IN_RGB_##input##_INPUT_TEXTURE##unit | \ - NV10_3D_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan) - -/* Bind the combiner variable <input> to the specified channel from - * the constant color <unit>. */ -#define RC_IN_COLOR(input, chan, unit) \ - (NV10_3D_RC_IN_RGB_##input##_INPUT_CONSTANT_COLOR##unit | \ - NV10_3D_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan) - -static void -setup_combiners(NVPtr pNv, PicturePtr src, PicturePtr mask, int alu) -{ - struct nouveau_pushbuf *push = pNv->pushbuf; - uint32_t rc_in_alpha = 0, rc_in_rgb = 0; - - if (PICT_FORMAT_A(src->format)) - rc_in_alpha |= RC_IN_TEX(A, ALPHA, 0); - else - rc_in_alpha |= RC_IN_ONE(A); - - if (mask && PICT_FORMAT_A(mask->format)) - rc_in_alpha |= RC_IN_TEX(B, ALPHA, 1); - else - rc_in_alpha |= RC_IN_ONE(B); - - if (effective_component_alpha(mask)) { - if (!needs_src_alpha(alu)) { - /* The alpha channels won't be used for blending. Drop - * them, as our pixels only have 4 components... - * output_i = src_i * mask_i - */ - if (PICT_FORMAT_RGB(src->format)) - rc_in_rgb |= RC_IN_TEX(A, RGB, 0); - } else { - /* The RGB channels won't be used for blending. Drop - * them. - * output_i = src_alpha * mask_i - */ - if (PICT_FORMAT_A(src->format)) - rc_in_rgb |= RC_IN_TEX(A, ALPHA, 0); - else - rc_in_rgb |= RC_IN_ONE(A); - } - - rc_in_rgb |= RC_IN_TEX(B, RGB, 1); - - } else { - if (PICT_FORMAT_RGB(src->format)) - rc_in_rgb |= RC_IN_TEX(A, RGB, 0); - - if (mask && PICT_FORMAT_A(mask->format)) - rc_in_rgb |= RC_IN_TEX(B, ALPHA, 1); - else - rc_in_rgb |= RC_IN_ONE(B); - } - - BEGIN_NV04(push, NV10_3D(RC_IN_ALPHA(0)), 1); - PUSH_DATA (push, rc_in_alpha); - BEGIN_NV04(push, NV10_3D(RC_IN_RGB(0)), 1); - PUSH_DATA (push, rc_in_rgb); -} - static void setup_blend_function(NVPtr pNv, PicturePtr pdpict, int alu) { @@ -578,6 +490,52 @@ setup_blend_function(NVPtr pNv, PicturePtr pdpict, int alu) PUSH_DATA (push, 1); } +#define RCSRC_COL(i) (0x01 + (unit)) +#define RCSRC_TEX(i) (0x08 + (unit)) +#define RCSEL_COLOR (0x00) +#define RCSEL_ALPHA (0x10) +#define RCINP_ZERO (0x00) +#define RCINP_ONE (0x20) +#define RCINP_A__SHIFT 24 +#define RCINP_B__SHIFT 16 + +static Bool +setup_picture(NVPtr pNv, PicturePtr pict, PixmapPtr pixmap, int unit, + uint32_t *color, uint32_t *alpha) +{ + struct nouveau_pushbuf *push = pNv->pushbuf; + uint32_t shift, source; + + if (pict && pict->pDrawable) { + if (!setup_texture(pNv, unit, pict, pixmap)) + return FALSE; + source = RCSRC_TEX(unit); + } else + if (pict) { + BEGIN_NV04(push, NV10_3D(RC_COLOR(unit)), 1); + PUSH_DATA (push, pict->pSourcePict->solidFill.color); + source = RCSRC_COL(unit); + } + + if (pict && PICT_FORMAT_RGB(pict->format)) + *color = RCSEL_COLOR | source; + else + *color = RCSEL_ALPHA | RCINP_ZERO; + + if (pict && PICT_FORMAT_A(pict->format)) + *alpha = RCSEL_ALPHA | source; + else + *alpha = RCSEL_ALPHA | RCINP_ONE; + + if (unit) + shift = RCINP_B__SHIFT; + else + shift = RCINP_A__SHIFT; + *color <<= shift; + *alpha <<= shift; + return TRUE; +} + Bool NV10EXAPrepareComposite(int op, PicturePtr pict_src, @@ -590,28 +548,35 @@ NV10EXAPrepareComposite(int op, ScrnInfoPtr pScrn = xf86Screens[dst->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); struct nouveau_pushbuf *push = pNv->pushbuf; + uint32_t sc, sa, mc, ma; if (!PUSH_SPACE(push, 128)) return FALSE; PUSH_RESET(push); - /* Set dst format */ + /* setup render target and blending */ if (!setup_render_target(pNv, pict_dst, dst)) return FALSE; + setup_blend_function(pNv, pict_dst, op); - /* Set src format */ - if (!setup_texture(pNv, 0, pict_src, src)) + /* select picture sources */ + if (!setup_picture(pNv, pict_src, src, 0, &sc, &sa)) return FALSE; - - /* Set mask format */ - if (mask && !setup_texture(pNv, 1, pict_mask, mask)) + if (!setup_picture(pNv, pict_mask, mask, 1, &mc, &ma)) return FALSE; - /* Set the register combiners up. */ - setup_combiners(pNv, pict_src, pict_mask, op); - - /* Set PictOp */ - setup_blend_function(pNv, pict_dst, op); + /* configure register combiners */ + BEGIN_NV04(push, NV10_3D(RC_IN_ALPHA(0)), 1); + PUSH_DATA (push, sa | ma); + BEGIN_NV04(push, NV10_3D(RC_IN_RGB(0)), 1); + if (effective_component_alpha(pict_mask)) { + if (needs_src_alpha(op)) + PUSH_DATA(push, sa | mc); + else + PUSH_DATA(push, sc | mc); + } else { + PUSH_DATA(push, sc | ma); + } nouveau_pushbuf_bufctx(push, pNv->bufctx); if (nouveau_pushbuf_validate(push)) { commit 9583753a205c585ec844dfb7168513a2c2a157ba Author: Ben Skeggs <bske...@redhat.com> Date: Fri Apr 20 20:52:01 2012 +1000 nv10/exa: use fixed-function texture matrix for transforms Signed-off-by: Ben Skeggs <bske...@redhat.com> diff --git a/src/nv10_exa.c b/src/nv10_exa.c index 16b6d1c..b562e97 100644 --- a/src/nv10_exa.c +++ b/src/nv10_exa.c @@ -394,9 +394,7 @@ setup_texture(NVPtr pNv, int unit, PicturePtr pict, PixmapPtr pixmap) * for all formats we support 64 bytes represents an even number of * pixels */ -// if (pict->repeat == RepeatNone) - w = (w + 1) &~ 1; - + w = (w + 1) & ~1; BEGIN_NV04(push, NV10_3D(TEX_OFFSET(unit)), 1); PUSH_MTHDl(push, NV10_3D(TEX_OFFSET(unit)), bo, 0, reloc); @@ -417,6 +415,31 @@ setup_texture(NVPtr pNv, int unit, PicturePtr pict, PixmapPtr pixmap) else PUSH_DATA(push, NV10_3D_TEX_FILTER_MAGNIFY_LINEAR | NV10_3D_TEX_FILTER_MINIFY_LINEAR); + if (pict->transform) { + BEGIN_NV04(push, NV10_3D(TEX_MATRIX_ENABLE(unit)), 1); + PUSH_DATA (push, 1); + BEGIN_NV04(push, NV10_3D(TEX_MATRIX(unit, 0)), 16); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[0][0])); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[0][1])); + PUSH_DATAf(push, 0.f); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[0][2])); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[1][0])); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[1][1])); + PUSH_DATAf(push, 0.f); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[1][2])); + PUSH_DATAf(push, 0.0f); + PUSH_DATAf(push, 0.0f); + PUSH_DATAf(push, 0.0f); + PUSH_DATAf(push, 0.0f); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[2][0])); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[2][1])); + PUSH_DATAf(push, 0.0f); + PUSH_DATAf(push, xFixedToFloat(pict->transform->matrix[2][2])); + } else { + BEGIN_NV04(push, NV10_3D(TEX_MATRIX_ENABLE(unit)), 1); + PUSH_DATA (push, 0); + } + return TRUE; } @@ -601,76 +624,37 @@ NV10EXAPrepareComposite(int op, return TRUE; } -#define QUAD(x, y, w, h) \ - {{{ IntToxFixed(x), IntToxFixed(y), xFixed1 }}, \ - {{ IntToxFixed(x + w), IntToxFixed(y), xFixed1 }}, \ - {{ IntToxFixed(x + w), IntToxFixed(y + h), xFixed1 }}, \ - {{ IntToxFixed(x), IntToxFixed(y + h), xFixed1 }}} - -#define MAP(f, p, v, ...) do { \ - int __i; \ - for (__i = 0; __i < sizeof(v)/sizeof((v)[0]); __i++) \ - f(p, __i, v, ## __VA_ARGS__); \ - } while (0); - -#define PUSH_DATAi(push, v, i) \ - PUSH_DATAf(push, xFixedToFloat((v).vector[i])) - static inline void -emit_vertex(NVPtr pNv, int i, PictVector pos[], - PictVector tex0[], PictVector tex1[]) +PUSH_VTX2s(struct nouveau_pushbuf *push, + int x1, int y1, int x2, int y2, int dx, int dy) { - struct nouveau_pushbuf *push = pNv->pushbuf; - - BEGIN_NV04(push, NV10_3D(VERTEX_TX0_2F_S), 2); - PUSH_DATAi(push, tex0[i], 0); - PUSH_DATAi(push, tex0[i], 1); - - if (tex1) { - BEGIN_NV04(push, NV10_3D(VERTEX_TX1_2F_S), 2); - PUSH_DATAi(push, tex1[i], 0); - PUSH_DATAi(push, tex1[i], 1); - } - + BEGIN_NV04(push, NV10_3D(VERTEX_TX0_2I), 1); + PUSH_DATA (push, (y1 << 16) | x1); + BEGIN_NV04(push, NV10_3D(VERTEX_TX1_2I), 1); + PUSH_DATA (push, (y2 << 16) | x2); BEGIN_NV04(push, NV10_3D(VERTEX_POS_3F_X), 3); - PUSH_DATAi(push, pos[i], 0); - PUSH_DATAi(push, pos[i], 1); + PUSH_DATAf(push, dx); + PUSH_DATAf(push, dy); PUSH_DATAf(push, 0.0); } -static inline void -transform_vertex(PictTransformPtr t, int i, PictVector vs[]) -{ - if (t) - PictureTransformPoint(t, &vs[i]); -} - void NV10EXAComposite(PixmapPtr pix_dst, - int srcX, int srcY, - int maskX, int maskY, - int dstX, int dstY, - int width, int height) + int sx, int sy, int mx, int my, int dx, int dy, int w, int h) { ScrnInfoPtr pScrn = xf86Screens[pix_dst->drawable.pScreen->myNum]; NVPtr pNv = NVPTR(pScrn); struct nouveau_pushbuf *push = pNv->pushbuf; - PicturePtr mask = pNv->pmpict, - src = pNv->pspict; - PictVector dstq[4] = QUAD(dstX, dstY, width, height), - maskq[4] = QUAD(maskX, maskY, width, height), - srcq[4] = QUAD(srcX, srcY, width, height); - - MAP(transform_vertex, src->transform, srcq); - if (mask) - MAP(transform_vertex, mask->transform, maskq); if (!PUSH_SPACE(push, 64)) return; BEGIN_NV04(push, NV10_3D(VERTEX_BEGIN_END), 1); PUSH_DATA (push, NV10_3D_VERTEX_BEGIN_END_QUADS); - MAP(emit_vertex, pNv, dstq, srcq, mask ? maskq : NULL); + PUSH_VTX2s(push, sx, sy, mx, my, dx, dy); + PUSH_VTX2s(push, sx + w, sy, mx + w, my, dx + w, dy); + PUSH_VTX2s(push, sx + w, sy + h, mx + w, my + h, dx + w, dy + h); + PUSH_VTX2s(push, sx, sy + h, mx, my + h, dx, dy + h); BEGIN_NV04(push, NV10_3D(VERTEX_BEGIN_END), 1); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1sx6xw-0007qj...@vasks.debian.org