[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-nouveau: Changes to 'upstream-experimental'



 configure.ac                |    2 
 man/nouveau.man             |   15 
 src/Makefile.am             |    5 
 src/compat-api.h            |   41 
 src/drmmode_display.c       |  166 
 src/hwdefs/nv01_2d.xml.h    | 1416 ++++++
 src/hwdefs/nv10_3d.xml.h    | 1637 +++++++
 src/hwdefs/nv30-40_3d.xml.h | 2052 +++++++++
 src/hwdefs/nv50_2d.xml.h    |  434 ++
 src/hwdefs/nv50_3d.xml.h    | 2127 ++++++++++
 src/hwdefs/nv50_defs.xml.h  |  155 
 src/hwdefs/nv50_texture.h   |  166 
 src/hwdefs/nv_3ddefs.xml.h  |   93 
 src/hwdefs/nv_m2mf.xml.h    |  174 
 src/hwdefs/nv_object.xml.h  |  301 +
 src/hwdefs/nvc0_3d.xml.h    | 1867 +++++++++
 src/hwdefs/nvc0_m2mf.xml.h  |  178 
 src/nouveau_class.h         | 9084 --------------------------------------------
 src/nouveau_dri2.c          |  329 +
 src/nouveau_exa.c           |  373 -
 src/nouveau_local.h         |  172 
 src/nouveau_wfb.c           |    4 
 src/nouveau_xv.c            |  217 -
 src/nv04_accel.h            |   83 
 src/nv04_exa.c              |  541 +-
 src/nv04_xv_blit.c          |  272 -
 src/nv10_exa.c              |  887 +---
 src/nv30_exa.c              | 1067 ++---
 src/nv30_shaders.c          |  350 -
 src/nv30_shaders.h          |   72 
 src/nv30_xv_tex.c           |  351 -
 src/nv40_exa.c              | 1065 +++--
 src/nv40_xv_tex.c           |  336 -
 src/nv50_accel.c            |  687 +--
 src/nv50_accel.h            |   78 
 src/nv50_defs.xml.h         |  144 
 src/nv50_exa.c              |  916 ++--
 src/nv50_texture.h          |  166 
 src/nv50_xv.c               |  389 -
 src/nv_3ddefs.xml.h         |   93 
 src/nv_accel_common.c       |  642 +--
 src/nv_const.h              |    2 
 src/nv_dma.c                |   81 
 src/nv_dma.h                |    4 
 src/nv_driver.c             |   95 
 src/nv_include.h            |   17 
 src/nv_object.xml.h         |  246 -
 src/nv_proto.h              |   27 
 src/nv_shadow.c             |    3 
 src/nv_type.h               |   57 
 src/nvc0_3d.xml.h           | 1093 -----
 src/nvc0_accel.c            |  849 ----
 src/nvc0_accel.h            |  130 
 src/nvc0_exa.c              | 1178 ++---
 src/nvc0_m2mf.xml.h         |  138 
 src/nvc0_shader.h           |  444 ++
 src/nvc0_xv.c               |  431 --
 src/nve0_shader.h           |  460 ++
 src/vl_hwmc.c               |   43 
 59 files changed, 17264 insertions(+), 17181 deletions(-)

New commits:
commit ace77b6b1304826f4004bde23809b55d476b0615
Author: Ben Skeggs <bskeggs@redhat.com>
Date:   Tue May 29 21:21:57 2012 +1000

    disable fermi accel on 0.0.16 interface
    
    Kepler accel support broke some assumption made by the older kernel
    interface, and Fermi shares the same code.  It can't work (without
    some annoying hacks anyway) with the 0.0.16 kernel anymore.

diff --git a/src/nv_dma.c b/src/nv_dma.c
index 3b75ca9..1757f4d 100644
--- a/src/nv_dma.c
+++ b/src/nv_dma.c
@@ -36,6 +36,12 @@ NVInitDma(ScrnInfoPtr pScrn)
 	int size, ret;
 	void *data;
 
