summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-04-19 16:58:52 +1000
committerBen Skeggs <bskeggs@redhat.com>2012-04-24 11:56:04 +1000
commit9a3e579f637267b32efc46cfce5d1a36a41323b1 (patch)
treef76654dbbc8304c805f598ba0625dd9600c0bfc9
parent8ea09db1a1e8dff7c341dc3da17edefda7e56e6d (diff)
nvc0/exa: port recent nv50 changes (vp transform, solid pictures, etc)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--src/nvc0_accel.c14
-rw-r--r--src/nvc0_accel.h47
-rw-r--r--src/nvc0_exa.c222
-rw-r--r--src/nvc0_shader.h84
-rw-r--r--src/nvc0_xv.c28
-rw-r--r--src/nve0_shader.h80
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,53 +658,91 @@ 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)
{
if (op > PictOpAdd)
@@ -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