[Intel-gfx] [PATCH] i965 XvMC cleanup

Zhenyu Wang zhenyuw at linux.intel.com
Mon Sep 28 12:35:57 CEST 2009


Remove bo pin for surface buffer access, and remove access
attempt for possible unmapped framebuffer. Using xv buffer
pointer to pass current xvmc surface bo handler, which is
assigned to src image bo and handle that the same way as in Xv.

Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
---
 src/i830_video.c |   28 ++++++++++------------------
 src/i965_hwmc.c  |   22 +++++++---------------
 2 files changed, 17 insertions(+), 33 deletions(-)

diff --git a/src/i830_video.c b/src/i830_video.c
index 47c026d..cb6bd86 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -2275,6 +2275,7 @@ I830PutImage(ScrnInfoPtr pScrn,
     int pitchAlignMask;
     int alloc_size;
     xf86CrtcPtr	crtc;
+    drm_intel_bo *xvmc_surface = NULL;
 
     if (pPriv->textured)
 	overlay = NULL;
@@ -2409,6 +2410,11 @@ I830PutImage(ScrnInfoPtr pScrn,
     if (pPriv->doubleBuffer)
 	alloc_size *= 2;
 
+    if (id == FOURCC_XVMC && IS_I965G(pI830)) {
+	xvmc_surface = drm_intel_bo_gem_create_from_name(pI830->bufmgr, "xvmc surface",
+							(unsigned int)buf);
+    }
+
     /* Free the current buffer if we're going to have to reallocate */
     if (pPriv->buf && pPriv->buf->size < alloc_size) {
 	if (!pPriv->textured)
@@ -2418,13 +2424,14 @@ I830PutImage(ScrnInfoPtr pScrn,
     }
 
 #ifdef INTEL_XVMC
-    if (id == FOURCC_XVMC && 
-        pPriv->rotation == RR_Rotate_0) {
+    if (id == FOURCC_XVMC) {
         if (pPriv->buf) {
             assert(pPriv->textured);
             drm_intel_bo_unreference(pPriv->buf);
             pPriv->buf = NULL;
         }
+	if (IS_I965G(pI830))
+	    pPriv->buf = xvmc_surface;
     } else {
 #endif
         if (pPriv->buf == NULL) {
@@ -2504,14 +2511,6 @@ I830PutImage(ScrnInfoPtr pScrn,
 	break;
 #ifdef INTEL_XVMC
     case FOURCC_XVMC:
-	if (pPriv->rotation != RR_Rotate_0) {
-	    top &= ~1;
-	    nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
-	    I830CopyPlanarData(pScrn, pPriv, buf, srcPitch, srcPitch2, dstPitch,
-		    height, top, left, nlines, npixels, id);
-	}
-
-	break;
 #endif
     default:
 	break;
@@ -2571,14 +2570,7 @@ I830PutImage(ScrnInfoPtr pScrn,
         }
 
         if (IS_I965G(pI830)) {
-#ifdef INTEL_XVMC
-            if (id == FOURCC_XVMC && pPriv->rotation == RR_Rotate_0) {
-                pPriv->YBuf0offset = buf -  pI830->FbBase;
-                pPriv->UBuf0offset = pPriv->YBuf0offset + height*width; 
-                pPriv->VBuf0offset = pPriv->UBuf0offset + height*width/4; 
-            }
-#endif
-            I965DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
+	    I965DisplayVideoTextured(pScrn, pPriv, destId, clipBoxes, width, height,
                                      dstPitch, x1, y1, x2, y2,
                                      src_w, src_h, drw_w, drw_h, pPixmap);
         } else {
diff --git a/src/i965_hwmc.c b/src/i965_hwmc.c
index e7b5de1..8327010 100644
--- a/src/i965_hwmc.c
+++ b/src/i965_hwmc.c
@@ -48,7 +48,7 @@
 #define XVMC_VLD  0x00020000
 #endif
 
-static PutImageFuncPtr XvPutImage;
+static PutImageFuncPtr savedXvPutImage;
 
 
 static int create_context(ScrnInfoPtr pScrn, 
@@ -157,30 +157,22 @@ static int put_image(ScrnInfoPtr pScrn,
         short height, Bool sync, RegionPtr clipBoxes, pointer data,
         DrawablePtr pDraw)
 {
-	I830Ptr pI830 = I830PTR(pScrn);
 	struct intel_xvmc_command *cmd = (struct intel_xvmc_command *)buf;
-	dri_bo *bo;
 
-	if (id == FOURCC_XVMC) {
-            bo = intel_bo_gem_create_from_name(pI830->bufmgr, "surface", cmd->handle);
-            dri_bo_pin(bo, 0x1000);
-	    buf = pI830->FbBase + bo->offset;
-	}
-	XvPutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
+	/* Let 'buf' take our surface bo handler */
+	if (id == FOURCC_XVMC)
+	    buf = (unsigned char*)cmd->handle;
+
+	savedXvPutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
 		drw_w, drw_h, id, buf, width, height, sync, clipBoxes,
 		data, pDraw);
 
-	if (id == FOURCC_XVMC) {
-	    dri_bo_unpin(bo);
-	    dri_bo_unreference(bo);
-	}
-
 	return Success;
 }
 
 static Bool init(ScrnInfoPtr screen_info, XF86VideoAdaptorPtr adaptor)
 {
-    XvPutImage = adaptor->PutImage;
+    savedXvPutImage = adaptor->PutImage;
     adaptor->PutImage = put_image;
 
     return TRUE;
-- 
1.5.3.8




More information about the Intel-gfx mailing list