+	if (pNv->dev->drm_version < 0x01000000 && pNv->dev->chipset >= 0xc0) {
+		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+			   "Fermi acceleration not supported on old kernel\n");
+		return FALSE;
+	}
+
 	if (pNv->Architecture < NV_ARCH_C0) {
 		data = &nv04_data;
 		size = sizeof(nv04_data);

commit 7041e30ab8beb627bbf569367961a658e79c2bdc
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed May 23 14:18:24 2012 +0100

    vl_hwmc: add missing compat include.
    
    Reported-by: tallica on irc.
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/vl_hwmc.c b/src/vl_hwmc.c
index 32eb258..ecad0b4 100644
--- a/src/vl_hwmc.c
+++ b/src/vl_hwmc.c
@@ -9,6 +9,8 @@
 #include <xf86.h>
 #include <fourcc.h>
 
+#include "compat-api.h"
+
 #define FOURCC_RGB	0x0000003
 #define XVIMAGE_RGB								\
 {										\

commit 2abf8467cfb7a7648ce73ba5bcbbc62219d65d6d
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed May 23 11:29:05 2012 +0100

    nouveau: add compat-api.h to makefile.
    
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/Makefile.am b/src/Makefile.am
index 0bdd780..6aeb486 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -60,6 +60,7 @@ nouveau_drv_la_SOURCES = \
 			 nvc0_exa.c \
 			 nvc0_xv.c \
 			 drmmode_display.c \
+			 compat-api.h \
 			 vl_hwmc.c \
 			 vl_hwmc.h
 

commit 1d861ad716861c57b2b81531d21840d7c8de024b
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed May 23 11:15:06 2012 +0100

    nouveau: convert two more xf86Screens access to macros
    
    for some reason the script missed these two, just fix them manually.
    
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/nv50_exa.c b/src/nv50_exa.c
index cd99e10..1212eb6 100644
--- a/src/nv50_exa.c
+++ b/src/nv50_exa.c
@@ -27,7 +27,7 @@
 #include "nv50_accel.h"
 
 #define NV50EXA_LOCALS(p)                                                      \
-	ScrnInfoPtr pScrn = xf86Screens[(p)->drawable.pScreen->myNum];         \
+	ScrnInfoPtr pScrn = xf86ScreenToScrn((p)->drawable.pScreen);         \
 	NVPtr pNv = NVPTR(pScrn);                                              \
 	struct nouveau_pushbuf *push = pNv->pushbuf; (void)push;
 
diff --git a/src/nvc0_exa.c b/src/nvc0_exa.c
index c68b3fb..9d23a91 100644
--- a/src/nvc0_exa.c
+++ b/src/nvc0_exa.c
@@ -28,7 +28,7 @@
 #define NOUVEAU_BO(a, b, c) (NOUVEAU_BO_##a | NOUVEAU_BO_##b | NOUVEAU_BO_##c)
 
 #define NVC0EXA_LOCALS(p)                                                      \
-	ScrnInfoPtr pScrn = xf86Screens[(p)->drawable.pScreen->myNum];         \
+	ScrnInfoPtr pScrn = xf86ScreenToScrn((p)->drawable.pScreen);         \
 	NVPtr pNv = NVPTR(pScrn);                                              \
 	struct nouveau_pushbuf *push = pNv->pushbuf; (void)push;
 

commit 5625fb84efc699e65da0062ae101915a49f2969b
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed May 23 11:13:30 2012 +0100

    nouveau: convert scrn/screen to using new interfaces
    
    This commit was generated with the util/modular/x-driver-screen-scrn-conv.sh
    
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 23e8232..7211427 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -117,7 +117,7 @@ static PixmapPtr
 drmmode_pixmap_wrap(ScreenPtr pScreen, int width, int height, int depth,
 		    int bpp, int pitch, struct nouveau_bo *bo, void *data)
 {
-	NVPtr pNv = NVPTR(xf86Screens[pScreen->myNum]);
+	NVPtr pNv = NVPTR(xf86ScreenToScrn(pScreen));
 	PixmapPtr ppix;
 
 	if (!pNv->NoAccel)
@@ -201,7 +201,7 @@ drmmode_crtc_dpms(xf86CrtcPtr drmmode_crtc, int mode)
 void
 drmmode_fbcon_copy(ScreenPtr pScreen)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 #if XORG_VERSION_CURRENT >= 10999001
 	ExaDriverPtr exa = pNv->EXADriverPtr;
@@ -1076,7 +1076,7 @@ static Bool
 drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	ScreenPtr screen = screenInfo.screens[scrn->scrnIndex];
+	ScreenPtr screen = xf86ScrnToScreen(scrn);
 	NVPtr pNv = NVPTR(scrn);
 	drmmode_crtc_private_ptr
 		    drmmode_crtc = xf86_config->crtc[0]->driver_private;
@@ -1241,7 +1241,7 @@ drmmode_remove_fb(ScrnInfoPtr pScrn)
 int
 drmmode_cursor_init(ScreenPtr pScreen)
 {
-	NVPtr pNv = NVPTR(xf86Screens[pScreen->myNum]);
+	NVPtr pNv = NVPTR(xf86ScreenToScrn(pScreen));
 	int size = nv_cursor_width(pNv);
 	int flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
 		    HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32 |
@@ -1255,7 +1255,7 @@ Bool
 drmmode_page_flip(DrawablePtr draw, PixmapPtr back, void *priv,
 		  unsigned int ref_crtc_hw_id)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
 	drmmode_crtc_private_ptr crtc = config->crtc[0]->driver_private;
 	drmmode_ptr mode = crtc->drmmode;
@@ -1346,7 +1346,7 @@ drmmode_handle_uevents(ScrnInfoPtr scrn)
 	if (!dev)
 		return;
 
-	RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
+	RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
 	udev_device_unref(dev);
 }
 #endif
@@ -1455,7 +1455,7 @@ drmmode_wakeup_handler(pointer data, int err, pointer p)
 void
 drmmode_screen_init(ScreenPtr pScreen)
 {
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 	drmmode_ptr drmmode = drmmode_from_scrn(scrn);
 
 	drmmode_uevent_init(scrn);
@@ -1477,7 +1477,7 @@ drmmode_screen_init(ScreenPtr pScreen)
 void
 drmmode_screen_fini(ScreenPtr pScreen)
 {
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 
 	drmmode_uevent_fini(scrn);
 }
diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c
index 7e47575..27627e6 100644
--- a/src/nouveau_dri2.c
+++ b/src/nouveau_dri2.c
@@ -26,7 +26,7 @@ nouveau_dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment,
 			   unsigned int format)
 {
 	ScreenPtr pScreen = pDraw->pScreen;
-	NVPtr pNv = NVPTR(xf86Screens[pScreen->myNum]);
+	NVPtr pNv = NVPTR(xf86ScreenToScrn(pScreen));
 	struct nouveau_dri2_buffer *nvbuf;
 	struct nouveau_pixmap *nvpix;
 	PixmapPtr ppix;
@@ -180,7 +180,7 @@ update_front(DrawablePtr draw, DRI2BufferPtr front)
 static Bool
 can_exchange(DrawablePtr draw, PixmapPtr dst_pix, PixmapPtr src_pix)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
 	NVPtr pNv = NVPTR(scrn);
 	int i;
@@ -202,7 +202,7 @@ can_exchange(DrawablePtr draw, PixmapPtr dst_pix, PixmapPtr src_pix)
 static Bool
 can_sync_to_vblank(DrawablePtr draw)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	NVPtr pNv = NVPTR(scrn);
 
 	return pNv->glx_vblank &&
@@ -214,7 +214,7 @@ static int
 nouveau_wait_vblank(DrawablePtr draw, int type, CARD64 msc,
 		    CARD64 *pmsc, CARD64 *pust, void *data)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	NVPtr pNv = NVPTR(scrn);
 	int crtcs = nv_window_belongs_to_crtc(scrn, draw->x, draw->y,
 					      draw->width, draw->height);
@@ -244,7 +244,7 @@ nouveau_wait_vblank(DrawablePtr draw, int type, CARD64 msc,
 static Bool
 nouveau_dri2_swap_limit_validate(DrawablePtr draw, int swap_limit)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	NVPtr pNv = NVPTR(scrn);
 
 	if ((swap_limit < 1 ) || (swap_limit > pNv->max_swap_limit))
@@ -260,7 +260,7 @@ nouveau_dri2_swap_limit_validate(DrawablePtr draw, int swap_limit)
  */
 static Bool violate_oml(DrawablePtr draw)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	NVPtr pNv = NVPTR(scrn);
 
 	return (DRI2INFOREC_VERSION < 6) && (pNv->swap_limit > 1);
@@ -271,7 +271,7 @@ nouveau_dri2_finish_swap(DrawablePtr draw, unsigned int frame,
 			 unsigned int tv_sec, unsigned int tv_usec,
 			 struct nouveau_dri2_vblank_state *s)
 {
-	ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 	NVPtr pNv = NVPTR(scrn);
 	PixmapPtr dst_pix;
 	PixmapPtr src_pix = nouveau_dri2_buffer(s->src)->ppix;
@@ -579,7 +579,7 @@ nouveau_dri2_vblank_handler(int fd, unsigned int frame,
 		nouveau_dri2_finish_swap(draw, frame, tv_sec, tv_usec, s);
 #if DRI2INFOREC_VERSION >= 6
 		/* Restore real swap limit on drawable, now that it is safe. */
-		ScrnInfoPtr scrn = xf86Screens[draw->pScreen->myNum];
+		ScrnInfoPtr scrn = xf86ScreenToScrn(draw->pScreen);
 		DRI2SwapLimit(draw, NVPTR(scrn)->swap_limit);
 #endif
 
@@ -617,7 +617,7 @@ nouveau_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
 	}
 
 	screen = draw->pScreen;
-	scrn = xf86Screens[screen->myNum];
+	scrn = xf86ScreenToScrn(screen);
 
 	pixmap = screen->GetScreenPixmap(screen);
 	xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, 4,
@@ -663,7 +663,7 @@ nouveau_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
 Bool
 nouveau_dri2_init(ScreenPtr pScreen)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	DRI2InfoRec dri2 = { 0 };
 	const char *drivernames[2][2] = {
diff --git a/src/nouveau_exa.c b/src/nouveau_exa.c
index 9aaa3f2..7b3b086 100644
--- a/src/nouveau_exa.c
+++ b/src/nouveau_exa.c
@@ -83,7 +83,7 @@ static Bool
 nouveau_exa_prepare_access(PixmapPtr ppix, int index)
 {
 	struct nouveau_bo *bo = nouveau_pixmap_bo(ppix);
-	NVPtr pNv = NVPTR(xf86Screens[ppix->drawable.pScreen->myNum]);
+	NVPtr pNv = NVPTR(xf86ScreenToScrn(ppix->drawable.pScreen));
 
 	if (nv50_style_tiled_pixmap(ppix) && !pNv->wfb_enabled)
 		return FALSE;
@@ -108,7 +108,7 @@ static void *
 nouveau_exa_create_pixmap(ScreenPtr pScreen, int width, int height, int depth,
 			  int usage_hint, int bitsPerPixel, int *new_pitch)
 {
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(scrn);
 	struct nouveau_pixmap *nvpix;
 	int ret;
@@ -148,7 +148,7 @@ nouveau_exa_destroy_pixmap(ScreenPtr pScreen, void *priv)
 bool
 nv50_style_tiled_pixmap(PixmapPtr ppix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 
 	return pNv->Architecture >= NV_ARCH_50 &&
@@ -159,7 +159,7 @@ static Bool
 nouveau_exa_download_from_screen(PixmapPtr pspix, int x, int y, int w, int h,
 				 char *dst, int dst_pitch)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pspix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pspix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_bo *bo;
 	int src_pitch, tmp_pitch, cpp, offset;
@@ -219,7 +219,7 @@ static Bool
 nouveau_exa_upload_to_screen(PixmapPtr pdpix, int x, int y, int w, int h,
 			     char *src, int src_pitch)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdpix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdpix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	int dst_pitch, tmp_pitch, cpp;
 	int max_lines, lines, i;
@@ -306,7 +306,7 @@ memcpy:
 Bool
 nouveau_exa_pixmap_is_onscreen(PixmapPtr ppix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 
 	if (pScrn->pScreen->GetScreenPixmap(pScrn->pScreen) == ppix)
 		return TRUE;
@@ -317,7 +317,7 @@ nouveau_exa_pixmap_is_onscreen(PixmapPtr ppix)
 Bool
 nouveau_exa_init(ScreenPtr pScreen) 
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	ExaDriverPtr exa;
 
diff --git a/src/nouveau_xv.c b/src/nouveau_xv.c
index aea6c39..11248e6 100644
--- a/src/nouveau_xv.c
+++ b/src/nouveau_xv.c
@@ -1540,7 +1540,7 @@ NVDisplaySurface(XF86SurfacePtr surface,
 static XF86VideoAdaptorPtr
 NVSetupBlitVideo (ScreenPtr pScreen)
 {
-	ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr         pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr               pNv       = NVPTR(pScrn);
 	XF86VideoAdaptorPtr adapt;
 	NVPortPrivPtr       pPriv;
@@ -1609,7 +1609,7 @@ NVSetupBlitVideo (ScreenPtr pScreen)
 static XF86VideoAdaptorPtr
 NVSetupOverlayVideoAdapter(ScreenPtr pScreen)
 {
-	ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr         pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr               pNv       = NVPTR(pScrn);
 	XF86VideoAdaptorPtr adapt;
 	NVPortPrivPtr       pPriv;
@@ -1759,7 +1759,7 @@ NVChipsetHasOverlay(NVPtr pNv)
 static XF86VideoAdaptorPtr
 NVSetupOverlayVideo(ScreenPtr pScreen)
 {
-	ScrnInfoPtr          pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr          pScrn = xf86ScreenToScrn(pScreen);
 	XF86VideoAdaptorPtr  overlayAdaptor = NULL;
 	NVPtr                pNv   = NVPTR(pScrn);
 
@@ -1804,7 +1804,7 @@ static XF86ImageRec NV30TexturedImages[NUM_FORMAT_TEXTURED] =
 static XF86VideoAdaptorPtr
 NV30SetupTexturedVideo (ScreenPtr pScreen, Bool bicubic)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	XF86VideoAdaptorPtr adapt;
 	NVPortPrivPtr pPriv;
@@ -1885,7 +1885,7 @@ static XF86ImageRec NV40TexturedImages[NUM_FORMAT_TEXTURED] =
 static XF86VideoAdaptorPtr
 NV40SetupTexturedVideo (ScreenPtr pScreen, Bool bicubic)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	XF86VideoAdaptorPtr adapt;
 	NVPortPrivPtr pPriv;
@@ -1957,7 +1957,7 @@ NV50TexturedImages[] =
 static XF86VideoAdaptorPtr
 NV50SetupTexturedVideo (ScreenPtr pScreen)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	XF86VideoAdaptorPtr adapt;
 	NVPortPrivPtr pPriv;
@@ -2015,7 +2015,7 @@ NV50SetupTexturedVideo (ScreenPtr pScreen)
 void
 NVSetupTexturedVideo (ScreenPtr pScreen, XF86VideoAdaptorPtr *textureAdaptor)
 {
-	ScrnInfoPtr          pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr          pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr                pNv = NVPTR(pScrn);
 
 	if (!pNv->Nv3D)
@@ -2046,7 +2046,7 @@ NVSetupTexturedVideo (ScreenPtr pScreen, XF86VideoAdaptorPtr *textureAdaptor)
 void
 NVInitVideo(ScreenPtr pScreen)
 {
-	ScrnInfoPtr          pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr          pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr                pNv = NVPTR(pScrn);
 	XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
 	XF86VideoAdaptorPtr  overlayAdaptor = NULL;
diff --git a/src/nv04_exa.c b/src/nv04_exa.c
index 77bb3b7..7ede9d9 100644
--- a/src/nv04_exa.c
+++ b/src/nv04_exa.c
@@ -45,7 +45,7 @@ NV04EXASetPattern(NVPtr pNv, CARD32 clr0, CARD32 clr1, CARD32 pat0, CARD32 pat1)
 static Bool
 NV04EXASetROP(PixmapPtr ppix, int subc, int mthd, int alu, Pixel planemask)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 
@@ -86,7 +86,7 @@ NV04EXASetROP(PixmapPtr ppix, int subc, int mthd, int alu, Pixel planemask)
 Bool
 NV04EXAPrepareSolid(PixmapPtr ppix, int alu, Pixel planemask, Pixel fg)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	struct nouveau_bo *bo = nouveau_pixmap_bo(ppix);
@@ -140,7 +140,7 @@ NV04EXAPrepareSolid(PixmapPtr ppix, int alu, Pixel planemask, Pixel fg)
 void
 NV04EXASolid (PixmapPtr pPixmap, int x, int y, int x2, int y2)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	int w = x2 - x;
@@ -161,7 +161,7 @@ NV04EXASolid (PixmapPtr pPixmap, int x, int y, int x2, int y2)
 void
 NV04EXADoneSolid (PixmapPtr pPixmap)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen);
 	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
 }
 
@@ -169,7 +169,7 @@ Bool
 NV04EXAPrepareCopy(PixmapPtr pspix, PixmapPtr pdpix, int dx, int dy,
 		   int alu, Pixel planemask)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pspix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pspix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	struct nouveau_bo *src_bo = nouveau_pixmap_bo(pspix);
@@ -214,7 +214,7 @@ void
 NV04EXACopy(PixmapPtr pdpix, int srcX, int srcY, int dstX, int dstY,
 	    int width, int height)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdpix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdpix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	int split_dstY = NOUVEAU_ALIGN(dstY + 1, 64);
@@ -270,7 +270,7 @@ NV04EXACopy(PixmapPtr pdpix, int srcX, int srcY, int dstX, int dstY,
 void
 NV04EXADoneCopy(PixmapPtr pdpix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdpix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdpix->drawable.pScreen);
 	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
 }
 
diff --git a/src/nv10_exa.c b/src/nv10_exa.c
index 2da8cf6..a3f7df3 100644
--- a/src/nv10_exa.c
+++ b/src/nv10_exa.c
@@ -337,7 +337,7 @@ 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];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(dst->pDrawable->pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 
 	if (!check_pict_op(op)) {
@@ -545,7 +545,7 @@ NV10EXAPrepareComposite(int op,
 			PixmapPtr mask,
 			PixmapPtr dst)
 {
-	ScrnInfoPtr pScrn = xf86Screens[dst->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(dst->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	uint32_t sc, sa, mc, ma;
@@ -607,7 +607,7 @@ void
 NV10EXAComposite(PixmapPtr pix_dst,
 		 int sx, int sy, int mx, int my, int dx, int dy, int w, int h)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pix_dst->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pix_dst->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 
@@ -627,7 +627,7 @@ NV10EXAComposite(PixmapPtr pix_dst,
 void
 NV10EXADoneComposite(PixmapPtr dst)
 {
-	ScrnInfoPtr pScrn = xf86Screens[dst->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(dst->drawable.pScreen);
 	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
 }
 
diff --git a/src/nv30_exa.c b/src/nv30_exa.c
index 57979c2..9be52e5 100644
--- a/src/nv30_exa.c
+++ b/src/nv30_exa.c
@@ -470,7 +470,7 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict,
 		PixmapPtr  pmPix,
 		PixmapPtr  pdPix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	nv_pict_op_t *blend = NV30_GetPictOpRec(op);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
@@ -555,7 +555,7 @@ void
 NV30EXAComposite(PixmapPtr pdPix,
 		 int sx, int sy, int mx, int my, int dx, int dy, int w, int h)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 
@@ -582,7 +582,7 @@ NV30EXAComposite(PixmapPtr pdPix,
 void
 NV30EXADoneComposite(PixmapPtr pdPix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
 }
 
diff --git a/src/nv40_exa.c b/src/nv40_exa.c
index 2361552..ce0d78a 100644
--- a/src/nv40_exa.c
+++ b/src/nv40_exa.c
@@ -456,7 +456,7 @@ NV40EXAPrepareComposite(int op, PicturePtr psPict,
 				PixmapPtr  pmPix,
 				PixmapPtr  pdPix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	nv_pict_op_t *blend = NV40_GetPictOpRec(op);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
@@ -537,7 +537,7 @@ void
 NV40EXAComposite(PixmapPtr pdPix,
 		 int sx, int sy, int mx, int my, int dx, int dy, int w, int h)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 
@@ -564,7 +564,7 @@ NV40EXAComposite(PixmapPtr pdPix,
 void
 NV40EXADoneComposite(PixmapPtr pdPix)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pdPix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
 	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
 }
 
diff --git a/src/nv50_accel.c b/src/nv50_accel.c
index 42b27f0..16ff643 100644
--- a/src/nv50_accel.c
+++ b/src/nv50_accel.c
@@ -30,7 +30,7 @@
 void
 NV50SyncToVBlank(PixmapPtr ppix, BoxPtr box)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	int crtcs;
diff --git a/src/nv_accel_common.c b/src/nv_accel_common.c
index 4516e97..7d56093 100644
--- a/src/nv_accel_common.c
+++ b/src/nv_accel_common.c
@@ -123,7 +123,7 @@ nouveau_allocate_surface(ScrnInfoPtr scrn, int width, int height, int bpp,
 void
 NV11SyncToVBlank(PixmapPtr ppix, BoxPtr box)
 {
-	ScrnInfoPtr pScrn = xf86Screens[ppix->drawable.pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	struct nouveau_pushbuf *push = pNv->pushbuf;
 	int crtcs;
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 9f6d75f..98486f8 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -404,7 +404,7 @@ NVBlockHandler (
 static Bool
 NVCreateScreenResources(ScreenPtr pScreen)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	PixmapPtr ppix;
 
@@ -1061,7 +1061,7 @@ NVLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
 static Bool
 NVScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
-	ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+	ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 	NVPtr pNv = NVPTR(pScrn);
 	int ret;
 	VisualPtr visual;
diff --git a/src/vl_hwmc.c b/src/vl_hwmc.c
index 6e9e0c7..32eb258 100644
--- a/src/vl_hwmc.c
+++ b/src/vl_hwmc.c
@@ -114,7 +114,7 @@ XF86MCAdaptorPtr vlCreateAdaptorXvMC(ScreenPtr pScreen, char *xv_adaptor_name)
 	assert(pScreen);
 	assert(xv_adaptor_name);
 	
-	pScrn = xf86Screens[pScreen->myNum];
+	pScrn = xf86ScreenToScrn(pScreen);
 	adaptor = xf86XvMCCreateAdaptorRec();
 	
 	if (!adaptor)
@@ -150,7 +150,7 @@ void vlInitXvMC(ScreenPtr pScreen, unsigned int num_adaptors, XF86MCAdaptorPtr *
 	for (i = 0; i < num_adaptors; ++i)
 		assert(adaptors[i]);
 	
-	pScrn = xf86Screens[pScreen->myNum];
+	pScrn = xf86ScreenToScrn(pScreen);
 	
 	if (!xf86XvMCScreenInit(pScreen, num_adaptors, adaptors))
 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Failed to initialize extension.\n");

commit 9f037f7be516ebf8fa4a67a5c9ff258594ab353e
Author: Dave Airlie <airlied@redhat.com>
Date:   Wed May 23 11:12:59 2012 +0100

    nouveau: add initial compat-api header
    
    This just provides the scrn conversion and picture stuff so far.
    
    Signed-off-by: Dave Airlie <airlied@redhat.com>

diff --git a/src/compat-api.h b/src/compat-api.h
new file mode 100644
index 0000000..1bb7724
--- /dev/null
+++ b/src/compat-api.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Dave Airlie <airlied@redhat.com>
+ */
+
+/* this file provides API compat between server post 1.13 and pre it,
+   it should be reused inside as many drivers as possible */
+#ifndef COMPAT_API_H
+#define COMPAT_API_H
+
+#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
+#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
+#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
+#endif
+
+#ifndef XF86_HAS_SCRN_CONV
+#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
+#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
+#endif
+
+#endif
diff --git a/src/nv_include.h b/src/nv_include.h
index 0d104a3..8d628c0 100644
--- a/src/nv_include.h
+++ b/src/nv_include.h
@@ -63,6 +63,8 @@
 
 #define NV_DMA_DEBUG 0
 
+#include "compat-api.h"
+
 #include "nouveau_local.h"
 
 #include "nv_type.h"

commit 581564466c47ab0435ecca3cf4d82c03e1b30259
Author: Francisco Jerez <currojerez@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.slusarz@gmail.com>
    Signed-off-by: Francisco Jerez <currojerez@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, &reg);
 
-		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.slusarz@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 <bskeggs@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 <madman2003@gmail.com>
    Signed-off-by: Ben Skeggs <bskeggs@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 <bskeggs@redhat.com>
Date:   Tue Apr 24 10:54:51 2012 +1000

    nv40/exa: support for solid pictures
    
    Signed-off-by: Ben Skeggs <bskeggs@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)


Reply to: