rpms/xorg-x11-drv-i810/devel intel-modeset.patch, 1.2, 1.3 xorg-x11-drv-i810.spec, 1.82, 1.83

Dave Airlie (airlied) fedora-extras-commits at redhat.com
Fri Mar 7 06:53:28 UTC 2008


Author: airlied

Update of /cvs/pkgs/rpms/xorg-x11-drv-i810/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv12430

Modified Files:
	intel-modeset.patch xorg-x11-drv-i810.spec 
Log Message:
* Fri Mar 07 2008 Dave Airlie <airlied at redhat.com> 2.2.1-9
- update modesetting patch to include 965 video + fix for memory
  space leak


intel-modeset.patch:

Index: intel-modeset.patch
===================================================================
RCS file: /cvs/pkgs/rpms/xorg-x11-drv-i810/devel/intel-modeset.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- intel-modeset.patch	6 Mar 2008 07:08:53 -0000	1.2
+++ intel-modeset.patch	7 Mar 2008 06:53:24 -0000	1.3
@@ -740,7 +740,7 @@
 +#endif
 +#endif
 diff --git a/src/i830.h b/src/i830.h
-index c61767d..02c547d 100644
+index c61767d..d19ba7f 100644
 --- a/src/i830.h
 +++ b/src/i830.h
 @@ -86,8 +86,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -832,8 +832,93 @@
  unsigned long intel_get_pixmap_offset(PixmapPtr pPix);
  unsigned long intel_get_pixmap_pitch(PixmapPtr pPix);
  extern Bool I830AccelInit(ScreenPtr pScreen);
