xserver-xorg-video-nouveau: Changes to 'ubuntu'
debian/changelog | 11
debian/control | 2
src/drmmode_display.c | 567 ++++++++++++--------
src/nouveau_dri2.c | 68 --
src/nouveau_exa.c | 110 ++-
src/nouveau_hw.h | 17
src/nouveau_wfb.c | 22
src/nouveau_xv.c | 40 +
src/nv04_exa.c | 86 ++-
src/nv04_xv_blit.c | 26
src/nv10_exa.c | 1376 ++++++++++++++++++++++----------------------------
src/nv30_exa.c | 75 ++
src/nv30_shaders.c | 27
src/nv30_shaders.h | 4
src/nv30_xv_tex.c | 77 +-
src/nv40_exa.c | 71 +-
src/nv40_xv_tex.c | 66 +-
src/nv50_accel.c | 177 +++---
src/nv50_crtc.c | 40 -
src/nv50_exa.c | 144 +++--
src/nv50_xv.c | 104 ++-
src/nv_accel_common.c | 5
src/nv_crtc.c | 34 -
src/nv_cursor.c | 79 +-
src/nv_driver.c | 31 -
src/nv_proto.h | 6
src/nv_type.h | 4
27 files changed, 1777 insertions(+), 1492 deletions(-)
New commits:
commit 3fbc682795264d8081d615abfbe7fc0647ad889b
Author: Christopher James Halse Rogers <raof@cooperteam.net>
Date: Fri Dec 4 15:41:34 2009 +1100
Update snapshot
diff --git a/debian/changelog b/debian/changelog
index b78af5c..80668a2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+xserver-xorg-video-nouveau (1:0.0.10~git+20091204+95fc663-0ubuntu1) lucid; urgency=low
+
+ * New upstream snapshot, up to commit
+ 95fc663d5fb653fc0a50aa4d589bbf3b9c79e928.
+ + Too many commits to usefully list in the changelog.
+ * debian/control:
+ + Bump versioned Build-Dep on libdrm-dev to >= 2.4.16~ to pick up nouveau
+ #define updates.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com> Fri, 04 Dec 2009 12:31:58 +1100
+
xserver-xorg-video-nouveau (1:0.0.10~git+20090823+569a17a-0ubuntu1) karmic; urgency=low
* Merge package from Debian experimental. Remaining Ubuntu changes:
diff --git a/debian/control b/debian/control
index dce50cf..da41dc3 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
XSBC-Original-Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Uploaders: Chris Lamb <lamby@debian.org>, Matthew Johnson <mjj29@debian.org>
-Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.4.12+git20090801.45078630), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, automake, libtool, xutils-dev, xserver-xorg-dev, quilt
+Build-Depends: debhelper (>= 7), pkg-config, xserver-xorg-dev (>= 2:1.2.99.902), x11proto-video-dev, x11proto-core-dev, x11proto-fonts-dev, x11proto-randr-dev (>= 1.2), x11proto-render-dev, x11proto-xext-dev, libdrm-dev (>= 2.4.16~), x11proto-xf86dri-dev, x11proto-gl-dev, mesa-common-dev, automake, libtool, xutils-dev, xserver-xorg-dev, quilt
Standards-Version: 3.8.2
Homepage: http://nouveau.freedesktop.org/wiki/
Vcs-Git: git://git.debian.org/git/pkg-xorg/driver/xserver-xorg-video-nouveau
commit 95fc663d5fb653fc0a50aa4d589bbf3b9c79e928
Author: Ben Skeggs <bskeggs@redhat.com>
Date: Thu Nov 26 13:10:45 2009 +1000
shadowfb: fix segv on fb resize
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index e8099b4..efc2826 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1120,7 +1120,7 @@ drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch,
(!pNv->NoAccel || pNv->ShadowPtr) ?
pNv->ShadowPtr : pNv->scanout->map);
-
+ scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
nouveau_bo_unmap(pNv->scanout);
for (i = 0; i < xf86_config->num_crtc; i++) {
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 4595940..a0656af 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -637,6 +637,7 @@ nouveau_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
screen->ModifyPixmapHeader(ppix, width, height, -1, -1, pitch,
(!pNv->NoAccel || pNv->ShadowFB) ?
pNv->ShadowPtr : pNv->scanout->map);
+ scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr;
nouveau_bo_unmap(pNv->scanout);
for (i = 0; i < xf86_config->num_crtc; i++) {
commit 1cf0cfa926dd78698ff8b8c2d776bcdaa6a867bd
Author: Ben Skeggs <bskeggs@redhat.com>
Date: Thu Nov 26 10:04:43 2009 +1000
kms: zfill fb if we have no accel to do copy, better than random garbage
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index d1e3ec3..e8099b4 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -171,8 +171,13 @@ drmmode_fbcon_copy(ScrnInfoPtr pScrn)
unsigned w = pScrn->virtualX, h = pScrn->virtualY;
int i, ret, fbcon_id = 0;
- if (!pNv->exa_driver_pixmaps)
+ if (!pNv->exa_driver_pixmaps) {
+ if (nouveau_bo_map(pNv->scanout, NOUVEAU_BO_WR))
+ return;
+ memset(pNv->scanout->map, 0x00, pNv->scanout->size);
+ nouveau_bo_unmap(pNv->scanout);
return;
+ }
for (i = 0; i < xf86_config->num_crtc; i++) {
drmmode_crtc_private_ptr drmmode_crtc =
commit 92578fb4db0feb549bea82d0874ba0e39a2b1ae2
Author: Francisco Jerez <currojerez@riseup.net>
Date: Thu Nov 5 18:30:28 2009 +0100
nv10/exa: Rename VIEWPORT_SCALE to VIEWPORT_TRANSLATE.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index 70f2fbc..9ccca8f 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -930,7 +930,7 @@ NVAccelInitNV10TCL(ScrnInfoPtr pScrn)
OUT_RING (chan, 0);
OUT_RINGf (chan, 65536.0);
- BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_SCALE_X, 4);
+ BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_TRANSLATE_X, 4);
OUT_RINGf (chan, -2048.0);
OUT_RINGf (chan, -2048.0);
OUT_RINGf (chan, 0);
commit 9de0d97bd2fc2ee8800d48b5340a3d495525ad3e
Author: Francisco Jerez <currojerez@riseup.net>
Date: Thu Nov 5 13:29:09 2009 +0100
nv04-nv40/exa: Match the blob behavior more closely on PrepareCopy.
Fix a somewhat indeterministic corruption problem on nv17 when there
is stuff going on the other fifos (e.g. gallium but I've also
reproduced it with an app just SIFM-ing memory around): in some cases
it made the blits the X server had scheduled fail corrupting the
nearby screen areas.
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
diff --git a/src/nv04_exa.c b/src/nv04_exa.c
index 71a4ac2..f4966a4 100644
--- a/src/nv04_exa.c
+++ b/src/nv04_exa.c
@@ -209,10 +209,16 @@ NV04EXAPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int dx, int dy,
MARK_UNDO(chan);
return FALSE;
}
+
+ BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_SURFACE, 1);
+ OUT_RING (chan, pNv->NvContextSurfaces->handle);
BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
OUT_RING (chan, 1); /* ROP_AND */
+
NV04EXASetROP(pScrn, alu, planemask);
} else {
+ BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_SURFACE, 1);
+ OUT_RING (chan, pNv->NvContextSurfaces->handle);
BEGIN_RING(chan, blit, NV04_IMAGE_BLIT_OPERATION, 1);
OUT_RING (chan, 3); /* SRCCOPY */
}
commit 16ef9ff7e394a693fc74764d8bc2630e784947f3
Author: Francisco Jerez <currojerez@riseup.net>
Date: Thu Nov 5 03:28:00 2009 +0100
nv10/exa: Spring-cleaning
* Kill the A8+A8 hack. Recent enough X servers (>=1.7) fall back to
ARGB glyphs for drivers not supporting A8 render targets.
* Kill all the global state. It doesn't matter a lot yet but it might
if we get multicard working at some point.
* Other random clean-ups with no functional changes.
Some numbers from x11perf -aa10text -aa24text -comppixwin10 -comppixwin500:
* Before, with A glyphs:
12000000 trep @ 0.0025 msec (394000.0/sec): Char in 80-char aa line (Charter 10)
3200000 trep @ 0.0119 msec ( 84300.0/sec): Char in 30-char aa line (Charter 24)
8000000 trep @ 0.0036 msec (280000.0/sec): Composite 10x10 from pixmap to window
60000 trep @ 0.4813 msec ( 2080.0/sec): Composite 500x500 from pixmap to window
* After, ARGB glyphs:
20000000 trep @ 0.0015 msec (649000.0/sec): Char in 80-char aa line (Charter 10)
4800000 trep @ 0.0057 msec (175000.0/sec): Char in 30-char aa line (Charter 24)
8000000 trep @ 0.0036 msec (280000.0/sec): Composite 10x10 from pixmap to window
60000 trep @ 0.4813 msec ( 2080.0/sec): Composite 500x500 from pixmap to window
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Tested-by: Pekka Paalanen <pq@iki.fi>
diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index fe86fd7..70f2fbc 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -2,6 +2,7 @@
* Copyright 2007 Stephane Marchesin
* Copyright 2007 Arthur Huillet
* Copyright 2007 Peter Winters
+ * Copyright 2009 Francisco Jerez
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -28,24 +29,83 @@
#include "nv_include.h"
-typedef struct nv10_exa_state {
- Bool have_mask;
- Bool is_a8_plus_a8;
- struct {
- PictTransformPtr transform;
- float width;
- float height;
- } unit[2];
-} nv10_exa_state_t;
-static nv10_exa_state_t state;
+/* Texture/Render target formats. */
+static struct pict_format {
+ int exa;
+ int hw;
+} nv10_tex_format_pot[] = {
+ { PICT_a8, 0x80 },
+ { PICT_r5g6b5, 0x280 },
+ { PICT_x8r8g8b8, 0x300 },
+ { PICT_a8r8g8b8, 0x300 },
+ {},
+
+}, nv10_tex_format_rect[] = {
+ { PICT_a8, 0x980 },
+ { PICT_r5g6b5, 0x880 },
+ { PICT_x8r8g8b8, 0x900 },
+ { PICT_a8r8g8b8, 0x900 },
+ {},
+
+}, nv20_tex_format_rect[] = {
+ { PICT_a8, 0xd80 },
+ { PICT_r5g6b5, 0x880 },
+ { PICT_x8r8g8b8, 0x900 },
+ { PICT_a8r8g8b8, 0x900 },
+ {},
+
+}, nv10_rt_format[] = {
+ { PICT_r5g6b5, 0x103 },
+ { PICT_x8r8g8b8, 0x108 },
+ { PICT_a8r8g8b8, 0x108 },
+ {},
+};
+
+static int
+get_tex_format(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.
+ */
+ struct pict_format *format =
+ pict->repeat != RepeatNone ? nv10_tex_format_pot :
+ pNv->Architecture == NV_ARCH_20 ? nv20_tex_format_rect :
+ nv10_tex_format_rect;
+
+ for (; format->hw; format++) {
+ if (format->exa == pict->format)
+ return format->hw;
+ }
+
+ return 0;
+}
+
+static int
+get_rt_format(PicturePtr pict)
+{
+ struct pict_format *format = nv10_rt_format;
+
+ for (; format->hw; format++) {
+ if (format->exa == pict->format)
+ return format->hw;
+ }
+
+ return 0;
+}
+/* Blending functions. */
#define SF(x) NV10TCL_BLEND_FUNC_SRC_##x
#define DF(x) NV10TCL_BLEND_FUNC_DST_##x
-static struct nv10_pictop {
+static struct pict_op {
int src;
int dst;
-} NV10PictOp [] = {
+
+} nv10_pict_op[] = {
{ SF(ZERO), DF(ZERO) }, /* Clear */
{ SF(ONE), DF(ZERO) }, /* Src */
{ SF(ZERO), DF(ONE) }, /* Dst */
@@ -61,131 +121,91 @@ static struct nv10_pictop {
{ SF(ONE), DF(ONE) }, /* Add */
};
-static inline bool needs_src_alpha(int op)
+static inline Bool
+needs_src_alpha(int op)
{
- return NV10PictOp[op].dst == DF(ONE_MINUS_SRC_ALPHA)
- || NV10PictOp[op].dst == DF(SRC_ALPHA);
+ return nv10_pict_op[op].dst == DF(ONE_MINUS_SRC_ALPHA)
+ || nv10_pict_op[op].dst == DF(SRC_ALPHA);
}
-static inline bool needs_src(int op)
+static inline Bool
+needs_src(int op)
{
- return NV10PictOp[op].src != DF(ZERO);
+ return nv10_pict_op[op].src != DF(ZERO);
}
-static inline bool effective_component_alpha(PicturePtr mask)
+static inline Bool
+effective_component_alpha(PicturePtr mask)
{
return mask && mask->componentAlpha && PICT_FORMAT_RGB(mask->format);
}
-static int NV10TexFormat(int ExaFormat)
-{
- struct {int exa;int hw;} tex_format[] =
- {
- {PICT_a8r8g8b8, 0x900},
- {PICT_x8r8g8b8, 0x900},
- {PICT_r5g6b5, 0x880}, /*this one was only tested with rendercheck*/
- /*{PICT_a1r5g5b5, NV10TCL_TX_FORMAT_FORMAT_R5G5B5A1},
- {PICT_a4r4g4b4, NV10TCL_TX_FORMAT_FORMAT_R4G4B4A4},*/
- {PICT_a8, 0x980}, /*this is a NV1x only format, corresponding NV2x is 0xD80, we hack it in below*/
- };
-
- int i;
- for (i = 0; i < sizeof(tex_format) / sizeof(tex_format[0]); i++) {
- if (tex_format[i].exa == ExaFormat)
- return tex_format[i].hw;
- }
-
- return 0;
-}
-
-static int NV10DstFormat(int ExaFormat)
-{
- struct {int exa;int hw;} dst_format[] =
- {
- {PICT_a8r8g8b8, 0x108},
- {PICT_x8r8g8b8, 0x108},
- {PICT_r5g6b5, 0x103}
- };
-
- int i;
- for (i = 0; i < sizeof(dst_format) / sizeof(dst_format[0]); i++) {
- if (dst_format[i].exa == ExaFormat)
- return dst_format[i].hw;
- }
-
- return 0;
-}
-
-static Bool NV10CheckTexture(PicturePtr Picture)
+static Bool
+check_texture(PicturePtr pict)
{
int w, h;
- if (!Picture->pDrawable)
+ if (!pict->pDrawable)
NOUVEAU_FALLBACK("Solid and gradient pictures unsupported\n");
- w = Picture->pDrawable->width;
- h = Picture->pDrawable->height;
+ w = pict->pDrawable->width;
+ h = pict->pDrawable->height;
- if ((w > 2046) || (h > 2046))
+ if (w > 2046 || h > 2046)
NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h);
- if (!NV10TexFormat(Picture->format))
+ if (!get_tex_format(pict))
return FALSE;
- if (Picture->filter != PictFilterNearest && Picture->filter != PictFilterBilinear)
+
+ if (pict->filter != PictFilterNearest &&
+ pict->filter != PictFilterBilinear)
return FALSE;
- /* we cannot repeat on NV10 because NPOT textures do not support this. unfortunately. */
- if (Picture->repeat != RepeatNone)
+
+ /* We cannot repeat on NV10 because NPOT textures do not
+ * support this. unfortunately. */
+ if (pict->repeat != RepeatNone)
/* we can repeat 1x1 textures */
if (!(w == 1 && h == 1))
return FALSE;
+
return TRUE;
}
-static Bool NV10CheckBuffer(PicturePtr Picture)
+static Bool
+check_render_target(PicturePtr pict)
{
- int w = Picture->pDrawable->width;
- int h = Picture->pDrawable->height;
+ int w = pict->pDrawable->width;
+ int h = pict->pDrawable->height;
- if ((w > 4096) || (h > 4096))
- return FALSE;
- if (!NV10DstFormat(Picture->format))
+ if (w > 4096 || h > 4096)
return FALSE;
- return TRUE;
-}
-static Bool NV10CheckPictOp(int op)
-{
- if (op >= PictOpSaturate) {
- /*we do no saturate, disjoint, conjoint, though we could do e.g. DisjointClear which really is Clear */
+ if (!get_rt_format(pict))
return FALSE;
- }
+
return TRUE;
}
-/* Check if the current operation is a doable A8 + A8 */
-/* A8 destination is a special case, because we do it by having the card think
-it's ARGB. For now we support PictOpAdd which is the only important op for this dst format,
-and without transformation or funny things.*/
-static Bool NV10Check_A8plusA8_Feasability(PicturePtr src, PicturePtr msk, PicturePtr dst, int op)
+static Bool
+check_pict_op(int op)
{
-#if X_BYTE_ORDER == X_BIG_ENDIAN
- return FALSE;
-#endif
- if ((!msk) && (src->format == PICT_a8) && (dst->format == PICT_a8) && (!src->transform) &&
- (op == PictOpAdd) && (src->repeat == RepeatNone)) {
- return TRUE;
- }
- return FALSE;
+ /* We do no saturate, disjoint, conjoint, though we
+ * could do e.g. DisjointClear which really is
+ * Clear. */
+ return op < PictOpSaturate;
}
#if 0
-static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
- PicturePtr pMaskPicture, PicturePtr pDstPicture)
+static void
+print_fallback_info(char *reason, int op, PicturePtr src, PicturePtr mask,
+ PicturePtr dst)
{
char out2[4096];
char *out = out2;
+
sprintf(out, "%s ", reason);
- out = out + strlen(out);
+ out += strlen(out);
+
switch (op) {
case PictOpClear:
sprintf(out, "PictOpClear ");
@@ -208,8 +228,9 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
default:
sprintf(out, "PictOp%d ", op);
}
- out = out + strlen(out);
- switch (pSrcPicture->format) {
+ out += strlen(out);
+
+ switch (src->format) {
case PICT_a8r8g8b8:
sprintf(out, "A8R8G8B8 ");
break;
@@ -229,16 +250,18 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
sprintf(out, "A1 ");
break;
default:
- sprintf(out, "%x ", pSrcPicture->format);
+ sprintf(out, "%x ", src->format);
}
out += strlen(out);
- sprintf(out, "(%dx%d) ", pSrcPicture->pDrawable->width, pSrcPicture->pDrawable->height);
- if (pSrcPicture->repeat != RepeatNone)
+
+ sprintf(out, "(%dx%d) ", src->pDrawable->width,
+ src->pDrawable->height);
+ if (src->repeat != RepeatNone)
strcat(out, "R ");
strcat(out, "-> ");
out += strlen(out);
- switch (pDstPicture->format) {
+ switch (dst->format) {
case PICT_a8r8g8b8:
sprintf(out, "A8R8G8B8 ");
break;
@@ -258,17 +281,20 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
sprintf(out, "A1 ");
break;
default:
- sprintf(out, "%x ", pDstPicture->format);
+ sprintf(out, "%x ", dst->format);
}
out += strlen(out);
- sprintf(out, "(%dx%d) ", pDstPicture->pDrawable->width, pDstPicture->pDrawable->height);
- if (pDstPicture->repeat != RepeatNone)
+
+ sprintf(out, "(%dx%d) ", dst->pDrawable->width,
+ dst->pDrawable->height);
+ if (dst->repeat != RepeatNone)
strcat(out, "R ");
out += strlen(out);
- if (!pMaskPicture)
+
+ if (!mask)
sprintf(out, "& NONE");
else {
- switch (pMaskPicture->format) {
+ switch (mask->format) {
case PICT_a8r8g8b8:
sprintf(out, "& A8R8G8B8 ");
break;
@@ -285,116 +311,98 @@ static void NV10EXAFallbackInfo(char *reason, int op, PicturePtr pSrcPicture,
sprintf(out, "& A1 ");
break;
default:
- sprintf(out, "& %x ", pMaskPicture->format);
+ sprintf(out, "& %x ", mask->format);
}
out += strlen(out);
- sprintf(out, "(%dx%d) ", pMaskPicture->pDrawable->width, pMaskPicture->pDrawable->height);
- if (pMaskPicture->repeat != RepeatNone)
+
+ sprintf(out, "(%dx%d) ", mask->pDrawable->width,
+ mask->pDrawable->height);
+ if (mask->repeat != RepeatNone)
strcat(out, "R ");
- if (pMaskPicture->componentAlpha)
+ if (mask->componentAlpha)
strcat(out, "C ");
out += strlen(out);
}
strcat(out, "\n");
+
xf86DrvMsg(0, X_INFO, "%s", out2);
}
#else
-#define NV10EXAFallbackInfo(X,Y,Z,S,T) do { ; } while (0)
+#define print_fallback_info(...)
#endif
-Bool NV10EXACheckComposite(int op,
- PicturePtr pSrcPicture,
- PicturePtr pMaskPicture,
- PicturePtr pDstPicture)
+Bool
+NV10EXACheckComposite(int op, PicturePtr src, PicturePtr mask, PicturePtr dst)
{
-
- if (NV10Check_A8plusA8_Feasability(pSrcPicture, pMaskPicture, pDstPicture, op)) {
- NV10EXAFallbackInfo("Hackelerating", op, pSrcPicture, pMaskPicture, pDstPicture);
- return TRUE;
- }
-
- if (!NV10CheckPictOp(op)) {
- NV10EXAFallbackInfo("pictop", op, pSrcPicture, pMaskPicture, pDstPicture);
+ if (!check_pict_op(op)) {
+ print_fallback_info("pictop", op, src, mask, dst);
return FALSE;
}
- if (!NV10CheckBuffer(pDstPicture)) {
- NV10EXAFallbackInfo("dst", op, pSrcPicture, pMaskPicture, pDstPicture);
+
+ if (!check_render_target(dst)) {
+ print_fallback_info("dst", op, src, mask, dst);
return FALSE;
}
- if (!NV10CheckTexture(pSrcPicture)) {
- NV10EXAFallbackInfo("src", op, pSrcPicture, pMaskPicture, pDstPicture);
+ if (!check_texture(src)) {
+ print_fallback_info("src", op, src, mask, dst);
return FALSE;
}
- if (pMaskPicture) {
- if (!NV10CheckTexture(pMaskPicture)) {
- NV10EXAFallbackInfo("mask", op, pSrcPicture,
- pMaskPicture, pDstPicture);
+ if (mask) {
+ if (!check_texture(mask)) {
+ print_fallback_info("mask", op, src,
+ mask, dst);
return FALSE;
}
- if (effective_component_alpha(pMaskPicture) &&
+ if (effective_component_alpha(mask) &&
needs_src(op) && needs_src_alpha(op)) {
- NV10EXAFallbackInfo("ca-mask", op, pSrcPicture,
- pMaskPicture, pDstPicture);
+ print_fallback_info("ca-mask", op, src,
+ mask, dst);
return FALSE;
}
}
- NV10EXAFallbackInfo("Accelerating", op, pSrcPicture, pMaskPicture, pDstPicture);
+ print_fallback_info("Accelerating", op, src, mask, dst);
return TRUE;
}
-static Bool NV10SetTexture(NVPtr pNv, int unit, PicturePtr Pict, PixmapPtr pixmap)
+static Bool
+setup_texture(NVPtr pNv, int unit, PicturePtr pict, PixmapPtr pixmap)
{
struct nouveau_channel *chan = pNv->chan;
struct nouveau_grobj *celsius = pNv->Nv3D;
struct nouveau_bo *bo = nouveau_pixmap_bo(pixmap);
unsigned delta = nouveau_pixmap_offset(pixmap);
- int log2w = log2i(Pict->pDrawable->width);
- int log2h = log2i(Pict->pDrawable->height);
- int w;
+ long w = pict->pDrawable->width,
+ h = pict->pDrawable->height;
unsigned int txfmt =
- (NV10TCL_TX_FORMAT_WRAP_T_CLAMP_TO_EDGE) |
- (NV10TCL_TX_FORMAT_WRAP_S_CLAMP_TO_EDGE) |
- (log2w<<20) |
- (log2h<<16) |
- (1<<12) | /* lod == 1 */
- 0x51 /* UNK */;
+ NV10TCL_TX_FORMAT_WRAP_T_CLAMP_TO_EDGE |
+ NV10TCL_TX_FORMAT_WRAP_S_CLAMP_TO_EDGE |
+ log2i(w) << 20 | log2i(h) << 16 |
+ 1 << 12 | /* lod == 1 */
+ get_tex_format(pict) |
+ 0x51 /* UNK */;
BEGIN_RING(chan, celsius, NV10TCL_TX_OFFSET(unit), 1);
if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD))
return FALSE;
- /* 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 */
- if (Pict->repeat != RepeatNone)
- {
- if (Pict->format == PICT_a8)
- txfmt |= 0x80; /* A8 */
- else if (Pict->format == PICT_r5g6b5 )
- txfmt |= 0x280; /* R5G6B5 */
- else
- txfmt |= 0x300; /* ARGB format */
- } else {
- if (pNv->Architecture == NV_ARCH_20 && Pict->format == PICT_a8)
- txfmt |= 0xd80;
- else
- txfmt |= NV10TexFormat(Pict->format);
- w = Pict->pDrawable->width;
- /* NPOT_SIZE expects an even number for width, we can round up uneven
- * numbers here because EXA always gives 64 byte aligned pixmaps
- * and for all formats we support 64 bytes represents an even number
- * of pixels
- */
+ if (pict->repeat == RepeatNone) {
+ /* NPOT_SIZE expects an even number for width, we can
+ * round up uneven numbers here because EXA always
+ * gives 64 byte aligned pixmaps and for all formats
+ * we support 64 bytes represents an even number of
+ * pixels
+ */
w = (w + 1) &~ 1;
BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_PITCH(unit), 1);
OUT_RING (chan, exaGetPixmapPitch(pixmap) << 16);
BEGIN_RING(chan, celsius, NV10TCL_TX_NPOT_SIZE(unit), 1);
- OUT_RING (chan, (w<<16) | Pict->pDrawable->height);
+ OUT_RING (chan, w << 16 | h);
}
BEGIN_RING(chan, celsius, NV10TCL_TX_FORMAT(unit), 1 );
@@ -404,218 +412,135 @@ static Bool NV10SetTexture(NVPtr pNv, int unit, PicturePtr Pict, PixmapPtr pixma
OUT_RING (chan, NV10TCL_TX_ENABLE_ENABLE);
BEGIN_RING(chan, celsius, NV10TCL_TX_FILTER(unit), 1);
- if (Pict->filter == PictFilterNearest)
- OUT_RING (chan, (NV10TCL_TX_FILTER_MAGNIFY_NEAREST) |
- (NV10TCL_TX_FILTER_MINIFY_NEAREST));
+ if (pict->filter == PictFilterNearest)
+ OUT_RING(chan, (NV10TCL_TX_FILTER_MAGNIFY_NEAREST |
+ NV10TCL_TX_FILTER_MINIFY_NEAREST));
else
- OUT_RING (chan, (NV10TCL_TX_FILTER_MAGNIFY_LINEAR) |
- (NV10TCL_TX_FILTER_MINIFY_LINEAR));
+ OUT_RING(chan, (NV10TCL_TX_FILTER_MAGNIFY_LINEAR |
+ NV10TCL_TX_FILTER_MINIFY_LINEAR));
- state.unit[unit].width = (float)pixmap->drawable.width;
- state.unit[unit].height = (float)pixmap->drawable.height;
- state.unit[unit].transform = Pict->transform;
return TRUE;
}
-static Bool NV10SetBuffer(NVPtr pNv, PicturePtr Pict, PixmapPtr pixmap)
+static Bool
+setup_render_target(NVPtr pNv, PicturePtr pict, PixmapPtr pixmap)
{
struct nouveau_channel *chan = pNv->chan;
struct nouveau_grobj *celsius = pNv->Nv3D;
struct nouveau_bo *bo = nouveau_pixmap_bo(pixmap);
unsigned delta = nouveau_pixmap_offset(pixmap);
- int i;
- int x = 0;
- int y = 0;
- int w = 2048;
- int h = 2048;
-
- BEGIN_RING(chan, celsius, NV10TCL_RT_FORMAT, 4);
- if (state.is_a8_plus_a8) {
- /*A8 + A8 hack */
- OUT_RING (chan, NV10DstFormat(PICT_a8r8g8b8));
- } else {
- OUT_RING (chan, NV10DstFormat(Pict->format));
- }
- OUT_RING (chan, ((uint32_t)exaGetPixmapPitch(pixmap) << 16) |(uint32_t)exaGetPixmapPitch(pixmap));
+ BEGIN_RING(chan, celsius, NV10TCL_RT_FORMAT, 2);
+ OUT_RING (chan, get_rt_format(pict));
+ OUT_RING (chan, (exaGetPixmapPitch(pixmap) << 16 |
+ exaGetPixmapPitch(pixmap)));
+
+ BEGIN_RING(chan, celsius, NV10TCL_COLOR_OFFSET, 1);
if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR))
return FALSE;
- OUT_RING (chan, 0);
- BEGIN_RING(chan, celsius, NV10TCL_RT_HORIZ, 2);
- OUT_RING (chan, (w<<16)|x);
- OUT_RING (chan, (h<<16)|y);
- BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_MODE, 1); /* clip_mode */
- OUT_RING (chan, 0);
- BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
- OUT_RING (chan, ((w-1+x)<<16)|x|0x08000800);
- BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
- OUT_RING (chan, ((h-1+y)<<16)|y|0x08000800);
+ return TRUE;
+}
- BEGIN_RING(chan, celsius, NV10TCL_PROJECTION_MATRIX(0), 16);
- for(i=0;i<16;i++)
- if (i/4==i%4)
- OUT_RINGf (chan, 1.0f);
- else
- OUT_RINGf (chan, 0.0f);
+/*
+ * 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
+ */
- BEGIN_RING(chan, celsius, NV10TCL_DEPTH_RANGE_NEAR, 2);
- OUT_RING (chan, 0);
-#if SCREEN_BPP == 32
- OUT_RINGf (chan, 16777216.0);
-#else
- OUT_RINGf (chan, 65536.0);
-#endif
- BEGIN_RING(chan, celsius, NV10TCL_VIEWPORT_SCALE_X, 4);
- OUT_RINGf (chan, -2048.0);
- OUT_RINGf (chan, -2048.0);
- OUT_RINGf (chan, 0);
- OUT_RING (chan, 0);
+/* Bind the combiner variable <input> to a constant 1. */
+#define RC_IN_ONE(input) \
+ (NV10TCL_RC_IN_RGB_##input##_INPUT_ZERO | \
+ NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_ALPHA | \
+ NV10TCL_RC_IN_RGB_##input##_MAPPING_UNSIGNED_INVERT_NV)
- return TRUE;
-}
+/* Bind the combiner variable <input> to the specified channel from
+ * the texture unit <unit>. */
+#define RC_IN_TEX(input, chan, unit) \
+ (NV10TCL_RC_IN_RGB_##input##_INPUT_TEXTURE##unit##_ARB | \
+ NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan)
-#define RC_IN_ONE(chan, input) \
- (NV10TCL_RC_IN_##chan##_##input##_INPUT_ZERO \
- | NV10TCL_RC_IN_##chan##_##input##_COMPONENT_USAGE_##chan \
- | NV10TCL_RC_IN_##chan##_##input##_MAPPING_UNSIGNED_INVERT_NV)
+/* Bind the combiner variable <input> to the specified channel from
+ * the constant color <unit>. */
+#define RC_IN_COLOR(input, chan, unit) \
+ (NV10TCL_RC_IN_RGB_##input##_INPUT_CONSTANT_COLOR##unit##_NV | \
+ NV10TCL_RC_IN_RGB_##input##_COMPONENT_USAGE_##chan)
-static void NV10SetRegCombs(NVPtr pNv, PicturePtr src, PicturePtr mask)
+static void
+setup_combiners(NVPtr pNv, PicturePtr src, PicturePtr mask)
{
struct nouveau_channel *chan = pNv->chan;
struct nouveau_grobj *celsius = pNv->Nv3D;
- unsigned int rc0_in_alpha = 0, rc0_in_rgb = 0;
-
-/*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
-
-*/
+ uint32_t rc_in_alpha = 0, rc_in_rgb = 0;
+
if (PICT_FORMAT_A(src->format))
- rc0_in_alpha |= NV10TCL_RC_IN_ALPHA_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA;
+ rc_in_alpha |= RC_IN_TEX(A, ALPHA, 0);
else
- rc0_in_alpha |= RC_IN_ONE(ALPHA, A);
+ rc_in_alpha |= RC_IN_ONE(A);
if (mask && PICT_FORMAT_A(mask->format))
- rc0_in_alpha |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
- | NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_ALPHA;
+ rc_in_alpha |= RC_IN_TEX(B, ALPHA, 1);
else
- rc0_in_alpha |= RC_IN_ONE(ALPHA, B);
+ rc_in_alpha |= RC_IN_ONE(B);
if (effective_component_alpha(mask)) {
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
- | NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
if (!needs_src_alpha(pNv->alu)) {
- /*
- * The alpha channels won't be used for blending. Drop
+ /* 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))
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_RGB;
-
+ rc_in_rgb |= RC_IN_TEX(A, RGB, 0);
} else {
- /*
- * The RGB channels won't be used for blending. Drop
+ /* The RGB channels won't be used for blending. Drop
* them.
* output_i = src_alpha * mask_i
*/
if (PICT_FORMAT_A(src->format))
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA;
+ rc_in_rgb |= RC_IN_TEX(A, ALPHA, 0);
else
- rc0_in_rgb |= RC_IN_ONE(RGB, A);
+ rc_in_rgb |= RC_IN_ONE(A);
}
+ rc_in_rgb |= RC_IN_TEX(B, RGB, 1);
+
} else {
if (PICT_FORMAT_RGB(src->format))
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_RGB;
+ rc_in_rgb |= RC_IN_TEX(A, RGB, 0);
if (mask && PICT_FORMAT_A(mask->format))
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_B_INPUT_TEXTURE1_ARB
- | NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_ALPHA;
+ rc_in_rgb |= RC_IN_TEX(B, ALPHA, 1);
else
- rc0_in_rgb |= RC_IN_ONE(RGB, B);
+ rc_in_rgb |= RC_IN_ONE(B);
}
BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(0), 1);
- OUT_RING (chan, rc0_in_alpha);
+ OUT_RING (chan, rc_in_alpha);
BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(0), 1);
- OUT_RING (chan, rc0_in_rgb);
+ OUT_RING (chan, rc_in_rgb);
}
-static void NV10SetRegCombs_A8plusA8(NVPtr pNv, int pass, int mask_out_bytes)
-{
- struct nouveau_channel *chan = pNv->chan;
- struct nouveau_grobj *celsius = pNv->Nv3D;
- unsigned int rc0_in_alpha = 0, rc0_in_rgb = 0;
- unsigned int color0 = 0, color1 = 0;
-
- if (pass == 1) {
- if (~mask_out_bytes & 1)
- rc0_in_alpha |= NV10TCL_RC_IN_ALPHA_A_INPUT_TEXTURE1_ARB
- | NV10TCL_RC_IN_ALPHA_A_COMPONENT_USAGE_ALPHA
- | RC_IN_ONE(ALPHA, B);
-
- if (~mask_out_bytes & 2)
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA
- | NV10TCL_RC_IN_RGB_B_INPUT_CONSTANT_COLOR0_NV
- | NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
- color0 = 0x00ff0000; /*R = 1 G = 0 B = 0*/
- } else {
- if (~mask_out_bytes & 8)
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_A_INPUT_TEXTURE0_ARB
- | NV10TCL_RC_IN_RGB_A_COMPONENT_USAGE_ALPHA
- | NV10TCL_RC_IN_RGB_B_INPUT_CONSTANT_COLOR0_NV
- | NV10TCL_RC_IN_RGB_B_COMPONENT_USAGE_RGB;
-
- color0 = 0x000000ff;
-
- if (~mask_out_bytes & 4)
- rc0_in_rgb |= NV10TCL_RC_IN_RGB_C_INPUT_TEXTURE1_ARB
- | NV10TCL_RC_IN_RGB_C_COMPONENT_USAGE_ALPHA
- | NV10TCL_RC_IN_RGB_D_INPUT_CONSTANT_COLOR1_NV
- | NV10TCL_RC_IN_RGB_D_COMPONENT_USAGE_RGB;
-
- color1 = 0x0000ff00; /*R = 0, G = 1, B = 0*/
- }
-
- BEGIN_RING(chan, celsius, NV10TCL_RC_IN_ALPHA(0), 1);
- OUT_RING (chan, rc0_in_alpha);
- BEGIN_RING(chan, celsius, NV10TCL_RC_IN_RGB(0), 1);
- OUT_RING (chan, rc0_in_rgb);
- BEGIN_RING(chan, celsius, NV10TCL_RC_COLOR(0), 2);
- OUT_RING (chan, color0);
- OUT_RING (chan, color1);
-}
-
Reply to: