From 9a3e579f637267b32efc46cfce5d1a36a41323b1 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Thu, 19 Apr 2012 16:58:52 +1000 Subject: nvc0/exa: port recent nv50 changes (vp transform, solid pictures, etc) Signed-off-by: Ben Skeggs --- src/nvc0_accel.c | 14 +++- src/nvc0_accel.h | 47 ++++-------- src/nvc0_exa.c | 222 ++++++++++++++++++++++++++++-------------------------- src/nvc0_shader.h | 84 +++++++++++++++++---- src/nvc0_xv.c | 28 ++++--- src/nve0_shader.h | 80 +++++++++++++++++--- 6 files changed, 296 insertions(+), 179 deletions(-) diff --git a/src/nvc0_accel.c b/src/nvc0_accel.c index d0f6770..1fd2286 100644 --- a/src/nvc0_accel.c +++ b/src/nvc0_accel.c @@ -205,7 +205,7 @@ NVAccelInit3D_NVC0(ScrnInfoPtr pScrn) PUSH_DATA (push, (bo->offset + CODE_OFFSET) >> 32); PUSH_DATA (push, (bo->offset + CODE_OFFSET)); if (pNv->Architecture < NV_ARCH_E0) { - NVC0PushProgram(pNv, PVP_PASS, NVC0VP_Passthrough); + NVC0PushProgram(pNv, PVP_PASS, NVC0VP_Transform2); NVC0PushProgram(pNv, PFP_S, NVC0FP_Source); NVC0PushProgram(pNv, PFP_C, NVC0FP_Composite); NVC0PushProgram(pNv, PFP_CCA, NVC0FP_CAComposite); @@ -217,7 +217,7 @@ NVAccelInit3D_NVC0(ScrnInfoPtr pScrn) BEGIN_NVC0(push, NVC0_3D(MEM_BARRIER), 1); PUSH_DATA (push, 0x1111); } else { - NVC0PushProgram(pNv, PVP_PASS, NVE0VP_Passthrough); + NVC0PushProgram(pNv, PVP_PASS, NVE0VP_Transform2); NVC0PushProgram(pNv, PFP_S, NVE0FP_Source); NVC0PushProgram(pNv, PFP_C, NVE0FP_Composite); NVC0PushProgram(pNv, PFP_CCA, NVE0FP_CAComposite); @@ -235,6 +235,12 @@ NVAccelInit3D_NVC0(ScrnInfoPtr pScrn) PUSH_DATA (push, 8); BEGIN_NVC0(push, NVC0_3D(VERT_COLOR_CLAMP_EN), 1); PUSH_DATA (push, 1); + BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); + PUSH_DATA (push, 256); + PUSH_DATA (push, (bo->offset + PVP_DATA) >> 32); + PUSH_DATA (push, (bo->offset + PVP_DATA)); + BEGIN_NVC0(push, NVC0_3D(CB_BIND(0)), 1); + PUSH_DATA (push, 0x01); BEGIN_NVC0(push, NVC0_3D(SP_SELECT(5)), 4); PUSH_DATA (push, NVC0_3D_SP_SELECT_PROGRAM_FP | @@ -246,8 +252,8 @@ NVAccelInit3D_NVC0(ScrnInfoPtr pScrn) PUSH_DATA (push, 0x11111111); BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); PUSH_DATA (push, 256); - PUSH_DATA (push, (bo->offset + CB_OFFSET) >> 32); - PUSH_DATA (push, (bo->offset + CB_OFFSET)); + PUSH_DATA (push, (bo->offset + PFP_DATA) >> 32); + PUSH_DATA (push, (bo->offset + PFP_DATA)); BEGIN_NVC0(push, NVC0_3D(CB_BIND(4)), 1); PUSH_DATA (push, 0x01); diff --git a/src/nvc0_accel.h b/src/nvc0_accel.h index 3b838ea..41cf477 100644 --- a/src/nvc0_accel.h +++ b/src/nvc0_accel.h @@ -23,8 +23,12 @@ /* scratch buffer offsets */ #define CODE_OFFSET 0x00000 /* Code */ +#define PVP_DATA 0x01000 /* VP constants */ +#define PFP_DATA 0x01100 /* FP constants */ +#define TB_OFFSET 0x01800 /* Texture bindings (kepler) */ #define TIC_OFFSET 0x02000 /* Texture Image Control */ #define TSC_OFFSET 0x03000 /* Texture Sampler Control */ +#define SOLID(i) (0x04000 + (i) * 0x100) #define NTFY_OFFSET 0x08000 #define MISC_OFFSET 0x10000 @@ -39,11 +43,6 @@ #define PFP_C_A8 (0x0c00 + SPO) /* (src IN mask) a8 rt - same for CCA/CCASA */ #define PFP_NV12 (0x0e00 + SPO) /* NV12 YUV->RGB */ -/* shader constants */ -#define CB_OFFSET 0x1000 - -/* texture bindings (kepler) */ -#define TB_OFFSET 0x1800 #define VTX_ATTR(a, c, t, s) \ ((NVC0_3D_VTX_ATTR_DEFINE_TYPE_##t) | \ @@ -52,50 +51,30 @@ ((s) << NVC0_3D_VTX_ATTR_DEFINE_SIZE__SHIFT)) static __inline__ void -VTX1s(NVPtr pNv, float sx, float sy, unsigned dx, unsigned dy) +PUSH_VTX1s(struct nouveau_pushbuf *push, float sx, float sy, int dx, int dy) { - struct nouveau_pushbuf *push = pNv->pushbuf; - BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3); PUSH_DATA (push, VTX_ATTR(1, 2, FLOAT, 4)); PUSH_DATAf(push, sx); PUSH_DATAf(push, sy); -#if 1 BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 2); PUSH_DATA (push, VTX_ATTR(0, 2, USCALED, 2)); PUSH_DATA (push, (dy << 16) | dx); -#else - BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3); - PUSH_DATA (push, VTX_ATTR(0, 2, FLOAT, 4)); - PUSH_DATAf(push, (float)dx); - PUSH_DATAf(push, (float)dy); -#endif } static __inline__ void -VTX2s(NVPtr pNv, float s1x, float s1y, float s2x, float s2y, - unsigned dx, unsigned dy) +PUSH_VTX2s(struct nouveau_pushbuf *push, + int x0, int y0, int x1, int y1, int dx, int dy) { - struct nouveau_pushbuf *push = pNv->pushbuf; - - BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3); - PUSH_DATA (push, VTX_ATTR(1, 2, FLOAT, 4)); - PUSH_DATAf(push, s1x); - PUSH_DATAf(push, s1y); - BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3); - PUSH_DATA (push, VTX_ATTR(2, 2, FLOAT, 4)); - PUSH_DATAf(push, s2x); - PUSH_DATAf(push, s2y); -#if 1 + BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 2); + PUSH_DATA (push, VTX_ATTR(1, 2, USCALED, 2)); + PUSH_DATA (push, (y0 << 16) | x0); + BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 2); + PUSH_DATA (push, VTX_ATTR(2, 2, USCALED, 2)); + PUSH_DATA (push, (y1 << 16) | x1); BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 2); PUSH_DATA (push, VTX_ATTR(0, 2, USCALED, 2)); PUSH_DATA (push, (dy << 16) | dx); -#else - BEGIN_NVC0(push, NVC0_3D(VTX_ATTR_DEFINE), 3); - PUSH_DATA (push, VTX_ATTR(0, 2, FLOAT, 4)); - PUSH_DATAf(push, (float)dx); - PUSH_DATAf(push, (float)dy); -#endif } static __inline__ void diff --git a/src/nvc0_exa.c b/src/nvc0_exa.c index 9149cdd..c68b3fb 100644 --- a/src/nvc0_exa.c +++ b/src/nvc0_exa.c @@ -27,23 +27,10 @@ #define NOUVEAU_BO(a, b, c) (NOUVEAU_BO_##a | NOUVEAU_BO_##b | NOUVEAU_BO_##c) -struct nvc0_exa_state { - struct { - PictTransformPtr transform; - float width; - float height; - } unit[2]; - - Bool have_mask; -}; - -static struct nvc0_exa_state exa_state; - #define NVC0EXA_LOCALS(p) \ ScrnInfoPtr pScrn = xf86Screens[(p)->drawable.pScreen->myNum]; \ NVPtr pNv = NVPTR(pScrn); \ - struct nouveau_pushbuf *push = pNv->pushbuf; (void)push; \ - struct nvc0_exa_state *state = &exa_state; (void)state + struct nouveau_pushbuf *push = pNv->pushbuf; (void)push; #define BF(f) NV50_BLEND_FACTOR_##f @@ -536,16 +523,56 @@ NVC0EXACheckTexture(PicturePtr ppict, PicturePtr pdpict, int op) NV50TIC_0_0_FMT_##FMT) static Bool -NVC0EXATexture(PixmapPtr ppix, PicturePtr ppict, unsigned unit) +NVC0EXAPictSolid(NVPtr pNv, PicturePtr ppict, unsigned unit) +{ + uint64_t offset = pNv->scratch->offset + SOLID(unit); + struct nouveau_pushbuf *push = pNv->pushbuf; + + PUSH_DATAu(push, pNv->scratch, SOLID(unit), 1); + PUSH_DATA (push, ppict->pSourcePict->solidFill.color); + PUSH_DATAu(push, pNv->scratch, TIC_OFFSET + (unit * 32), 8); + PUSH_DATA (push, _(B_C0, G_C1, R_C2, A_C3, 8_8_8_8)); + PUSH_DATA (push, offset); + PUSH_DATA (push, (offset >> 32) | 0xd005d000); + PUSH_DATA (push, 0x00300000); + PUSH_DATA (push, 0x00000001); + PUSH_DATA (push, 0x00010001); + PUSH_DATA (push, 0x03000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATAu(push, pNv->scratch, TSC_OFFSET + (unit * 32), 8); + PUSH_DATA (push, NV50TSC_1_0_WRAPS_REPEAT | + NV50TSC_1_0_WRAPT_REPEAT | + NV50TSC_1_0_WRAPR_REPEAT | 0x00024000); + PUSH_DATA (push, NV50TSC_1_1_MAGF_NEAREST | + NV50TSC_1_1_MINF_NEAREST | + NV50TSC_1_1_MIPF_NONE); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + + return TRUE; +} + +static Bool +NVC0EXAPictGradient(NVPtr pNv, PicturePtr ppict, unsigned unit) +{ + return FALSE; +} + +static Bool +NVC0EXAPictTexture(NVPtr pNv, PixmapPtr ppix, PicturePtr ppict, unsigned unit) { - NVC0EXA_LOCALS(ppix); struct nouveau_bo *bo = nouveau_pixmap_bo(ppix); - uint32_t mode; + struct nouveau_pushbuf *push = pNv->pushbuf; - /* XXX: maybe add support for linear textures at some point */ + /*XXX: Scanout buffer not tiled, someone needs to figure it out */ if (!nv50_style_tiled_pixmap(ppix)) NOUVEAU_FALLBACK("pixmap is scanout buffer\n"); + PUSH_REFN (push, bo, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); PUSH_DATAu(push, pNv->scratch, TIC_OFFSET + (unit * 32), 8); switch (ppict->format) { case PICT_a8r8g8b8: @@ -616,10 +643,10 @@ NVC0EXATexture(PixmapPtr ppix, PicturePtr ppict, unsigned unit) } #undef _ - mode = 0xd0005000 | (bo->config.nvc0.tile_mode << (22 - 4)); PUSH_DATA (push, bo->offset); - PUSH_DATA (push, (bo->offset >> 32) | mode | - (bo->config.nvc0.tile_mode << 18)); + PUSH_DATA (push, (bo->offset >> 32) | + (bo->config.nvc0.tile_mode << 18) | + 0xd0005000); PUSH_DATA (push, 0x00300000); PUSH_DATA (push, (1 << 31) | ppix->drawable.width); PUSH_DATA (push, (1 << 16) | ppix->drawable.height); @@ -631,52 +658,90 @@ NVC0EXATexture(PixmapPtr ppix, PicturePtr ppict, unsigned unit) switch (ppict->repeatType) { case RepeatPad: PUSH_DATA (push, 0x00024000 | - NV50TSC_1_0_WRAPS_CLAMP | - NV50TSC_1_0_WRAPT_CLAMP | - NV50TSC_1_0_WRAPR_CLAMP); + NV50TSC_1_0_WRAPS_CLAMP | + NV50TSC_1_0_WRAPT_CLAMP | + NV50TSC_1_0_WRAPR_CLAMP); break; case RepeatReflect: PUSH_DATA (push, 0x00024000 | - NV50TSC_1_0_WRAPS_MIRROR_REPEAT | - NV50TSC_1_0_WRAPT_MIRROR_REPEAT | - NV50TSC_1_0_WRAPR_MIRROR_REPEAT); + NV50TSC_1_0_WRAPS_MIRROR_REPEAT | + NV50TSC_1_0_WRAPT_MIRROR_REPEAT | + NV50TSC_1_0_WRAPR_MIRROR_REPEAT); break; case RepeatNormal: default: PUSH_DATA (push, 0x00024000 | - NV50TSC_1_0_WRAPS_REPEAT | - NV50TSC_1_0_WRAPT_REPEAT | - NV50TSC_1_0_WRAPR_REPEAT); + NV50TSC_1_0_WRAPS_REPEAT | + NV50TSC_1_0_WRAPT_REPEAT | + NV50TSC_1_0_WRAPR_REPEAT); break; } } else { PUSH_DATA (push, 0x00024000 | - NV50TSC_1_0_WRAPS_CLAMP_TO_BORDER | - NV50TSC_1_0_WRAPT_CLAMP_TO_BORDER | - NV50TSC_1_0_WRAPR_CLAMP_TO_BORDER); + NV50TSC_1_0_WRAPS_CLAMP_TO_BORDER | + NV50TSC_1_0_WRAPT_CLAMP_TO_BORDER | + NV50TSC_1_0_WRAPR_CLAMP_TO_BORDER); } if (ppict->filter == PictFilterBilinear) { - PUSH_DATA (push, - NV50TSC_1_1_MAGF_LINEAR | - NV50TSC_1_1_MINF_LINEAR | NV50TSC_1_1_MIPF_NONE); + PUSH_DATA (push, NV50TSC_1_1_MAGF_LINEAR | + NV50TSC_1_1_MINF_LINEAR | + NV50TSC_1_1_MIPF_NONE); } else { - PUSH_DATA (push, - NV50TSC_1_1_MAGF_NEAREST | - NV50TSC_1_1_MINF_NEAREST | NV50TSC_1_1_MIPF_NONE); + PUSH_DATA (push, NV50TSC_1_1_MAGF_NEAREST | + NV50TSC_1_1_MINF_NEAREST | + NV50TSC_1_1_MIPF_NONE); } PUSH_DATA (push, 0x00000000); PUSH_DATA (push, 0x00000000); - PUSH_DATAf(push, 0.0f); - PUSH_DATAf(push, 0.0f); - PUSH_DATAf(push, 0.0f); - PUSH_DATAf(push, 0.0f); - - state->unit[unit].width = ppix->drawable.width; - state->unit[unit].height = ppix->drawable.height; - state->unit[unit].transform = ppict->transform; + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + PUSH_DATA (push, 0x00000000); + + PUSH_DATAu(push, pNv->scratch, PVP_DATA + (unit * 11 * 4), 11); + if (ppict->transform) { + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[0][0])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[0][1])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[0][2])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[1][0])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[1][1])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[1][2])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[2][0])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[2][1])); + PUSH_DATAf(push, xFixedToFloat(ppict->transform->matrix[2][2])); + } else { + PUSH_DATAf(push, 1.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, 1.0); + } + PUSH_DATAf(push, 1.0 / ppix->drawable.width); + PUSH_DATAf(push, 1.0 / ppix->drawable.height); return TRUE; } +static Bool +NVC0EXAPicture(NVPtr pNv, PixmapPtr ppix, PicturePtr ppict, int unit) +{ + if (ppict->pDrawable) + return NVC0EXAPictTexture(pNv, ppix, ppict, unit); + + switch (ppict->pSourcePict->type) { + case SourcePictTypeSolidFill: + return NVC0EXAPictSolid(pNv, ppict, unit); + case SourcePictTypeLinear: + return NVC0EXAPictGradient(pNv, ppict, unit); + default: + break; + } + + return FALSE; +} static Bool NVC0EXACheckBlend(int op) { @@ -777,13 +842,12 @@ NVC0EXAPrepareComposite(int op, NVC0EXABlend(pdpix, pdpict, op, pmpict && pmpict->componentAlpha && PICT_FORMAT_RGB(pmpict->format)); - if (!NVC0EXATexture(pspix, pspict, 0)) + if (!NVC0EXAPicture(pNv, pspix, pspict, 0)) NOUVEAU_FALLBACK("src picture invalid\n"); if (pmpict) { - if (!NVC0EXATexture(pmpix, pmpict, 1)) + if (!NVC0EXAPicture(pNv, pmpix, pmpict, 1)) NOUVEAU_FALLBACK("mask picture invalid\n"); - state->have_mask = TRUE; BEGIN_NVC0(push, NVC0_3D(SP_START_ID(5)), 1); if (pdpict->format == PICT_a8) { @@ -800,8 +864,6 @@ NVC0EXAPrepareComposite(int op, } } } else { - state->have_mask = FALSE; - BEGIN_NVC0(push, NVC0_3D(SP_START_ID(5)), 1); if (pdpict->format == PICT_a8) PUSH_DATA (push, PFP_S_A8); @@ -832,32 +894,12 @@ NVC0EXAPrepareComposite(int op, return TRUE; } -static inline void -NVC0EXATransform(PictTransformPtr t, int x, int y, float sx, float sy, - float *x_ret, float *y_ret) -{ - if (t) { - PictVector v; - - v.vector[0] = IntToxFixed(x); - v.vector[1] = IntToxFixed(y); - v.vector[2] = xFixed1; - PictureTransformPoint(t, &v); - *x_ret = xFixedToFloat(v.vector[0]) / sx; - *y_ret = xFixedToFloat(v.vector[1]) / sy; - } else { - *x_ret = (float)x / sx; - *y_ret = (float)y / sy; - } -} - void NVC0EXAComposite(PixmapPtr pdpix, int sx, int sy, int mx, int my, int dx, int dy, int w, int h) { NVC0EXA_LOCALS(pdpix); - float sX0, sX1, sX2, sY0, sY1, sY2; if (!PUSH_SPACE(push, 64)) return; @@ -867,39 +909,9 @@ NVC0EXAComposite(PixmapPtr pdpix, PUSH_DATA (push, ((dy + h) << 16) | dy); BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); PUSH_DATA (push, NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_TRIANGLES); - - NVC0EXATransform(state->unit[0].transform, sx, sy + (h * 2), - state->unit[0].width, state->unit[0].height, - &sX0, &sY0); - NVC0EXATransform(state->unit[0].transform, sx, sy, - state->unit[0].width, state->unit[0].height, - &sX1, &sY1); - NVC0EXATransform(state->unit[0].transform, sx + (w * 2), sy, - state->unit[0].width, state->unit[0].height, - &sX2, &sY2); - - if (state->have_mask) { - float mX0, mX1, mX2, mY0, mY1, mY2; - - NVC0EXATransform(state->unit[1].transform, mx, my + (h * 2), - state->unit[1].width, state->unit[1].height, - &mX0, &mY0); - NVC0EXATransform(state->unit[1].transform, mx, my, - state->unit[1].width, state->unit[1].height, - &mX1, &mY1); - NVC0EXATransform(state->unit[1].transform, mx + (w * 2), my, - state->unit[1].width, state->unit[1].height, - &mX2, &mY2); - - VTX2s(pNv, sX0, sY0, mX0, mY0, dx, dy + (h * 2)); - VTX2s(pNv, sX1, sY1, mX1, mY1, dx, dy); - VTX2s(pNv, sX2, sY2, mX2, mY2, dx + (w * 2), dy); - } else { - VTX1s(pNv, sX0, sY0, dx, dy + (h * 2)); - VTX1s(pNv, sX1, sY1, dx, dy); - VTX1s(pNv, sX2, sY2, dx + (w * 2), dy); - } - + PUSH_VTX2s(push, sx, sy + (h * 2), mx, my + (h * 2), dx, dy + (h * 2)); + PUSH_VTX2s(push, sx, sy, mx, my, dx, dy); + PUSH_VTX2s(push, sx + (w * 2), sy, mx + (w * 2), my, dx + (w * 2), dy); BEGIN_NVC0(push, NVC0_3D(VERTEX_END_GL), 1); PUSH_DATA (push, 0); } diff --git a/src/nvc0_shader.h b/src/nvc0_shader.h index 73727fc..4d1679e 100644 --- a/src/nvc0_shader.h +++ b/src/nvc0_shader.h @@ -8,7 +8,7 @@ } while(0) static uint32_t -NVC0VP_Passthrough[] = { +NVC0VP_Transform2[] = { 0x00020461, 0x00000000, 0x00000000, @@ -30,19 +30,75 @@ NVC0VP_Passthrough[] = { 0x00000000, /* VP_EXPORT_EN[0x2c0] */ 0x00000000, 0xfff01c66, - 0x06000080, /* vfetch { $r0,1,2,3 } b128 a[0x80] */ - 0xfff11c26, - 0x06000090, /* vfetch { $r4,5 } b64 a[0x90] */ - 0xfff19c26, - 0x060000a0, /* vfetch { $r6,7 } b64 a[0xa0] */ + 0x06000080, 0x03f01c66, - 0x0a7e0070, /* export v[0x70] { $r0 $r1 $r2 $r3 } */ - 0x13f01c26, - 0x0a7e0080, /* export v[0x80] { $r4 $r5 } */ - 0x1bf01c26, - 0x0a7e0090, /* export v[0x90] { $r6 $r7 } */ + 0x0a7e0070, + 0xfff01c26, + 0x06000090, + 0x00009c40, + 0x58004000, + 0x3000dc40, + 0x58004000, + 0x60011c40, + 0x58004000, + 0x10109c40, + 0x30044000, + 0x4010dc40, + 0x30064000, + 0x70111c40, + 0x30084000, + 0x20209c20, + 0x50004000, + 0x5030dc20, + 0x50004000, + 0x80411c20, + 0x50004000, + 0x10411c00, + 0xc8000000, + 0x10209c40, + 0x58000000, + 0x1030dc40, + 0x58000000, + 0x90201c40, + 0x58004000, + 0xa0305c40, + 0x58004000, + 0x03f01c26, + 0x0a7e0080, + 0xfff01c26, + 0x060000a0, + 0xb0009c40, + 0x58004000, + 0xe000dc40, + 0x58004000, + 0x10011c40, + 0x58004001, + 0x00109c40, + 0x30044001, + 0xf010dc40, + 0x30064000, + 0x20111c40, + 0x30084001, + 0xd0209c20, + 0x50004000, + 0x0030dc20, + 0x50004001, + 0x30411c20, + 0x50004001, + 0x10411c00, + 0xc8000000, + 0x10209c40, + 0x58000000, + 0x1030dc40, + 0x58000000, + 0x40201c40, + 0x58004001, + 0x50305c40, + 0x58004001, + 0x03f01c26, + 0x0a7e0090, 0x00001de7, - 0x80000000, /* exit */ + 0x80000000, }; static uint32_t @@ -364,9 +420,9 @@ NVC0FP_NV12[] = { 0x30515c20, 0x50004000, 0x0bf01c40, - 0xc07e0090, + 0xc07e0080, 0x0bf05c40, - 0xc07e0094, + 0xc07e0084, 0xfc001e86, 0x80130001, 0x4000dc40, diff --git a/src/nvc0_xv.c b/src/nvc0_xv.c index 74ac7dc..3b6d01f 100644 --- a/src/nvc0_xv.c +++ b/src/nvc0_xv.c @@ -208,6 +208,19 @@ nvc0_xv_image_put(ScrnInfoPtr pScrn, BEGIN_NVC0(push, NVC0_3D(TEX_CACHE_CTL), 1); PUSH_DATA (push, 0); + PUSH_DATAu(push, pNv->scratch, PVP_DATA, 11); + PUSH_DATAf(push, 1.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, 1.0); + PUSH_DATAf(push, 1.0 / width); + PUSH_DATAf(push, 1.0 / height); + if (0 && pPriv->SyncToVBlank) { NV50SyncToVBlank(ppix, dstBox); } @@ -230,11 +243,6 @@ nvc0_xv_image_put(ScrnInfoPtr pScrn, int sy1=pbox->y1; int sy2=pbox->y2; - tx1 = tx1 / width; - tx2 = tx2 / width; - ty1 = ty1 / height; - ty2 = ty2 / height; - if (nouveau_pushbuf_space(push, 64, 0, 0) || nouveau_pushbuf_refn (push, refs, 3)) return BadImplementation; @@ -245,9 +253,9 @@ nvc0_xv_image_put(ScrnInfoPtr pScrn, BEGIN_NVC0(push, NVC0_3D(VERTEX_BEGIN_GL), 1); PUSH_DATA (push, NVC0_3D_VERTEX_BEGIN_GL_PRIMITIVE_TRIANGLES); - VTX2s(pNv, tx1, ty1, tx1, ty1, sx1, sy1); - VTX2s(pNv, tx2+(tx2-tx1), ty1, tx2+(tx2-tx1), ty1, sx2+(sx2-sx1), sy1); - VTX2s(pNv, tx1, ty2+(ty2-ty1), tx1, ty2+(ty2-ty1), sx1, sy2+(sy2-sy1)); + PUSH_VTX1s(push, tx1, ty1, sx1, sy1); + PUSH_VTX1s(push, tx2+(tx2-tx1), ty1, sx2+(sx2-sx1), sy1); + PUSH_VTX1s(push, tx1, ty2+(ty2-ty1), sx1, sy2+(sy2-sy1)); BEGIN_NVC0(push, NVC0_3D(VERTEX_END_GL), 1); PUSH_DATA (push, 0); @@ -271,8 +279,8 @@ nvc0_xv_csc_update(NVPtr pNv, float yco, float *off, float *uco, float *vco) BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3); PUSH_DATA (push, 256); - PUSH_DATA (push, (pNv->scratch->offset + CB_OFFSET) >> 32); - PUSH_DATA (push, (pNv->scratch->offset + CB_OFFSET)); + PUSH_DATA (push, (pNv->scratch->offset + PFP_DATA) >> 32); + PUSH_DATA (push, (pNv->scratch->offset + PFP_DATA)); BEGIN_NVC0(push, NVC0_3D(CB_POS), 11); PUSH_DATA (push, 0); PUSH_DATAf(push, yco); diff --git a/src/nve0_shader.h b/src/nve0_shader.h index 8f36279..b727d68 100644 --- a/src/nve0_shader.h +++ b/src/nve0_shader.h @@ -2,7 +2,7 @@ #define __NVE0_SHADER_H__ static uint32_t -NVE0VP_Passthrough[] = { +NVE0VP_Transform2[] = { 0x00020461, 0x00000000, 0x00000000, @@ -24,19 +24,75 @@ NVE0VP_Passthrough[] = { 0x00000000, /* VP_EXPORT_EN[0x2c0] */ 0x00000000, 0xfff01c66, - 0x06000080, /* vfetch { $r0,1,2,3 } b128 a[0x80] */ - 0xfff11c26, - 0x06000090, /* vfetch { $r4,5 } b64 a[0x90] */ - 0xfff19c26, - 0x060000a0, /* vfetch { $r6,7 } b64 a[0xa0] */ + 0x06000080, 0x03f01c66, - 0x0a7e0070, /* export v[0x70] { $r0 $r1 $r2 $r3 } */ - 0x13f01c26, - 0x0a7e0080, /* export v[0x80] { $r4 $r5 } */ - 0x1bf01c26, - 0x0a7e0090, /* export v[0x90] { $r6 $r7 } */ + 0x0a7e0070, + 0xfff01c26, + 0x06000090, + 0x00009c40, + 0x58004000, + 0x3000dc40, + 0x58004000, + 0x60011c40, + 0x58004000, + 0x10109c40, + 0x30044000, + 0x4010dc40, + 0x30064000, + 0x70111c40, + 0x30084000, + 0x20209c20, + 0x50004000, + 0x5030dc20, + 0x50004000, + 0x80411c20, + 0x50004000, + 0x10411c00, + 0xc8000000, + 0x10209c40, + 0x58000000, + 0x1030dc40, + 0x58000000, + 0x90201c40, + 0x58004000, + 0xa0305c40, + 0x58004000, + 0x03f01c26, + 0x0a7e0080, + 0xfff01c26, + 0x060000a0, + 0xb0009c40, + 0x58004000, + 0xe000dc40, + 0x58004000, + 0x10011c40, + 0x58004001, + 0x00109c40, + 0x30044001, + 0xf010dc40, + 0x30064000, + 0x20111c40, + 0x30084001, + 0xd0209c20, + 0x50004000, + 0x0030dc20, + 0x50004001, + 0x30411c20, + 0x50004001, + 0x10411c00, + 0xc8000000, + 0x10209c40, + 0x58000000, + 0x1030dc40, + 0x58000000, + 0x40201c40, + 0x58004001, + 0x50305c40, + 0x58004001, + 0x03f01c26, + 0x0a7e0090, 0x00001de7, - 0x80000000, /* exit */ + 0x80000000, }; static uint32_t -- cgit v1.2.1