+@@ -890,4 +906,11 @@ extern void i830_fixup_devices(ScrnInfoPtr);
+ 
+ #include "intel_batchbuffer.h"
+ 
++/* Mirrors CARD32 definition in Xmd.h */
++#ifdef LONG64
++#define CARD32_HEX "x"
++#else
++#define CARD32_HEX "lx"
++#endif
++
+ #endif /* _I830_H_ */
+diff --git a/src/i830_debug.c b/src/i830_debug.c
+index 7d0c0a0..17044b2 100644
+--- a/src/i830_debug.c
++++ b/src/i830_debug.c
+@@ -957,13 +957,14 @@ i830_dump_error_state(ScrnInfoPtr pScrn)
+ {
+     I830Ptr pI830 = I830PTR(pScrn);
+ 
+-    ErrorF("pgetbl_ctl: 0x%" PRIx32 "getbl_err: 0x%" PRIx32 "\n",
++    ErrorF("pgetbl_ctl: 0x%" CARD32_HEX "getbl_err: 0x%" CARD32_HEX "\n",
+ 	   INREG(PGETBL_CTL), INREG(PGE_ERR));
+ 
+-    ErrorF("ipeir: %" PRIx32 " iphdr: %" PRIx32 "\n", INREG(IPEIR),
++    ErrorF("ipeir: %" CARD32_HEX " iphdr: %" CARD32_HEX "\n", INREG(IPEIR),
+ 	   INREG(IPEHR));
+ 
+-    ErrorF("LP ring tail: %" PRIx32 " head: %" PRIx32 " len: %" PRIx32 " start %" PRIx32 "\n",
++    ErrorF("LP ring tail: %" CARD32_HEX " head: %" CARD32_HEX
++	   " len: %" CARD32_HEX " start %" CARD32_HEX "\n",
+ 	   INREG(LP_RING + RING_TAIL),
+ 	   INREG(LP_RING + RING_HEAD) & HEAD_ADDR,
+ 	   INREG(LP_RING + RING_LEN),
+@@ -974,8 +975,8 @@ i830_dump_error_state(ScrnInfoPtr pScrn)
+ 
+     ErrorF("instdone: %x instpm: %x\n", INREG16(INST_DONE), INREG8(INST_PM));
+ 
+-    ErrorF("memmode: %" PRIx32 " instps: %" PRIx32 "\n", INREG(MEMMODE),
+-	   INREG(INST_PS));
++    ErrorF("memmode: %" CARD32_HEX " instps: %" CARD32_HEX "\n",
++	   INREG(MEMMODE), INREG(INST_PS));
+ 
+     ErrorF("hwstam: %x ier: %x imr: %x iir: %x\n",
+ 	   INREG16(HWSTAM), INREG16(IER), INREG16(IMR), INREG16(IIR));
+@@ -987,12 +988,14 @@ i965_dump_error_state(ScrnInfoPtr pScrn)
+ {
+     I830Ptr pI830 = I830PTR(pScrn);
+ 
+-    ErrorF("pgetbl_ctl: 0x%" PRIx32 " pgetbl_err: 0x%" PRIx32 "\n",
++    ErrorF("pgetbl_ctl: 0x%" CARD32_HEX " pgetbl_err: 0x%" CARD32_HEX "\n",
+ 	   INREG(PGETBL_CTL), INREG(PGE_ERR));
+ 
+-    ErrorF("ipeir: %" PRIx32 " iphdr: %" PRIx32 "\n", INREG(IPEIR_I965), INREG(IPEHR_I965));
++    ErrorF("ipeir: %" CARD32_HEX " iphdr: %" CARD32_HEX "\n",
++	   INREG(IPEIR_I965), INREG(IPEHR_I965));
+ 
+-    ErrorF("LP ring tail: %" PRIx32 " head: %" PRIx32 " len: %" PRIx32 " start %" PRIx32 "\n",
++    ErrorF("LP ring tail: %" CARD32_HEX " head: %" CARD32_HEX 
++	   " len: %" CARD32_HEX " start %" CARD32_HEX "\n",
+ 	   INREG(LP_RING + RING_TAIL),
+ 	   INREG(LP_RING + RING_HEAD) & HEAD_ADDR,
+ 	   INREG(LP_RING + RING_LEN), INREG(LP_RING + RING_START));
+@@ -1004,15 +1007,18 @@ i965_dump_error_state(ScrnInfoPtr pScrn)
+ 	   (int)INREG(INST_DONE_1));
+     ErrorF("instpm: %x\n", (int)INREG(INST_PM));
+ 
+-    ErrorF("memmode: %" PRIx32 " instps: %" PRIx32 "\n", INREG(MEMMODE), INREG(INST_PS_I965));
++    ErrorF("memmode: %" CARD32_HEX " instps: %" CARD32_HEX "\n",
++	   INREG(MEMMODE), INREG(INST_PS_I965));
+ 
+     ErrorF("HW Status mask (hwstam): %x\nIRQ enable (ier): %x "
+ 	   "imr: %x iir: %x\n",
+ 	   (int)INREG(HWSTAM), (int)INREG(IER), (int)INREG(IMR),
+ 	   (int)INREG(IIR));
+ 
+-    ErrorF("acthd: %" PRIx32 " dma_fadd_p: %" PRIx32 "\n", INREG(ACTHD), INREG(DMA_FADD_P));
+-    ErrorF("ecoskpd: %" PRIx32 " excc: %" PRIx32 "\n", INREG(ECOSKPD), INREG(EXCC));
++    ErrorF("acthd: %" CARD32_HEX " dma_fadd_p: %" CARD32_HEX "\n",
++	   INREG(ACTHD), INREG(DMA_FADD_P));
++    ErrorF("ecoskpd: %" CARD32_HEX " excc: %" CARD32_HEX "\n",
++	   INREG(ECOSKPD), INREG(EXCC));
+ 
+     ErrorF("cache_mode: %x/%x\n", (int)INREG(CACHE_MODE_0),
+ 	   (int)INREG(CACHE_MODE_1));
 diff --git a/src/i830_dri.c b/src/i830_dri.c
-index d95ecb2..cfe7220 100644
+index d95ecb2..3e47e92 100644
 --- a/src/i830_dri.c
 +++ b/src/i830_dri.c
 @@ -177,10 +177,12 @@ I830InitDma(ScrnInfoPtr pScrn)
@@ -952,7 +1037,15 @@
  
     if (!I830InitDma(pScrn)) {
        DRICloseScreen(pScreen);
-@@ -1892,22 +1899,24 @@ I830DRI2Prepare(ScreenPtr pScreen)
+@@ -971,7 +978,6 @@ I830DRICloseScreen(ScreenPtr pScreen)
+ {
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    I830Ptr pI830 = I830PTR(pScrn);
+-   I830DRIPtr pI830DRI = (I830DRIPtr) pI830->pDRIInfo->devPrivate;
+ 
+    DPRINTF(PFX, "I830DRICloseScreen\n");
+ 
+@@ -1892,22 +1898,24 @@ I830DRI2Prepare(ScreenPtr pScreen)
      char busId[64];
      drmVersionPtr version;
  
@@ -989,7 +1082,7 @@
      }
  
      version = drmGetVersion(pI830->drmSubFD);
-@@ -1931,7 +1940,11 @@ I830DRI2Prepare(ScreenPtr pScreen)
+@@ -1931,7 +1939,11 @@ I830DRI2Prepare(ScreenPtr pScreen)
      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
  	       "[DRI2] Opened DRM device successfully\n");
  
@@ -1002,7 +1095,16 @@
      if (!pI830->use_ttm_batch)
  	return;
  
-@@ -1994,9 +2007,11 @@ I830DRI2ScreenInit(ScreenPtr pScreen)
+@@ -1954,7 +1966,7 @@ I830DRI2ScreenInit(ScreenPtr pScreen)
+     I830Ptr pI830 = I830PTR(pScrn);
+     I830RingBuffer *ring = pI830->LpRing;
+     drm_i915_init_t info;
+-    int fd, major, minor, patch;
++    int fd;
+     const char *driverName;
+     unsigned int sarea_handle;
+     void *p;
+@@ -1994,9 +2006,11 @@ I830DRI2ScreenInit(ScreenPtr pScreen)
  
      memset(&info, 0, sizeof(info));
      info.func = I915_INIT_DMA2;
@@ -1018,7 +1120,7 @@
      info.sarea_priv_offset = 0;
      info.sarea_handle = sarea_handle;
 diff --git a/src/i830_driver.c b/src/i830_driver.c
-index ba44645..ef9ac24 100644
+index ba44645..953762b 100644
 --- a/src/i830_driver.c
 +++ b/src/i830_driver.c
 @@ -198,6 +198,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1745,7 +1847,15 @@
  
  #if defined(XF86DRI)
     /* Load the dri module if requested. */
-@@ -2362,7 +2453,7 @@ I830BlockHandler(int i,
+@@ -2316,7 +2407,6 @@ void
+ IntelEmitInvarientState(ScrnInfoPtr pScrn)
+ {
+    I830Ptr pI830 = I830PTR(pScrn);
+-   CARD32 ctx_addr;
+ 
+    if (pI830->noAccel)
+       return;
+@@ -2362,7 +2452,7 @@ I830BlockHandler(int i,
      pScreen->BlockHandler = I830BlockHandler;
  
      if (pI830->batch)
@@ -1754,7 +1864,7 @@
      I830VideoBlockHandler(i, blockData, pTimeout, pReadmask);
  }
  
-@@ -2384,7 +2475,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2384,7 +2474,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
  
     pScrn = xf86Screens[pScreen->myNum];
     pI830 = I830PTR(pScrn);
@@ -1765,7 +1875,7 @@
  
     pScrn->displayWidth = (pScrn->virtualX + 63) & ~63;
  
-@@ -2430,48 +2523,74 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2430,48 +2522,74 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
  #endif
     }
  
@@ -1880,7 +1990,7 @@
     }
  
     pI830->directRendering = DRI_TYPE_NONE;
-@@ -2499,6 +2618,12 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2499,6 +2617,12 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     }
  #endif
  
@@ -1893,7 +2003,7 @@
     /* The batchbuffer branch won't work without a bufmgr, so fail now
      * if neither XF86DRI or DRI2 managed to set that up. */
     if (pI830->bufmgr == NULL) {
-@@ -2515,6 +2640,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2515,6 +2639,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
        return FALSE;
     }
  
@@ -1902,7 +2012,7 @@
     xf86DrvMsg(pScrn->scrnIndex,
  	      pI830->pEnt->device->videoRam ? X_CONFIG : X_DEFAULT,
  	      "VideoRam: %d KB\n", pScrn->videoRam);
-@@ -2580,12 +2707,14 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2580,12 +2706,14 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
        pI8301 = I830PTR(pI830->entityPrivate->pScrn_1);
        pI830->LpRing = pI8301->LpRing;
        pI830->overlay_regs = pI8301->overlay_regs;
@@ -1918,7 +2028,7 @@
  
  #if defined(XF86DRI) || defined(DRI2)
     /*
-@@ -2776,7 +2905,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2776,7 +2904,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     pI830->XvEnabled = FALSE;
  #endif
  
@@ -1927,7 +2037,7 @@
        if (pI830->LpRing->mem->size == 0) {
  	  xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
  		     "Disabling acceleration because the ring buffer "
-@@ -2792,7 +2921,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2792,7 +2920,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
  		    "needs 2D acceleration.\n");
  	 pI830->XvEnabled = FALSE;
        }
@@ -1936,7 +2046,7 @@
  	  xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
  		     "Disabling Xv because the overlay register buffer "
  		      "allocation failed.\n");
-@@ -2829,30 +2958,32 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2829,30 +2957,32 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     if (pI830->directRendering == DRI_TYPE_NONE)
        i830_free_3d_memory(pScrn);
  
@@ -1992,7 +2102,7 @@
     }
  #endif
  
-@@ -2862,11 +2993,13 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2862,11 +2992,13 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
  	      pI830->allowPageFlip ? "en" : "dis");
  #endif
  
@@ -2011,7 +2121,7 @@
  
     if (I830IsPrimary(pScrn)) {
        pScrn->fbOffset = pI830->front_buffer->offset;
-@@ -2877,12 +3010,13 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2877,12 +3009,13 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     pI830->xoffset = (pScrn->fbOffset / pI830->cpp) % pScrn->displayWidth;
     pI830->yoffset = (pScrn->fbOffset / pI830->cpp) / pScrn->displayWidth;
  
@@ -2031,7 +2141,7 @@
     DPRINTF(PFX, "assert( if(!I830EnterVT(scrnIndex, 0)) )\n");
  
     if (!pI830->useEXA) {
-@@ -2902,9 +3036,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -2902,9 +3035,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
      if (pScrn->virtualX > pScrn->displayWidth)
  	pScrn->displayWidth = pScrn->virtualX;
  
@@ -2041,7 +2151,7 @@
     DPRINTF(PFX, "assert( if(!fbScreenInit(pScreen, ...) )\n");
     if (!fbScreenInit(pScreen, pI830->FbBase + pScrn->fbOffset, 
                       pScrn->virtualX, pScrn->virtualY,
-@@ -3023,7 +3154,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -3023,7 +3153,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     }
  #endif
  
@@ -2050,7 +2160,7 @@
     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Not available\n");
  #endif
  
-@@ -3035,7 +3166,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
+@@ -3035,7 +3165,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
     if (serverGeneration == 1)
        xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
  
@@ -2059,7 +2169,7 @@
        /* turn off clock gating */
  #if 0
        OUTREG(0x6204, 0x70804000);
-@@ -3124,9 +3255,11 @@ I830LeaveVT(int scrnIndex, int flags)
+@@ -3124,9 +3254,11 @@ I830LeaveVT(int scrnIndex, int flags)
  
     xf86_hide_cursors (pScrn);
  
@@ -2074,7 +2184,7 @@
  
  #if defined(XF86DRI) || defined(DRI2)
     /* don't disable interrupt before stopping the ring for fencing */
-@@ -3134,7 +3267,7 @@ I830LeaveVT(int scrnIndex, int flags)
+@@ -3134,7 +3266,7 @@ I830LeaveVT(int scrnIndex, int flags)
        drmCtlUninstHandler(pI830->drmSubFD);
     }
  #endif
@@ -2083,7 +2193,7 @@
        i830CompareRegsToSnapshot(pScrn, "After LeaveVT");
        i830DumpRegs (pScrn);
     }
-@@ -3146,7 +3279,7 @@ I830LeaveVT(int scrnIndex, int flags)
+@@ -3146,7 +3278,7 @@ I830LeaveVT(int scrnIndex, int flags)
      * allocations until we relese the lock.
      */
  #ifdef XF86DRI_MM
@@ -2092,7 +2202,7 @@
        if (pI830->memory_manager != NULL && pScrn->vtSema) {
  	 drmMMLock(pI830->drmSubFD, DRM_BO_MEM_TT, 1, 0);
        }
-@@ -3176,7 +3309,8 @@ I830EnterVT(int scrnIndex, int flags)
+@@ -3176,7 +3308,8 @@ I830EnterVT(int scrnIndex, int flags)
      */
     if (pI830->SaveGeneration != serverGeneration) {
        pI830->SaveGeneration = serverGeneration;
@@ -2102,7 +2212,7 @@
     }
  
     pI830->leaving = FALSE;
-@@ -3186,7 +3320,7 @@ I830EnterVT(int scrnIndex, int flags)
+@@ -3186,7 +3319,7 @@ I830EnterVT(int scrnIndex, int flags)
        /* Unlock the memory manager first of all so that we can pin our
         * buffer objects
         */
@@ -2111,7 +2221,7 @@
  	 drmMMUnlock(pI830->drmSubFD, DRM_BO_MEM_TT, 1);
        }
     }
-@@ -3201,34 +3335,39 @@ I830EnterVT(int scrnIndex, int flags)
+@@ -3201,34 +3334,39 @@ I830EnterVT(int scrnIndex, int flags)
     /* Update the screen pixmap in case the buffer moved */
     i830_update_front_offset(pScrn);
  
@@ -2171,7 +2281,7 @@
  
  #ifdef DRI2
     if (pI830->directRendering == DRI_TYPE_DRI2) {
-@@ -3318,6 +3457,9 @@ I830EnterVT(int scrnIndex, int flags)
+@@ -3318,6 +3456,9 @@ I830EnterVT(int scrnIndex, int flags)
     if (pI830->checkDevices)
        pI830->devicesTimer = TimerSet(NULL, 0, 1000, I830CheckDevicesTimer, pScrn);
  
@@ -2181,7 +2291,7 @@
     /* Mark 3D state as being clobbered and setup the basics */
     *pI830->last_3d = LAST_3D_OTHER;
     IntelEmitInvarientState(pScrn);
-@@ -3361,9 +3503,11 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen)
+@@ -3361,9 +3502,11 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen)
        TimerCancel(pI830->devicesTimer);
     pI830->devicesTimer = NULL;
  
@@ -2233,20 +2343,19 @@
  	/* this is the front buffer pixmap so set it up as such..*/
          driver_priv->flags |= I830_EXA_PIXMAP_IS_FRONTBUFFER;
 diff --git a/src/i830_memory.c b/src/i830_memory.c
-index 634a796..92f062a 100644
+index 634a796..405d426 100644
 --- a/src/i830_memory.c
 +++ b/src/i830_memory.c
-@@ -165,13 +165,16 @@ i830_bind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
+@@ -165,13 +165,15 @@ i830_bind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
      if (mem->bo.size != 0) {
  	I830Ptr pI830 = I830PTR(pScrn);
  	int ret;
-+	int flags = DRM_BO_FLAG_MEM_VRAM |
-+	  DRM_BO_FLAG_MEM_TT |
-+	  DRM_BO_FLAG_READ |
-+	  DRM_BO_FLAG_WRITE;
++	int flags = DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE;
 +
-+	 if (mem->need_vram)
-+	   flags &= ~DRM_BO_FLAG_MEM_TT;
++	if (mem->need_vram)
++	   flags |= DRM_BO_FLAG_MEM_VRAM;
++	else
++	   flags |= DRM_BO_FLAG_MEM_TT;
  
  	ret = drmBOSetStatus(pI830->drmSubFD, &mem->bo,
 -			     DRM_BO_FLAG_MEM_VRAM |
@@ -2258,7 +2367,7 @@
  			     DRM_BO_MASK_MEM |
  			     DRM_BO_FLAG_READ |
  			     DRM_BO_FLAG_WRITE |
-@@ -199,16 +202,18 @@ i830_bind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
+@@ -199,16 +201,18 @@ i830_bind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
  	mem->bound = TRUE;
      }
  
@@ -2281,7 +2390,7 @@
      }
  
      return TRUE;
-@@ -223,13 +228,15 @@ i830_unbind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
+@@ -223,13 +227,15 @@ i830_unbind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
  	return TRUE;
  
      /* Mark the pages accessible now that they're bound. */
@@ -2300,7 +2409,7 @@
  	i830_clear_tiling(pScrn, mem->fence_nr);
  
  #ifdef XF86DRI_MM
-@@ -353,6 +360,7 @@ i830_reset_allocations(ScrnInfoPtr pScrn)
+@@ -353,6 +359,7 @@ i830_reset_allocations(ScrnInfoPtr pScrn)
      pI830->exa_offscreen = NULL;
      pI830->exa_965_state = NULL;
      pI830->overlay_regs = NULL;
@@ -2308,7 +2417,7 @@
  #ifdef XF86DRI
      pI830->back_buffer = NULL;
      pI830->third_buffer = NULL;
-@@ -488,16 +496,18 @@ i830_allocator_init(ScrnInfoPtr pScrn, unsigned long offset, unsigned long size)
+@@ -488,16 +495,18 @@ i830_allocator_init(ScrnInfoPtr pScrn, unsigned long offset, unsigned long size)
  	if (pI830->memory_manager != NULL) {
  	    int ret;
  
@@ -2333,7 +2442,7 @@
  	    }
  	} else {
  	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
-@@ -522,9 +532,10 @@ i830_allocator_fini(ScrnInfoPtr pScrn)
+@@ -522,9 +531,10 @@ i830_allocator_fini(ScrnInfoPtr pScrn)
  #ifdef XF86DRI_MM
      /* The memory manager is more special */
      if (pI830->memory_manager) {
@@ -2347,7 +2456,7 @@
      }
  #endif /* XF86DRI_MM */
  
-@@ -789,6 +800,7 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
+@@ -789,6 +799,7 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
      mem->end = -1;
      mem->size = size;
      mem->allocated_size = size;
@@ -2355,7 +2464,7 @@
      if (flags & NEED_LIFETIME_FIXED)
  	mem->lifetime_fixed_offset = TRUE;
  
-@@ -840,8 +852,8 @@ i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
+@@ -840,8 +851,8 @@ i830_allocate_memory(ScrnInfoPtr pScrn, const char *name,
  #ifdef XF86DRI_MM
      I830Ptr pI830 = I830PTR(pScrn);
  
@@ -2366,7 +2475,7 @@
      {
  	return i830_allocate_memory_bo(pScrn, name, size, alignment, flags);
      } else
-@@ -1046,6 +1058,24 @@ i830_allocate_overlay(ScrnInfoPtr pScrn)
+@@ -1046,6 +1057,24 @@ i830_allocate_overlay(ScrnInfoPtr pScrn)
      if (!OVERLAY_NOPHYSICAL(pI830))
  	flags |= NEED_PHYSICAL_ADDR;
  
@@ -2391,7 +2500,7 @@
      if (!IS_I965G(pI830)) {
  	pI830->overlay_regs = i830_allocate_memory(pScrn, "overlay registers",
  						   OVERLAY_SIZE, GTT_PAGE_SIZE,
-@@ -1203,6 +1233,9 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox,
+@@ -1203,6 +1232,9 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox,
      else
  	tiling = pI830->tiling;
  
@@ -2401,7 +2510,7 @@
      /* Attempt to allocate it tiled first if we have page flipping on. */
      if (tiling && IsTileable(pScrn, pitch)) {
  	/* XXX: probably not the case on 965 */
-@@ -1227,8 +1260,12 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox,
+@@ -1227,8 +1259,12 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox,
  	return NULL;
      }
  
@@ -2416,7 +2525,7 @@
      return front_buffer;
  }
  
-@@ -1237,10 +1274,13 @@ i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
+@@ -1237,10 +1273,13 @@ i830_allocate_cursor_buffers(ScrnInfoPtr pScrn)
  {
      I830Ptr pI830 = I830PTR(pScrn);
      xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
@@ -2431,7 +2540,7 @@
      /* Try to allocate one big blob for our cursor memory.  This works
       * around a limitation in the FreeBSD AGP driver that allows only one
       * physical allocation larger than a page, and could allow us
-@@ -1353,18 +1393,20 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
+@@ -1353,18 +1392,20 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
      unsigned int pitch = pScrn->displayWidth * pI830->cpp;
      long size;
  
@@ -2457,7 +2566,7 @@
  
      if (pI830->fb_compression)
  	i830_setup_fb_compression(pScrn);
-@@ -1925,14 +1967,16 @@ i830_bind_all_memory(ScrnInfoPtr pScrn)
+@@ -1925,14 +1966,16 @@ i830_bind_all_memory(ScrnInfoPtr pScrn)
  
      if (pI830->StolenOnly == TRUE || pI830->memory_list == NULL)
  	return TRUE;
@@ -2479,7 +2588,7 @@
  
  	for (mem = pI830->memory_list->next; mem->next != NULL;
  	     mem = mem->next)
-@@ -1949,7 +1993,7 @@ i830_bind_all_memory(ScrnInfoPtr pScrn)
+@@ -1949,7 +1992,7 @@ i830_bind_all_memory(ScrnInfoPtr pScrn)
  	}
  #endif
      }
@@ -2488,7 +2597,7 @@
  	i830_update_cursor_offsets(pScrn);
  
      return TRUE;
-@@ -1964,7 +2008,7 @@ i830_unbind_all_memory(ScrnInfoPtr pScrn)
+@@ -1964,7 +2007,7 @@ i830_unbind_all_memory(ScrnInfoPtr pScrn)
      if (pI830->StolenOnly == TRUE)
  	return TRUE;
  
@@ -2497,7 +2606,7 @@
  	i830_memory *mem;
  
  	for (mem = pI830->memory_list->next; mem->next != NULL;
-@@ -1982,10 +2026,12 @@ i830_unbind_all_memory(ScrnInfoPtr pScrn)
+@@ -1982,10 +2025,12 @@ i830_unbind_all_memory(ScrnInfoPtr pScrn)
  	}
  #endif
  
@@ -2514,7 +2623,7 @@
  
      return TRUE;
 diff --git a/src/i830_video.c b/src/i830_video.c
-index 8f0ac30..3fb702d 100644
+index 8f0ac30..7738d3d 100644
 --- a/src/i830_video.c
 +++ b/src/i830_video.c
 @@ -75,6 +75,7 @@
@@ -2663,7 +2772,7 @@
      }
      /* Wait for the overlay to light up before attempting to use it */
      OUT_BATCH(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
-@@ -443,35 +535,40 @@ i830_overlay_on(ScrnInfoPtr pScrn)
+@@ -443,35 +535,41 @@ i830_overlay_on(ScrnInfoPtr pScrn)
  	i830_pipe_a_require_deactivate (pScrn);
  
      OVERLAY_DEBUG("overlay_on\n");
@@ -2701,6 +2810,7 @@
 -    OVERLAY_DEBUG ("overlay_continue cmd 0x%08" PRIx32 " -> 0x%08" PRIx32
 -		   " sta 0x%08" PRIx32 "\n",
 -		   overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
++
      BEGIN_BATCH(4);
      OUT_BATCH(MI_FLUSH | MI_WRITE_DIRTY_STATE);
      OUT_BATCH(MI_NOOP);
@@ -2714,7 +2824,7 @@
      ADVANCE_BATCH();
      OVERLAY_DEBUG("overlay_continue\n");
  }
-@@ -480,7 +577,7 @@ static void
+@@ -480,7 +578,7 @@ static void
  i830_overlay_off(ScrnInfoPtr pScrn)
  {
      I830Ptr pI830 = I830PTR(pScrn);
@@ -2723,7 +2833,7 @@
  
      if (!*pI830->overlayOn)
  	return;
-@@ -504,17 +601,24 @@ i830_overlay_off(ScrnInfoPtr pScrn)
+@@ -504,17 +602,22 @@ i830_overlay_off(ScrnInfoPtr pScrn)
       * Turn overlay off
       */
      {
@@ -2731,8 +2841,6 @@
  	overlay->OCMD &= ~OVERLAY_ENABLE;
 -	OVERLAY_DEBUG ("overlay_off cmd 0x%08" PRIx32 " -> 0x%08" PRIx32 " sta 0x%08" PRIx32 "\n",
 -		       overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
-+	//	OVERLAY_DEBUG ("overlay_off cmd 0x%08lx -> 0x%08lx sta 0x%08lx\n",
-+	//		       overlay->OCMD, INREG(OCMD_REGISTER), INREG(DOVSTA));
 +	overlay_reg_finish(pI830);
 +
  	BEGIN_BATCH(6);
@@ -2753,7 +2861,7 @@
  	}
  	OUT_BATCH(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
  	OUT_BATCH(MI_NOOP);
-@@ -583,7 +687,7 @@ I830InitVideo(ScreenPtr pScreen)
+@@ -583,7 +686,7 @@ I830InitVideo(ScreenPtr pScreen)
  
      /* Set up overlay video if we can do it at this depth. */
      if (!IS_I965G(pI830) && pScrn->bitsPerPixel != 8 &&
@@ -2762,7 +2870,7 @@
      {
  	overlayAdaptor = I830SetupImageVideoOverlay(pScreen);
  	if (overlayAdaptor != NULL) {
-@@ -607,14 +711,14 @@ I830ResetVideo(ScrnInfoPtr pScrn)
+@@ -607,14 +710,14 @@ I830ResetVideo(ScrnInfoPtr pScrn)
  {
      I830Ptr pI830 = I830PTR(pScrn);
      I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
@@ -2779,7 +2887,7 @@
      memset(overlay, 0, sizeof(*overlay));
      overlay->YRGB_VPH = 0;
      overlay->UV_VPH = 0;
-@@ -669,6 +773,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
+@@ -669,6 +772,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
      else 
  	overlay->OCONFIG |= OVERLAY_PIPE_B;
  
@@ -2787,7 +2895,7 @@
  #if 0
      /* 
       * XXX DUMP REGISTER CODE !!!
-@@ -678,7 +783,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
+@@ -678,7 +782,7 @@ I830ResetVideo(ScrnInfoPtr pScrn)
      {
  	int i;
  	for (i = 0x30000; i < 0x31000; i += 4)
@@ -2796,7 +2904,7 @@
      }
  #endif
  }
-@@ -742,33 +847,41 @@ I830UpdateGamma(ScrnInfoPtr pScrn)
+@@ -742,33 +846,41 @@ I830UpdateGamma(ScrnInfoPtr pScrn)
  {
      I830Ptr pI830 = I830PTR(pScrn);
      I830PortPrivPtr pPriv = pI830->adaptor->pPortPrivates[0].ptr;
@@ -2855,16 +2963,37 @@
  }
  
  static XF86VideoAdaptorPtr
-@@ -1018,7 +1131,7 @@ I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
+@@ -841,6 +953,7 @@ I830SetupImageVideoOverlay(ScreenPtr pScreen)
+     pPriv->current_crtc = NULL;
+     pPriv->desired_crtc = NULL;
+     pPriv->buf = NULL;
++    pPriv->state = NULL;
+     pPriv->currentBuf = 0;
+     pPriv->gamma5 = 0xc0c0c0;
+     pPriv->gamma4 = 0x808080;
+@@ -954,6 +1067,7 @@ I830SetupImageVideoTextured(ScreenPtr pScreen)
+ 	pPriv->textured = TRUE;
+ 	pPriv->videoStatus = 0;
+ 	pPriv->buf = NULL;
++	pPriv->state = NULL;
+ 	pPriv->currentBuf = 0;
+ 	pPriv->doubleBuffer = 0;
+ 
+@@ -1018,8 +1132,12 @@ I830StopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown)
  	/* Sync before freeing the buffer, because the pages will be unbound.
  	 */
  	I830Sync(pScrn);
 -	i830_free_memory(pScrn, pPriv->buf);
 +	dri_bo_unreference(pPriv->buf);
  	pPriv->buf = NULL;
++	if (pPriv->state) {
++	    dri_bo_unreference(pPriv->state);
++	    pPriv->state = NULL;
++	}
  	pPriv->videoStatus = 0;
      } else {
-@@ -1037,7 +1150,8 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
+ 	if (pPriv->videoStatus & CLIENT_VIDEO_ON) {
+@@ -1037,7 +1155,8 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
      I830PortPrivPtr pPriv = (I830PortPrivPtr) data;
      I830Ptr pI830 = I830PTR(pScrn);
      I830OverlayRegPtr overlay;
@@ -2874,7 +3003,7 @@
      if (pPriv->textured) {
  	/* XXX: Currently the brightness/saturation attributes aren't hooked up.
  	 * However, apps expect them to be there, and the spec seems to let us
-@@ -1046,32 +1160,40 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
+@@ -1046,32 +1165,40 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
  	return Success;
      }
  
@@ -2927,7 +3056,7 @@
  	if (value < 0)
  	    pPriv->desired_crtc = NULL;
  	else
-@@ -1105,17 +1227,23 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
+@@ -1105,17 +1232,23 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
  	    break;
  	}
  	OVERLAY_DEBUG("COLORKEY\n");
@@ -2954,7 +3083,7 @@
      /* Ensure that the overlay is off, ready for updating */
      if ((attribute == xvGamma0 ||
  	 attribute == xvGamma1 ||
-@@ -1128,6 +1256,9 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
+@@ -1128,6 +1261,9 @@ I830SetPortAttribute(ScrnInfoPtr pScrn,
      }
  
      return Success;
@@ -2964,7 +3093,15 @@
  }
  
  static int
-@@ -1209,10 +1340,11 @@ I830CopyPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1196,7 +1332,6 @@ I830CopyPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+ 		   int srcPitch,
+ 		   int dstPitch, int top, int left, int h, int w)
+ {
+-    I830Ptr pI830 = I830PTR(pScrn);
+     unsigned char *src, *dst;
+     int i,j;
+     unsigned char *s;
+@@ -1209,10 +1344,11 @@ I830CopyPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  
      src = buf + (top * srcPitch) + (left << 1);
  
@@ -2978,7 +3115,7 @@
  
      switch (pPriv->rotation) {
      case RR_Rotate_0:
-@@ -1285,6 +1417,7 @@ I830CopyPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1285,6 +1421,7 @@ I830CopyPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  	}
  	break;
      }
@@ -2986,7 +3123,11 @@
  }
  
  /* Copies planar data in *buf to UYVY-packed data in the screen atYBufXOffset.
-@@ -1299,10 +1432,12 @@ I830CopyPlanarToPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1295,14 +1432,15 @@ I830CopyPlanarToPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+ 			   int srcPitch2, int dstPitch, int srcH,
+ 			   int top, int left, int h, int w, int id)
+ {
+-    I830Ptr pI830 = I830PTR(pScrn);
      CARD8 *dst1, *srcy, *srcu, *srcv;
      int y;
  
@@ -3001,7 +3142,7 @@
  
      srcy = buf + (top * srcPitch) + left;
      if (id == FOURCC_YV12) {
-@@ -1344,6 +1479,7 @@ I830CopyPlanarToPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1344,6 +1482,7 @@ I830CopyPlanarToPackedData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  	    srcv += srcPitch2;
  	}	
      }
@@ -3009,7 +3150,7 @@
  }
  
  static void
-@@ -1371,10 +1507,11 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1371,10 +1510,11 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
      ErrorF("src1 is %p, offset is %ld\n", src1,
  	   (unsigned long)src1 - (unsigned long)buf);
  #endif
@@ -3023,7 +3164,7 @@
  
      switch (pPriv->rotation) {
      case RR_Rotate_0:
-@@ -1413,22 +1550,25 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1413,22 +1553,25 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  	break;
      }
  
@@ -3053,7 +3194,7 @@
      }
  
      switch (pPriv->rotation) {
-@@ -1467,6 +1607,7 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1467,6 +1610,7 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  	}
  	break;
      }
@@ -3061,7 +3202,7 @@
  
      /* Copy U data for YV12, or V data for I420 */
      src3 = buf + (srcH * srcPitch) + ((srcH >> 1) * srcPitch2) +
-@@ -1475,16 +1616,17 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1475,16 +1619,17 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
      ErrorF("src3 is %p, offset is %ld\n", src3,
  	   (unsigned long)src3 - (unsigned long)buf);
  #endif
@@ -3083,7 +3224,7 @@
      }
  
      switch (pPriv->rotation) {
-@@ -1523,6 +1665,7 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
+@@ -1523,6 +1668,7 @@ I830CopyPlanarData(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
  	}
  	break;
      }
@@ -3091,7 +3232,7 @@
  }
  
  typedef struct {
-@@ -1750,7 +1893,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+@@ -1750,7 +1896,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
  {
      I830Ptr		pI830 = I830PTR(pScrn);
      I830PortPrivPtr	pPriv = pI830->adaptor->pPortPrivates[0].ptr;
@@ -3100,7 +3241,7 @@
      unsigned int	swidth, swidthy, swidthuv;
      unsigned int	mask, shift, offsety, offsetu;
      int			tmp;
-@@ -1761,7 +1904,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+@@ -1761,7 +1907,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
  		  dstPitch);
  
  #if VIDEO_DEBUG
@@ -3110,7 +3251,7 @@
  #endif
      
      /*
-@@ -1865,6 +2010,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+@@ -1865,6 +2013,7 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
  	offsetu = pPriv->UBuf1offset;
      }
  
@@ -3118,7 +3259,7 @@
      switch (id) {
      case FOURCC_YV12:
      case FOURCC_I420:
-@@ -1907,16 +2053,33 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+@@ -1907,16 +2056,33 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
  		  dstBox->x1, dstBox->y1, dstBox->x2, dstBox->y2);
  
      /* buffer locations */
@@ -3157,18 +3298,43 @@
  		  overlay->DWINPOS, overlay->DWINSZ);
      OVERLAY_DEBUG("dst: %d x %d, src: %d x %d\n", drw_w, drw_h, src_w, src_h);
  
-@@ -2078,8 +2241,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
+@@ -2078,8 +2244,9 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
  	OCMD |= BUFFER1;
  
      overlay->OCMD = OCMD;
 -    OVERLAY_DEBUG("OCMD is 0x%" PRIx32 "\n", OCMD);
-+    OVERLAY_DEBUG("OCMD is 0x%lx\n", OCMD);
++    OVERLAY_DEBUG("OCMD is 0x%" CARD32_HEX "\n", OCMD);
  
 +    overlay_reg_finish(pI830);
      /* make sure the overlay is on */
      i830_overlay_on (pScrn);
      /* and show this frame */
-@@ -2341,23 +2505,22 @@ I830PutImage(ScrnInfoPtr pScrn,
+@@ -2198,7 +2365,7 @@ I830PutImage(ScrnInfoPtr pScrn,
+     int top, left, npixels, nlines, size;
+     BoxRec dstBox;
+     int pitchAlignMask;
+-    int alloc_size, extraLinear;
++    int alloc_size;
+     xf86CrtcPtr	crtc;
+ 
+     if (pPriv->textured)
+@@ -2321,15 +2488,9 @@ I830PutImage(ScrnInfoPtr pScrn,
+     ErrorF("srcPitch: %d, dstPitch: %d, size: %d\n", srcPitch, dstPitch, size);
+ #endif
+ 
+-    if (IS_I965G(pI830))
+-	extraLinear = BRW_LINEAR_EXTRA;
+-    else
+-	extraLinear = 0;
+-
+     alloc_size = size;
+     if (pPriv->doubleBuffer)
+ 	alloc_size *= 2;
+-    alloc_size += extraLinear;
+ 
+     if (pPriv->buf) {
+ 	/* Wait for any previous acceleration to the buffer to have completed.
+@@ -2341,23 +2502,34 @@ I830PutImage(ScrnInfoPtr pScrn,
  
      /* Free the current buffer if we're going to have to reallocate */
      if (pPriv->buf && pPriv->buf->size < alloc_size) {
@@ -3181,15 +3347,28 @@
 -	pPriv->buf = i830_allocate_memory(pScrn, "xv buffer", alloc_size, 16,
 -					  0);
 +	pPriv->buf = dri_bo_alloc(pI830->bufmgr,
-+				  "xv buffer", alloc_size, 16, 0);
++				  "xv buffer", alloc_size, 4096,
++				  DRM_BO_FLAG_MEM_LOCAL |
++				  DRM_BO_FLAG_CACHED |
++				  DRM_BO_FLAG_CACHED_MAPPED);
      }
- 
+-
      if (pPriv->buf == NULL)
  	return BadAlloc;
  
 -    pPriv->extra_offset = pPriv->buf->offset +
 -    (pPriv->doubleBuffer ? size * 2 : size);
-+    pPriv->extra_offset = (pPriv->doubleBuffer ? size * 2 : size);
++    if (pPriv->state == NULL && IS_I965G(pI830)) {
++	pPriv->state = dri_bo_alloc(pI830->bufmgr,
++				    "xv buffer", BRW_LINEAR_EXTRA, 4096,
++				    DRM_BO_FLAG_MEM_LOCAL |
++				    DRM_BO_FLAG_CACHED |
++				    DRM_BO_FLAG_CACHED_MAPPED);
++	if (pPriv->state == NULL) {
++	    dri_bo_unreference(pPriv->buf);
++	    return BadAlloc;
++	}
++    }
  
      /* fixup pointers */
 -    pPriv->YBuf0offset = pPriv->buf->offset;
@@ -3197,7 +3376,7 @@
      if (pPriv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
  	pPriv->UBuf0offset = pPriv->YBuf0offset + (dstPitch * 2 * width);
  	pPriv->VBuf0offset = pPriv->UBuf0offset + (dstPitch * width / 2);
-@@ -2378,7 +2541,7 @@ I830PutImage(ScrnInfoPtr pScrn,
+@@ -2378,7 +2550,7 @@ I830PutImage(ScrnInfoPtr pScrn,
  
      /* Pick the idle buffer */
      if (!pPriv->textured && *pI830->overlayOn && pPriv->doubleBuffer)
@@ -3206,16 +3385,21 @@
  
      /* copy data */
      top = y1 >> 16;
-@@ -2596,7 +2759,7 @@ I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
+@@ -2596,8 +2768,12 @@ I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
  		 * unbound.
  		 */
  		I830Sync(pScrn);
 -		i830_free_memory(pScrn, pPriv->buf);
 +		dri_bo_unreference(pPriv->buf);
  		pPriv->buf = NULL;
++		if (pPriv->state) {
++		    dri_bo_unreference(pPriv->state);
++		    pPriv->state = NULL;
++		}
  		pPriv->videoStatus = 0;
  	    }
-@@ -2609,7 +2772,7 @@ I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
+ 	}
+@@ -2609,7 +2785,7 @@ I830VideoBlockHandler(int i, pointer blockData, pointer pTimeout,
   ***************************************************************************/
  
  typedef struct {
@@ -3224,16 +3408,19 @@
      Bool isOn;
  } OffscreenPrivRec, *OffscreenPrivPtr;
  
-@@ -2654,7 +2817,7 @@ I830AllocateSurface(ScrnInfoPtr pScrn,
+@@ -2654,7 +2830,10 @@ I830AllocateSurface(ScrnInfoPtr pScrn,
      fbpitch = pI830->cpp * pScrn->displayWidth;
      size = pitch * h;
  
 -    pPriv->buf = i830_allocate_memory(pScrn, "xv surface buffer", size, 16, 0);
-+    pPriv->buf = dri_bo_alloc(pI830->bufmgr, "xv surface buffer", size, 16, 0);
++    pPriv->buf = dri_bo_alloc(pI830->bufmgr, "xv surface buffer", size, 4096,
++			      DRM_BO_FLAG_MEM_LOCAL | 
++			      DRM_BO_FLAG_CACHED | 
++			      DRM_BO_FLAG_CACHED_MAPPED);
      if (pPriv->buf == NULL) {
  	xfree(surface->pitches);
  	xfree(surface->offsets);
-@@ -2670,10 +2833,11 @@ I830AllocateSurface(ScrnInfoPtr pScrn,
+@@ -2670,10 +2849,11 @@ I830AllocateSurface(ScrnInfoPtr pScrn,
      surface->pScrn = pScrn;
      surface->id = id;
      surface->pitches[0] = pitch;
@@ -3247,7 +3434,7 @@
  
      return Success;
  }
-@@ -2709,7 +2873,7 @@ I830FreeSurface(XF86SurfacePtr surface)
+@@ -2709,7 +2889,7 @@ I830FreeSurface(XF86SurfacePtr surface)
      I830StopSurface(surface);
      /* Sync before freeing the buffer, because the pages will be unbound. */
      I830Sync(pScrn);
@@ -3256,7 +3443,7 @@
      pPriv->buf = NULL;
      xfree(surface->pitches);
      xfree(surface->offsets);
-@@ -2785,7 +2949,7 @@ I830DisplaySurface(XF86SurfacePtr surface,
+@@ -2785,7 +2965,7 @@ I830DisplaySurface(XF86SurfacePtr surface,
  
      /* Pick the idle buffer */
      if (!pI830Priv->textured && *pI830->overlayOn && pI830Priv->doubleBuffer) 
@@ -3266,18 +3453,20 @@
      i830_display_video(pScrn, crtc, surface->id, surface->width, surface->height,
  		     surface->pitches[0], x1, y1, x2, y2, &dstBox,
 diff --git a/src/i830_video.h b/src/i830_video.h
-index 1768913..c21e5fa 100644
+index 1768913..b5f6a47 100644
 --- a/src/i830_video.h
 +++ b/src/i830_video.h
-@@ -58,7 +58,7 @@ typedef struct {
+@@ -58,8 +58,8 @@ typedef struct {
     CARD32 videoStatus;
     Time offTime;
     Time freeTime;
 -   i830_memory *buf; /** YUV data buffer */
+-   unsigned int extra_offset;
 +   dri_bo *buf; /** YUV data buffer */
-    unsigned int extra_offset;
++   dri_bo *state; /** State buffer */
  
     Bool overlayOK;
+    int oneLineMode;
 diff --git a/src/i915_video.c b/src/i915_video.c
 index 6b20ad2..6b3b15e 100644
 --- a/src/i915_video.c
@@ -3421,33 +3610,83 @@
  
      pI830->exa965->vbo_prim_start = pI830->exa965->vbo_used;
 diff --git a/src/i965_video.c b/src/i965_video.c
-index 6d04613..fc8b42c 100644
+index 6d04613..91b9f39 100644
 --- a/src/i965_video.c
 +++ b/src/i965_video.c
-@@ -251,7 +251,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
-     state_base_offset = pPriv->extra_offset;
-     state_base_offset = ALIGN(state_base_offset, 64);
+@@ -183,7 +183,6 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+     int next_offset, total_state_size;
+     int vb_size = (4 * 4) * 4; /* 4 DWORDS per vertex */
+     char *state_base;
+-    int state_base_offset;
  
+ #if 0
+     ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width, height,
+@@ -241,17 +240,12 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+     binding_table_offset = ALIGN(next_offset, 32);
+     next_offset = binding_table_offset + (WM_BINDING_TABLE_ENTRIES * 4);
+ 
+-    /* Allocate an area in framebuffer for our state layout we just set up */
+     total_state_size = next_offset;
+-    assert (total_state_size < BRW_LINEAR_EXTRA);
++    assert (total_state_size < pPriv->state->size);
+ 
+-    /*
+-     * Use the extra space allocated at the end of the Xv buffer
+-     */
+-    state_base_offset = pPriv->extra_offset;
+-    state_base_offset = ALIGN(state_base_offset, 64);
+-
 -    state_base = (char *)(pI830->FbBase + state_base_offset);
-+    dri_bo_map(pPriv->buf, TRUE);
++    dri_bo_map(pPriv->state, TRUE);
 +    
-+    state_base = (char *) pPriv->buf->virtual + state_base_offset;
++    state_base = (char *) pPriv->state->virtual;
      /* Set up our pointers to state structures in framebuffer.  It would
       * probably be a good idea to fill these structures out in system memory
       * and then dump them there, instead.
-@@ -340,7 +342,10 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -272,19 +266,19 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+     vb = (void *)(state_base + vb_offset);
+ 
+ #if 0
+-    ErrorF("vs:            0x%08x\n", state_base_offset + vs_offset);
+-    ErrorF("wm:            0x%08x\n", state_base_offset + wm_offset);
+-    ErrorF("sf:            0x%08x\n", state_base_offset + sf_offset);
+-    ErrorF("cc:            0x%08x\n", state_base_offset + cc_offset);
+-    ErrorF("sf kernel:     0x%08x\n", state_base_offset + sf_kernel_offset);
+-    ErrorF("ps kernel:     0x%08x\n", state_base_offset + ps_kernel_offset);
+-    ErrorF("sip kernel:    0x%08x\n", state_base_offset + sip_kernel_offset);
+-    ErrorF("cc_vp:         0x%08x\n", state_base_offset + cc_viewport_offset);
+-    ErrorF("src sampler:   0x%08x\n", state_base_offset + src_sampler_offset);
+-    ErrorF("vb:            0x%08x\n", state_base_offset + vb_offset);
+-    ErrorF("dst surf:      0x%08x\n", state_base_offset + dest_surf_offset);
+-    ErrorF("src surf:      0x%08x\n", state_base_offset + src_surf_offset);
+-    ErrorF("binding table: 0x%08x\n", state_base_offset + binding_table_offset);
++    ErrorF("vs:            0x%08x\n", vs_offset);
++    ErrorF("wm:            0x%08x\n", wm_offset);
++    ErrorF("sf:            0x%08x\n", sf_offset);
++    ErrorF("cc:            0x%08x\n", cc_offset);
++    ErrorF("sf kernel:     0x%08x\n", sf_kernel_offset);
++    ErrorF("ps kernel:     0x%08x\n", ps_kernel_offset);
++    ErrorF("sip kernel:    0x%08x\n", sip_kernel_offset);
++    ErrorF("cc_vp:         0x%08x\n", cc_viewport_offset);
++    ErrorF("src sampler:   0x%08x\n", src_sampler_offset);
++    ErrorF("vb:            0x%08x\n", vb_offset);
++    ErrorF("dst surf:      0x%08x\n", dest_surf_offset);
++    ErrorF("src surf:      0x%08x\n", src_surf_offset);
++    ErrorF("binding table: 0x%08x\n", binding_table_offset);
+ #endif
+ 
+     /* For 3D, the VS must have 8, 12, 16, 24, or 32 VUEs allocated to it.
+@@ -340,8 +334,7 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
      cc_state->cc3.ia_blend_enable = 1;  /* blend alpha just like colors */
      cc_state->cc3.blend_enable = 0;     /* disable color blend */
      cc_state->cc3.alpha_test = 0;       /* disable alpha test */
 -    cc_state->cc4.cc_viewport_state_offset = (state_base_offset +
-+
-+    /* FIXME: Eek! No relocation to match this... */
-+    cc_state->cc4.cc_viewport_state_offset = (pPriv->buf->offset +
-+					      state_base_offset +
- 					      cc_viewport_offset) >> 5;
+-					      cc_viewport_offset) >> 5;
++    cc_state->cc4.cc_viewport_state_offset = cc_viewport_offset >> 5;
      cc_state->cc5.dither_enable = 0;    /* disable dither */
      cc_state->cc5.logicop_func = 0xc;   /* WHITE */
-@@ -371,7 +376,19 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+     cc_state->cc5.statistics_enable = 1;
+@@ -371,7 +364,19 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
      dest_surf_state->ss0.mipmap_layout_mode = 0;
      dest_surf_state->ss0.render_cache_read_mode = 0;
  
@@ -3458,9 +3697,9 @@
 +					     DRM_BO_FLAG_MEM_TT |
 +					     DRM_BO_FLAG_WRITE |
 +					     DRM_BO_FLAG_READ,
-+					     pPriv->buf,
++					     pPriv->state,
 +					     (char *) &dest_surf_state->ss1.base_addr -
-+					     (char *) pPriv->buf->virtual,
++					     state_base,
 +					     0);
 +    else
 +	dest_surf_state->ss1.base_addr = intel_get_pixmap_offset(pPixmap);
@@ -3468,51 +3707,59 @@
      dest_surf_state->ss2.height = pScrn->virtualY - 1;
      dest_surf_state->ss2.width = pScrn->virtualX - 1;
      dest_surf_state->ss2.mip_count = 0;
-@@ -403,7 +420,20 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -403,7 +408,21 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
      src_surf_state->ss0.mipmap_layout_mode = 0;
      src_surf_state->ss0.render_cache_read_mode = 0;
  
 -    src_surf_state->ss1.base_addr = pPriv->YBuf0offset;
-+
-+    if (pI830->use_ttm_batch)
++    if (pI830->use_ttm_batch) {
++	dri_emit_reloc(pPriv->state,
++		       DRM_BO_FLAG_MEM_TT |
++		       DRM_BO_FLAG_WRITE | 
++		       DRM_BO_FLAG_READ,
++		       pPriv->YBuf0offset,
++		       (char *) &src_surf_state->ss1.base_addr - state_base,
++		       pPriv->buf);
 +	src_surf_state->ss1.base_addr =
-+	    intelddx_batchbuffer_emit_pixmap(pPixmap,
-+					     DRM_BO_FLAG_MEM_TT |
-+					     DRM_BO_FLAG_READ,
-+					     pPriv->buf,
-+					     (char *) &src_surf_state->ss1.base_addr -
-+					     (char *) pPriv->buf->virtual,
-+					     pPriv->YBuf0offset);
-+    else
++	    pPriv->buf->offset + pPriv->YBuf0offset;
++    } else {
 +	src_surf_state->ss1.base_addr =
 +	    pPriv->buf->offset + pPriv->YBuf0offset;
++    }
 +
      src_surf_state->ss2.width = width - 1;
      src_surf_state->ss2.height = height - 1;
      src_surf_state->ss2.mip_count = 0;
-@@ -439,8 +469,11 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -413,8 +432,8 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+ 
+     /* Set up a binding table for our two surfaces.  Only the PS will use it */
+     /* XXX: are these offset from the right place? */
+-    binding_table[0] = state_base_offset + dest_surf_offset;
+-    binding_table[1] = state_base_offset + src_surf_offset;
++    binding_table[0] = dest_surf_offset;
++    binding_table[1] = src_surf_offset;
+ 
+     /* Set up the packed YUV source sampler.  Doesn't do colorspace conversion.
+      */
+@@ -439,8 +458,8 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
  
      memcpy (sf_kernel, sf_kernel_static, sizeof (sf_kernel_static));
      memset(sf_state, 0, sizeof(*sf_state));
-+
-+    /* FIXME: Eek! No relocation to match this... */
-     sf_state->thread0.kernel_start_pointer =
+-    sf_state->thread0.kernel_start_pointer =
 -	(state_base_offset + sf_kernel_offset) >> 6;
-+	(pPriv->buf->offset + state_base_offset + sf_kernel_offset) >> 6;
 +
++    sf_state->thread0.kernel_start_pointer = sf_kernel_offset >> 6;
      sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
      sf_state->sf1.single_program_flow = 1; /* XXX */
      sf_state->sf1.binding_table_entry_count = 0;
-@@ -470,16 +503,22 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -470,16 +489,15 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
  
      memcpy (ps_kernel, ps_kernel_static, sizeof (ps_kernel_static));
      memset (wm_state, 0, sizeof (*wm_state));
-+
-+    /* FIXME: Eek! No relocation to match this... */
-     wm_state->thread0.kernel_start_pointer =
+-    wm_state->thread0.kernel_start_pointer =
 -	(state_base_offset + ps_kernel_offset) >> 6;
-+	(pPriv->buf->offset + state_base_offset + ps_kernel_offset) >> 6;
 +
++    wm_state->thread0.kernel_start_pointer = ps_kernel_offset >> 6;
      wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
      wm_state->thread1.single_program_flow = 1; /* XXX */
      wm_state->thread1.binding_table_entry_count = 2;
@@ -3520,52 +3767,79 @@
       * set, and the minimum allocation is 1024 bytes.
       */
 -    wm_state->thread2.scratch_space_base_pointer = (state_base_offset +
-+    /* FIXME: Eek! No relocation to match this... */
-+    wm_state->thread2.scratch_space_base_pointer = (pPriv->buf->offset +
-+						    state_base_offset +
- 						    wm_scratch_offset) >> 10;
-+
+-						    wm_scratch_offset) >> 10;
++    wm_state->thread2.scratch_space_base_pointer = wm_scratch_offset >> 10;
      wm_state->thread2.per_thread_scratch_space = 0; /* 1024 bytes */
      wm_state->thread3.dispatch_grf_start_reg = 3; /* XXX */
      wm_state->thread3.const_urb_entry_read_length = 0;
-@@ -487,8 +526,12 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -487,8 +505,7 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
      wm_state->thread3.urb_entry_read_length = 1; /* XXX */
      wm_state->thread3.urb_entry_read_offset = 0; /* XXX */
      wm_state->wm4.stats_enable = 1;
 -    wm_state->wm4.sampler_state_pointer = (state_base_offset +
-+
-+    /* FIXME: Eek! No relocation to match this... */
-+    wm_state->wm4.sampler_state_pointer = (pPriv->buf->offset +
-+					   state_base_offset +
- 					   src_sampler_offset) >> 5;
-+
+-					   src_sampler_offset) >> 5;
++    wm_state->wm4.sampler_state_pointer = src_sampler_offset >> 5;
      wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
      wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
      wm_state->wm5.thread_dispatch_enable = 1;
-@@ -535,8 +578,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -496,6 +513,8 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+     wm_state->wm5.enable_8_pix = 0;
+     wm_state->wm5.early_depth_test = 1;
+ 
++    dri_bo_unmap(pPriv->state);
++
+     {
+ 	BEGIN_BATCH(2);
+ 	OUT_BATCH(MI_FLUSH |
+@@ -520,12 +539,16 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+ 	OUT_BATCH((0 << 4) |	/* URB Entry Allocation Size */
+ 		 (0 << 0));	/* Number of URB Entries */
+ 
+-	/* Zero out the two base address registers so all offsets are
+-	 * absolute
++	/* Set the base addresses for general state and surface state
++	 * to our buffer.
+ 	 */
+ 	OUT_BATCH(BRW_STATE_BASE_ADDRESS | 4);
+-	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);  /* Generate state base address */
+-	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);  /* Surface state base address */
++	OUT_RELOC(pPriv->state,	/* General state base address */
++		  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
++		  BASE_ADDRESS_MODIFY);
++	OUT_RELOC(pPriv->state,	/* Surface state base address */
++		  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
++		  BASE_ADDRESS_MODIFY);
+ 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);  /* media base addr, don't care */
+ 	/* general state max addr, disabled */
+ 	OUT_BATCH(0x10000000 | BASE_ADDRESS_MODIFY);
+@@ -535,8 +558,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
  	/* Set system instruction pointer */
  	OUT_BATCH(BRW_STATE_SIP | 0);
  	/* system instruction pointer */
 -	OUT_BATCH(state_base_offset + sip_kernel_offset);
 -
-+	OUT_RELOC(pPriv->buf,
++	OUT_RELOC(pPriv->state,
 +		  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		  state_base_offset + sip_kernel_offset);
++		  sip_kernel_offset);
  	OUT_BATCH(MI_NOOP);
  	ADVANCE_BATCH();
      }
-@@ -564,7 +608,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -564,7 +588,7 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
         OUT_BATCH(0); /* clip */
         OUT_BATCH(0); /* sf */
         /* Only the PS uses the binding table */
 -       OUT_BATCH(state_base_offset + binding_table_offset); /* ps */
-+	OUT_RELOC(pPriv->buf,
-+		  DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		  state_base_offset + binding_table_offset); /* ps */
++	OUT_BATCH(binding_table_offset); /* ps */
  
         /* Blend constant color (magenta is fun) */
         OUT_BATCH(BRW_3DSTATE_CONSTANT_COLOR | 3);
-@@ -594,9 +640,16 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -589,14 +613,15 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+ 
+        /* Set the pointers to the 3d pipeline state */
+        OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
+-       OUT_BATCH(state_base_offset + vs_offset);  /* 32 byte aligned */
++       OUT_BATCH(vs_offset);  /* 32 byte aligned */
+        /* disable GS, resulting in passthrough */
         OUT_BATCH(BRW_GS_DISABLE);
         /* disable CLIP, resulting in passthrough */
         OUT_BATCH(BRW_CLIP_DISABLE);
@@ -3573,29 +3847,43 @@
 -       OUT_BATCH(state_base_offset + wm_offset);  /* 32 byte aligned */
 -       OUT_BATCH(state_base_offset + cc_offset);  /* 64 byte aligned */
 +
-+       OUT_RELOC(pPriv->buf,
-+		 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		 state_base_offset + sf_offset);  /* 32 byte aligned */
-+       OUT_RELOC(pPriv->buf,
-+		 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		 state_base_offset + wm_offset);  /* 32 byte aligned */
-+       OUT_RELOC(pPriv->buf,
-+		 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		 state_base_offset + cc_offset);  /* 64 byte aligned */
++       OUT_BATCH(sf_offset);  /* 32 byte aligned */
++       OUT_BATCH(wm_offset);  /* 32 byte aligned */
++       OUT_BATCH(cc_offset);  /* 64 byte aligned */
  
         /* URB fence */
         OUT_BATCH(BRW_URB_FENCE |
-@@ -623,7 +676,9 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+@@ -617,14 +642,19 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+        OUT_BATCH(((URB_CS_ENTRY_SIZE - 1) << 4) |
+ 		(URB_CS_ENTRIES << 0));
+ 
+-       /* Set up the pointer to our vertex buffer */
+-       OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 2);
++       /* Set up the pointer to our vertex buffer.  The vertex buffer
++	* addresses aren't relative to any of the base addresses so we
++	* have to emit a relocation. */
++       OUT_BATCH(BRW_3DSTATE_VERTEX_BUFFERS | 3);
+        /* four 32-bit floats per vertex */
         OUT_BATCH((0 << VB0_BUFFER_INDEX_SHIFT) |
  		VB0_VERTEXDATA |
  		((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
 -       OUT_BATCH(state_base_offset + vb_offset);
-+       OUT_RELOC(pPriv->buf,
++       OUT_RELOC(pPriv->state,
 +		 DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
-+		 state_base_offset + vb_offset);
++		 vb_offset);
         OUT_BATCH(3); /* four corners to our rectangle */
++       OUT_BATCH(0); /* reserved */
  
         /* Set up our vertex elements, sourced from the single vertex buffer. */
+        OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS | 3);
+@@ -649,7 +679,6 @@ I965DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
+ 		(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
+ 		(4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
+ 
+-       OUT_BATCH(MI_NOOP);			/* pad to quadword */
+        ADVANCE_BATCH();
+     }
+ 
 diff --git a/src/intel_batchbuffer.c b/src/intel_batchbuffer.c
 index e15c6ce..3362a46 100644
 --- a/src/intel_batchbuffer.c


Index: xorg-x11-drv-i810.spec
===================================================================
RCS file: /cvs/pkgs/rpms/xorg-x11-drv-i810/devel/xorg-x11-drv-i810.spec,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -r1.82 -r1.83
--- xorg-x11-drv-i810.spec	6 Mar 2008 22:16:44 -0000	1.82
+++ xorg-x11-drv-i810.spec	7 Mar 2008 06:53:24 -0000	1.83
@@ -5,7 +5,7 @@
 Summary:   Xorg X11 Intel video driver(s)
 Name:      xorg-x11-drv-i810
 Version:   2.2.1
-Release:   8%{?dist}
+Release:   9%{?dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X Hardware Support
@@ -135,6 +135,10 @@
 %{_libdir}/libI810XvMC.so
 
 %changelog
+* Fri Mar 07 2008 Dave Airlie <airlied at redhat.com> 2.2.1-9
+- update modesetting patch to include 965 video + fix for memory
+  space leak
+
 * Fri Mar 07 2008 Dave Airlie <airlied at redhat.com> 2.2.1-8
 - fixup pciaccess version check and autoconf and fallout
 




More information about the fedora-extras-commits mailing list