xf86-video-intel: 26 commits - src/Makefile.am src/i830_driver.c src/i830_hwmc.c src/i830_hwmc.h src/i830_video.c src/i915_hwmc.c src/i915_hwmc.h src/i965_hwmc.c src/i965_hwmc.h src/xvmc/i915_xvmc.c src/xvmc/i915_xvmc.h src/xvmc/i965_xvmc.c src/xvmc/i965_xvmc.h src/xvmc/intel_xvmc.c src/xvmc/intel_xvmc.h src/xvmc/xvmc_vld.c src/xvmc/xvmc_vld.h

Daniel Vetter danvet at kemper.freedesktop.org
Thu Apr 8 04:21:06 PDT 2010


 src/Makefile.am       |    2 
 src/i830_driver.c     |    5 
 src/i830_hwmc.c       |  239 +++++++++++++++++++++++++++++----------
 src/i830_hwmc.h       |   54 +-------
 src/i830_video.c      |   20 ---
 src/i915_hwmc.c       |  301 --------------------------------------------------
 src/i915_hwmc.h       |   47 -------
 src/i965_hwmc.c       |  280 ----------------------------------------------
 src/i965_hwmc.h       |   16 --
 src/xvmc/i915_xvmc.c  |  239 +++++++--------------------------------
 src/xvmc/i915_xvmc.h  |   34 -----
 src/xvmc/i965_xvmc.c  |   88 +++-----------
 src/xvmc/i965_xvmc.h  |    1 
 src/xvmc/intel_xvmc.c |  233 ++++++--------------------------------
 src/xvmc/intel_xvmc.h |   49 +-------
 src/xvmc/xvmc_vld.c   |  137 +++++++---------------
 src/xvmc/xvmc_vld.h   |    1 
 17 files changed, 368 insertions(+), 1378 deletions(-)

New commits:
commit f6cb28e909c8685474e69e8bd8600f146d3a74e9
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Thu Mar 11 15:37:54 2010 +0100

    libXvMC: rip out debug stuff
    
    Almost totatlly unused, but surely totally useless.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 40f0f35..9ad8d01 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -904,8 +904,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	i915XvMCContext *pI915XvMC = NULL;
 	struct intel_xvmc_hw_context *tmpComm = NULL;
 
-	XVMC_DBG("%s\n", __FUNCTION__);
-
 	if (priv_count != (sizeof(struct intel_xvmc_hw_context) >> 2)) {
 		XVMC_ERR
 		    ("_xvmc_create_context() returned incorrect data size!");
@@ -1029,8 +1027,6 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 	struct intel_xvmc_surface *privPast = NULL;
 	i915XvMCContext *pI915XvMC = NULL;
 
-	XVMC_DBG("%s\n", __FUNCTION__);
-
 	/* Check Parameters for validity */
 	if (!display || !context || !target_surface) {
 		XVMC_ERR("Invalid Display, Context or Target!");
@@ -1071,7 +1067,6 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 		privPast = privTarget;
 	} else {
 		if (!(privPast = past_surface->privData)) {
-			XVMC_ERR("Invalid Past Surface!");
 			return XvMCBadSurface;
 		}
 		picture_coding_type = MPEG_P_PICTURE;
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 4437b1a..6cbec80 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -103,14 +103,6 @@ unsigned int mb_bytes_420[] = {
 	768			/* 111111 */
 };
 
-int DEBUG;
-
-static void intel_xvmc_debug_init(void)
-{
-	if (getenv("INTEL_XVMC_DEBUG"))
-		DEBUG = 1;
-}
-
 void LOCK_HARDWARE(drm_context_t ctx)
 {
 	char __ret = 0;
@@ -241,8 +233,6 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
 		return BadValue;
 	}
 
-	intel_xvmc_debug_init();
-
 	/*
 	   Width, Height, and flags are checked against surface_type_id
 	   and port for validity inside the X server, no need to check
@@ -279,7 +269,6 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
 		XVMC_ERR("Unable to create XvMC Context.");
 		return ret;
 	}
-	XVMC_DBG("new context %d created\n", (int)context->context_id);
 
 	comm = (struct intel_xvmc_hw_context *)priv_data;
 
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 9aa5548..d67065e 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -57,8 +57,6 @@
 
 #include "intel_batchbuffer.h"
 
-extern int DEBUG;
-
 #define GTT_PAGE_SIZE 4*1024
 
 #define XVMC_ERR(s, arg...)					\
@@ -71,12 +69,6 @@ extern int DEBUG;
 	fprintf(stderr, "[intel_xvmc] info: " s "\n", ##arg);	\
     } while (0)
 
-#define XVMC_DBG(s, arg...)						\
-    do {								\
-	if (DEBUG)							\
-	    fprintf(stderr, "[intel_xvmc] debug: " s "\n", ##arg);	\
-    } while (0)
-
 /* Subpicture fourcc */
 #define FOURCC_IA44 0x34344149
 
commit 676028ec0cbd4fadded92feefc8371e075abcc12
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 19:23:06 2010 +0100

    libXvMC: unify CreateSurface
    
    Simply store the desired bo size in intel_xvmc_context and initialize
    it in the driver's create_context function.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 80b70e6..40f0f35 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -927,6 +927,8 @@ static Status i915_xvmc_mc_create_context(Display * display,
 
 	tmpComm = (struct intel_xvmc_hw_context *) priv_data;
 	pI915XvMC->use_phys_addr = tmpComm->i915.use_phys_addr;
+	pI915XvMC->comm.surface_bo_size = SIZE_YUV420(context->width,
+						      context->height);
 
 	/* Must free the private data we were passed from X */
 	XFree(priv_data);
@@ -965,49 +967,6 @@ static int i915_xvmc_mc_destroy_context(Display * display,
 	return Success;
 }
 
-static Status i915_xvmc_mc_create_surface(Display * display,
-					  XvMCContext * context,
-					  XvMCSurface * surface, int priv_count,
-					  CARD32 * priv_data)
-{
-	i915XvMCContext *pI915XvMC;
-	struct intel_xvmc_surface *intel_surf;
-
-	if (!(pI915XvMC = context->privData))
-		return XvMCBadContext;
-
-	XVMC_DBG("%s\n", __FUNCTION__);
-
-	PPTHREAD_MUTEX_LOCK();
-	surface->privData = calloc(1, sizeof(struct intel_xvmc_surface));
-
-	if (!(intel_surf = surface->privData)) {
-		PPTHREAD_MUTEX_UNLOCK();
-		return BadAlloc;
-	}
-
-	/* Initialize private values */
-	intel_surf->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
-					      "surface",
-					      SIZE_YUV420(context->width,
-						          context->height),
-					      GTT_PAGE_SIZE);
-
-	/* X may still use this buffer when XVMC is already done with it. */
-	drm_intel_bo_disable_reuse(intel_surf->bo);
-
-	if (!intel_surf->bo) {
-		PPTHREAD_MUTEX_UNLOCK();
-		free(intel_surf);
-		return BadAlloc;
-	}
-
-	XFree(priv_data);
-
-	PPTHREAD_MUTEX_UNLOCK();
-	return 0;
-}
-
 static int i915_xvmc_alloc_render_state_buffers(i915XvMCContext *pI915XvMC)
 {
 	pI915XvMC->sis_bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
@@ -1266,6 +1225,5 @@ struct _intel_xvmc_driver i915_xvmc_mc_driver = {
 	.ctx_list = NULL,
 	.create_context = i915_xvmc_mc_create_context,
 	.destroy_context = i915_xvmc_mc_destroy_context,
-	.create_surface = i915_xvmc_mc_create_surface,
 	.render_surface = i915_xvmc_mc_render_surface,
 };
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 3005a59..1665f6d 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -251,25 +251,6 @@ static Status destroy_context(Display * display, XvMCContext * context)
 #define STRIDE(w)               (w)
 #define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
 
-static Status create_surface(Display * display,
-			     XvMCContext * context, XvMCSurface * surface,
-			     int priv_count, CARD32 * priv_data)
-{
-	struct intel_xvmc_surface *priv_surface = malloc(sizeof(struct intel_xvmc_surface));
-
-	if (!priv_surface)
-		return BadAlloc;
-
-	size_t size = SIZE_YUV420(context->width, context->height);
-	surface->privData = priv_surface;
-	priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
-					      size, 0x1000);
-
-	Xfree(priv_data);
-
-	return Success;
-}
-
 static void flush()
 {
 	struct brw_mi_flush flush;
@@ -878,6 +859,8 @@ static Status create_context(Display * display, XvMCContext * context,
 	if (!intel_ctx)
 		return BadAlloc;
 	intel_ctx->hw = hw_ctx;
+	intel_ctx->surface_bo_size
+		= SIZE_YUV420(context->width, context->height);
 	context->privData = intel_ctx;
 
 	media_state.is_g4x = hw_ctx->i965.is_g4x;
@@ -894,6 +877,5 @@ struct _intel_xvmc_driver i965_xvmc_mc_driver = {
 	.type = XVMC_I965_MPEG2_MC,
 	.create_context = create_context,
 	.destroy_context = destroy_context,
-	.create_surface = create_surface,
 	.render_surface = render_surface,
 };
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 0d54347..4437b1a 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -406,6 +406,7 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 	int priv_count;
 	CARD32 *priv_data;
 	intel_xvmc_surface_ptr intel_surf = NULL;
+	struct intel_xvmc_context *intel_ctx;
 
 	if (!display || !context)
 		return XvMCBadContext;
@@ -413,20 +414,34 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 	if (!surface)
 		return XvMCBadSurface;
 
+	intel_ctx = context->privData;
+
 	if ((ret = _xvmc_create_surface(display, context, surface,
 					&priv_count, &priv_data))) {
 		XVMC_ERR("Unable to create XvMCSurface.");
 		return ret;
 	}
 
-	ret =
-	    (xvmc_driver->create_surface) (display, context, surface,
-					   priv_count, priv_data);
-	if (ret) {
-		XVMC_ERR("create surface failed\n");
-		return ret;
+	XFree(priv_data);
+
+	surface->privData = calloc(1, sizeof(struct intel_xvmc_surface));
+
+	if (!(intel_surf = surface->privData)) {
+		PPTHREAD_MUTEX_UNLOCK();
+		return BadAlloc;
 	}
 
+	intel_surf->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+					      "surface",
+					      intel_ctx->surface_bo_size,
+					      GTT_PAGE_SIZE);
+	if (!intel_surf->bo) {
+		free(intel_surf);
+		return BadAlloc;
+	}
+
+	drm_intel_bo_disable_reuse(intel_surf->bo);
+
 	intel_surf = surface->privData;
 	intel_surf->context = context;
 
@@ -436,6 +451,7 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 					  surface->width, surface->height);
 	if (!intel_surf->image) {
 		XVMC_ERR("Can't create XvImage for surface\n");
+		free(intel_surf);
 		_xvmc_destroy_surface(display, surface);
 		return BadAlloc;
 	}
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 684f931..9aa5548 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -104,6 +104,7 @@ extern Status _xvmc_destroy_subpicture(Display * dpy,
 
 struct intel_xvmc_context {
 	struct intel_xvmc_hw_context *hw;
+	uint32_t surface_bo_size;
 	drm_context_t hw_context;	/* context id to kernel drm */
 };
 typedef struct intel_xvmc_context *intel_xvmc_context_ptr;
@@ -170,10 +171,6 @@ typedef struct _intel_xvmc_driver {
 
 	 Status(*destroy_context) (Display * display, XvMCContext * context);
 
-	 Status(*create_surface) (Display * display, XvMCContext * context,
-				  XvMCSurface * surface, int priv_count,
-				  CARD32 * priv_data);
-
 	 Status(*render_surface) (Display * display, XvMCContext * context,
 				  unsigned int picture_structure,
 				  XvMCSurface * target_surface,
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index 5443f02..5687593 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -592,6 +592,8 @@ static Status cs_init(int interface_offset)
 	return Success;
 }
 
+#define STRIDE(w)               (w)
+#define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
@@ -604,6 +606,8 @@ static Status create_context(Display * display, XvMCContext * context,
 		return BadAlloc;
 	intel_ctx->hw = hw_ctx;
 	context->privData = intel_ctx;
+	intel_ctx->surface_bo_size
+		= SIZE_YUV420(context->width, context->height);
 
 	if (alloc_object(&media_state))
 		return BadAlloc;
@@ -622,27 +626,6 @@ static Status destroy_context(Display * display, XvMCContext * context)
 	return Success;
 }
 
-#define STRIDE(w)               (w)
-#define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
-static Status create_surface(Display * display,
-			     XvMCContext * context, XvMCSurface * surface,
-			     int priv_count, CARD32 * priv_data)
-{
-	struct intel_xvmc_surface *priv_surface = malloc(sizeof(struct intel_xvmc_surface));
-
-	if (!priv_surface)
-		return BadAlloc;
-
-	size_t size = SIZE_YUV420(context->width, context->height);
-	surface->privData = priv_surface;
-	priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
-					      size, 0x1000);
-
-	Xfree(priv_data);
-
-	return Success;
-}
-
 static Status load_qmatrix(Display * display, XvMCContext * context,
 			   const XvMCQMatrix * qmx)
 {
@@ -1234,7 +1217,6 @@ struct _intel_xvmc_driver xvmc_vld_driver = {
 	.type = XVMC_I965_MPEG2_VLD,
 	.create_context = create_context,
 	.destroy_context = destroy_context,
-	.create_surface = create_surface,
 	.load_qmatrix = load_qmatrix,
 	.begin_surface = begin_surface,
 	.render_surface = render_surface,
commit 3f590a4577f554313e7577205e471757a39129b6
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 19:04:51 2010 +0100

    libXvMC i915: kill unused context private fields
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 45be718..80b70e6 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -938,9 +938,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	/* Initialize private context values */
 	pI915XvMC->yStride = STRIDE(context->width);
 	pI915XvMC->uvStride = STRIDE(context->width >> 1);
-	pI915XvMC->haveXv = 0;
-	pI915XvMC->dual_prime = 0;
-	pI915XvMC->port = context->port;
 
 	/* pre-init state buffers */
 	i915_mc_one_time_context_init(context);
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 246faf9..96dd3ce 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -51,21 +51,9 @@
  */
 typedef struct _i915XvMCContext {
 	struct intel_xvmc_context comm;
-	unsigned int ctxno;
-	unsigned int dual_prime;	/* Flag to identify when dual prime is in use. */
 	unsigned int yStride;
 	unsigned int uvStride;
-	unsigned short ref;
-	unsigned int depth;
 	unsigned int use_phys_addr;
-	XvPortID port;		/* Xv Port ID when displaying */
-	int haveXv;		/* Have I initialized the Xv
-				 * connection for this surface? */
-	XvImage *xvImage;	/* Fake Xv Image used for command
-				 * buffer transport to the X server */
-	GC gc;			/* X GC needed for displaying */
-	Drawable draw;		/* Drawable to undisplay from */
-	void *drawHash;
 
 	drm_intel_bo *sis_bo;
 	drm_intel_bo *msb_bo;
commit 8a31dacb067f813a5b0eafc16d265434e48ec5fc
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 18:59:29 2010 +0100

    libXvMC: derive driver context from struct intel_xvmc_context
    
    ... by putting struct intel_xvmc_surface at the beginning. Also kill
    the common context handling code and simply keep a pointer in the
    surface private to the context.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 55d8196..45be718 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1103,7 +1103,7 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 	if (!i915_xvmc_alloc_render_state_buffers(pI915XvMC))
 		return BadAlloc;
 
-	intel_ctx = intel_xvmc_find_context(context->context_id);
+	intel_ctx = context->privData;
 	if (!intel_ctx) {
 		XVMC_ERR("Can't find intel xvmc context\n");
 		return BadValue;
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index e5b8422..246faf9 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -50,6 +50,7 @@
  *      pointer in the XvMCContext structure.
  */
 typedef struct _i915XvMCContext {
+	struct intel_xvmc_context comm;
 	unsigned int ctxno;
 	unsigned int dual_prime;	/* Flag to identify when dual prime is in use. */
 	unsigned int yStride;
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 91086ee..3005a59 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -241,11 +241,10 @@ out:
 
 static Status destroy_context(Display * display, XvMCContext * context)
 {
-	struct i965_xvmc_context *private_context;
-	private_context = context->privData;
-
-	free_object(&media_state);
-	Xfree(private_context);
+	struct intel_xvmc_context *intel_ctx;
+	intel_ctx = context->privData;
+	Xfree(intel_ctx->hw);
+	free(intel_ctx);
 	return Success;
 }
 
@@ -720,7 +719,7 @@ static Status render_surface(Display * display,
 	struct intel_xvmc_surface *priv_future_surface =
 	    future_surface ? future_surface->privData : 0;
 	unsigned short *block_ptr;
-	intel_ctx = intel_xvmc_find_context(context->context_id);
+	intel_ctx = context->privData;
 	i965_ctx = context->privData;
 	if (!intel_ctx) {
 		XVMC_ERR("Can't find intel xvmc context\n");
@@ -871,12 +870,18 @@ static Status render_surface(Display * display,
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct intel_xvmc_hw_context *ctx;
-	ctx = (struct intel_xvmc_hw_context *)priv_data;
-	context->privData = ctx;
+	struct intel_xvmc_context *intel_ctx;
+	struct intel_xvmc_hw_context *hw_ctx;
+	hw_ctx = (struct intel_xvmc_hw_context *)priv_data;
+
+	intel_ctx = calloc(1, sizeof(struct intel_xvmc_context));
+	if (!intel_ctx)
+		return BadAlloc;
+	intel_ctx->hw = hw_ctx;
+	context->privData = intel_ctx;
 
-	media_state.is_g4x = ctx->i965.is_g4x;
-	media_state.is_965_q = ctx->i965.is_965_q;
+	media_state.is_g4x = hw_ctx->i965.is_g4x;
+	media_state.is_965_q = hw_ctx->i965.is_965_q;
 
 	if (alloc_object(&media_state))
 		return BadAlloc;
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 0b778c8..0d54347 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -128,60 +128,6 @@ void UNLOCK_HARDWARE(drm_context_t ctx)
 	PPTHREAD_MUTEX_UNLOCK();
 }
 
-static intel_xvmc_context_ptr intel_xvmc_new_context(Display * dpy)
-{
-	intel_xvmc_context_ptr ret;
-
-	ret = (intel_xvmc_context_ptr) calloc(1, sizeof(intel_xvmc_context_t));
-	if (!ret)
-		return NULL;
-
-	if (!xvmc_driver->ctx_list)
-		ret->next = NULL;
-	else
-		ret->next = xvmc_driver->ctx_list;
-	xvmc_driver->ctx_list = ret;
-	xvmc_driver->num_ctx++;
-
-	return ret;
-
-}
-
-static void intel_xvmc_free_context(XID id)
-{
-	intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
-	intel_xvmc_context_ptr pre = p;
-
-	while (p) {
-		if (p->context && p->context->context_id == id) {
-			if (p == xvmc_driver->ctx_list)
-				xvmc_driver->ctx_list = p->next;
-			else
-				pre->next = p->next;
-			break;
-		}
-		pre = p;
-		p = p->next;
-	}
-
-	if (p) {
-		free(p);
-		xvmc_driver->num_ctx--;
-	}
-}
-
-intel_xvmc_context_ptr intel_xvmc_find_context(XID id)
-{
-	intel_xvmc_context_ptr p = xvmc_driver->ctx_list;
-
-	while (p) {
-		if (p->context && p->context->context_id == id)
-			return p;
-		p = p->next;
-	}
-	return NULL;
-}
-
 static int
 dri2_connect(Display *display)
 {
@@ -364,14 +310,6 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
 
 	XVMC_INFO("decoder type is %s", intel_xvmc_decoder_string(comm->type));
 
-	/* assign local ctx info */
-	intel_ctx = intel_xvmc_new_context(display);
-	if (!intel_ctx) {
-		XVMC_ERR("Intel XvMC context create fail\n");
-		return BadAlloc;
-	}
-	intel_ctx->context = context;
-
 	/* check DRI2 */
 	ret = Success;
 	xvmc_driver->fd = -1;
@@ -440,8 +378,6 @@ _X_EXPORT Status XvMCDestroyContext(Display * display, XvMCContext * context)
 
 	dri_bufmgr_destroy(xvmc_driver->bufmgr);
 
-	intel_xvmc_free_context(context->context_id);
-
 	ret = _xvmc_destroy_context(display, context);
 	if (ret != Success) {
 		XVMC_ERR("_xvmc_destroy_context fail\n");
@@ -492,6 +428,7 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 	}
 
 	intel_surf = surface->privData;
+	intel_surf->context = context;
 
 	intel_surf->image = XvCreateImage(display, context->port,
 					  FOURCC_XVMC,
@@ -701,17 +638,15 @@ _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
 {
 	Status ret = Success;
 	XvMCContext *context;
-	intel_xvmc_context_ptr intel_ctx;
 	intel_xvmc_surface_ptr intel_surf;
 
 	if (!display || !surface)
 		return XvMCBadSurface;
 
-	intel_ctx = intel_xvmc_find_context(surface->context_id);
 	intel_surf = surface->privData;
-	if (!intel_ctx || !intel_surf)
+	context = intel_surf->context;
+	if (!context || !intel_surf)
 		return XvMCBadSurface;
-	context = intel_ctx->context;
 
 	if (intel_surf->gc_init == FALSE) {
 		intel_surf->gc = XCreateGC(display, draw, 0, NULL);
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index f38bd39..684f931 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -102,13 +102,14 @@ extern Status _xvmc_create_subpicture(Display * dpy, XvMCContext * context,
 extern Status _xvmc_destroy_subpicture(Display * dpy,
 				       XvMCSubpicture * subpicture);
 
-typedef struct _intel_xvmc_context {
-	XvMCContext *context;
+struct intel_xvmc_context {
+	struct intel_xvmc_hw_context *hw;
 	drm_context_t hw_context;	/* context id to kernel drm */
-	struct _intel_xvmc_context *next;
-} intel_xvmc_context_t, *intel_xvmc_context_ptr;
+};
+typedef struct intel_xvmc_context *intel_xvmc_context_ptr;
 
 struct intel_xvmc_surface {
+	XvMCContext *context;
 	XvImage *image;
 	GC gc;
 	Bool gc_init;
@@ -247,9 +248,6 @@ static inline const char *intel_xvmc_decoder_string(int flag)
 	}
 }
 
-extern intel_xvmc_context_ptr intel_xvmc_find_context(XID id);
-extern intel_xvmc_surface_ptr intel_xvmc_find_surface(XID id);
-
 extern unsigned int mb_bytes_420[64];
 
 /* dump function */
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index f314a4f..5443f02 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -595,23 +595,30 @@ static Status cs_init(int interface_offset)
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct intel_xvmc_hw_context *ctx;
-	ctx = (struct intel_xvmc_hw_context *)priv_data;
-	context->privData = priv_data;
+	struct intel_xvmc_context *intel_ctx;
+	struct intel_xvmc_hw_context *hw_ctx;
+	hw_ctx = (struct intel_xvmc_hw_context *)priv_data;
+
+	intel_ctx = calloc(1, sizeof(struct intel_xvmc_context));
+	if (!intel_ctx)
+		return BadAlloc;
+	intel_ctx->hw = hw_ctx;
+	context->privData = intel_ctx;
 
 	if (alloc_object(&media_state))
 		return BadAlloc;
 
-	if (setup_media_kernels(ctx))
+	if (setup_media_kernels(hw_ctx))
 		return BadAlloc;
 	return Success;
 }
 
 static Status destroy_context(Display * display, XvMCContext * context)
 {
-	struct i965_xvmc_context *i965_ctx;
-	i965_ctx = context->privData;
-	Xfree(i965_ctx);
+	struct intel_xvmc_context *intel_ctx;
+	intel_ctx = context->privData;
+	Xfree(intel_ctx->hw);
+	free(intel_ctx);
 	return Success;
 }
 
@@ -796,10 +803,9 @@ static Status begin_surface(Display * display, XvMCContext * context,
 {
 	struct i965_xvmc_contex *i965_ctx;
 	struct intel_xvmc_surface *priv_target, *priv_past, *priv_future;
-	intel_xvmc_context_ptr intel_ctx;
+	intel_xvmc_context_ptr intel_ctx = context->privData;
 	Status ret;
 
-	intel_ctx = intel_xvmc_find_context(context->context_id);
 	priv_target = target->privData;
 	priv_past = past ? past->privData : NULL;
 	priv_future = future ? future->privData : NULL;
@@ -989,11 +995,10 @@ static Status put_slice2(Display * display, XvMCContext * context,
 			 unsigned char *slice, int nbytes, int sliceCode)
 {
 	unsigned int bit_buf;
-	intel_xvmc_context_ptr intel_ctx;
-	struct intel_xvmc_hw_context *ctx;
+	intel_xvmc_context_ptr intel_ctx = context->privData;
+	struct intel_xvmc_hw_context *hw_ctx = intel_ctx->hw;
 	int q_scale_code, mb_row;
 
-	ctx = (struct intel_xvmc_hw_context *)context->privData;
 	mb_row = *(slice - 1) - 1;
 	bit_buf =
 	    (slice[0] << 24) | (slice[1] << 16) | (slice[2] << 8) | (slice[3]);
@@ -1014,9 +1019,8 @@ static Status put_slice2(Display * display, XvMCContext * context,
 
 	memcpy(media_state.slice_data.bo->virtual, slice, nbytes);
 
-	intel_ctx = intel_xvmc_find_context(context->context_id);
 	LOCK_HARDWARE(intel_ctx->hw_context);
-	state_base_address(ctx);
+	state_base_address(hw_ctx);
 	pipeline_select();
 	media_state_pointers(VFE_VLD_MODE);
 	urb_layout();
@@ -1049,15 +1053,11 @@ static Status render_surface(Display * display,
 	unsigned short *block_ptr;
 	int i, j;
 	int block_offset = 0;
-	struct intel_xvmc_hw_context *ctx;
+	struct intel_xvmc_hw_context *hw_ctx;
 
-	intel_ctx = intel_xvmc_find_context(context->context_id);
-	if (!intel_ctx) {
-		XVMC_ERR("Can't find intel xvmc context\n");
-		return BadValue;
-	}
+	intel_ctx = context->privData;
 
-	ctx = (struct intel_xvmc_hw_context *)context->privData;
+	hw_ctx = (struct intel_xvmc_hw_context *)context->privData;
 	priv_target = target_surface->privData;
 	priv_past = past_surface ? past_surface->privData : NULL;
 	priv_future = future_surface ? future_surface->privData : NULL;
@@ -1140,7 +1140,7 @@ static Status render_surface(Display * display,
 	}
 
 	LOCK_HARDWARE(intel_ctx->hw_context);
-	state_base_address(ctx);
+	state_base_address(hw_ctx);
 	flush();
 	pipeline_select();
 	urb_layout();
commit 16e5edde4d97e1818e0dbfbc165bd8199f697336
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 16:51:10 2010 +0100

    libXvMC: unify DestroySurface
    
    Surface bo's can be freed by the common code, then there's nothing
    driver specific left.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 0773c2e..55d8196 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1011,25 +1011,6 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	return 0;
 }
 
-static int i915_xvmc_mc_destroy_surface(Display * display,
-					XvMCSurface * surface)
-{
-	struct intel_xvmc_surface *intel_surf;
-	i915XvMCContext *pI915XvMC;
-
-	if (!display || !surface)
-		return BadValue;
-
-	if (!(intel_surf = surface->privData))
-		return XvMCBadSurface;
-
-	drm_intel_bo_unreference(intel_surf->bo);
-
-	free(intel_surf);
-
-	return Success;
-}
-
 static int i915_xvmc_alloc_render_state_buffers(i915XvMCContext *pI915XvMC)
 {
 	pI915XvMC->sis_bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
@@ -1289,6 +1270,5 @@ struct _intel_xvmc_driver i915_xvmc_mc_driver = {
 	.create_context = i915_xvmc_mc_create_context,
 	.destroy_context = i915_xvmc_mc_destroy_context,
 	.create_surface = i915_xvmc_mc_create_surface,
-	.destroy_surface = i915_xvmc_mc_destroy_surface,
 	.render_surface = i915_xvmc_mc_render_surface,
 };
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 31e6184..91086ee 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -271,15 +271,6 @@ static Status create_surface(Display * display,
 	return Success;
 }
 
-static Status destroy_surface(Display * display, XvMCSurface * surface)
-{
-	struct intel_xvmc_surface *priv_surface = surface->privData;
-	XSync(display, False);
-	drm_intel_bo_unreference(priv_surface->bo);
-	free(priv_surface);
-	return Success;
-}
-
 static void flush()
 {
 	struct brw_mi_flush flush;
@@ -899,6 +890,5 @@ struct _intel_xvmc_driver i965_xvmc_mc_driver = {
 	.create_context = create_context,
 	.destroy_context = destroy_context,
 	.create_surface = create_surface,
-	.destroy_surface = destroy_surface,
 	.render_surface = render_surface,
 };
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index f5d9b18..0b778c8 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -524,7 +524,9 @@ _X_EXPORT Status XvMCDestroySurface(Display * display, XvMCSurface * surface)
 	if (intel_surf->gc_init)
 		XFreeGC(display, intel_surf->gc);
 
-	(xvmc_driver->destroy_surface) (display, surface);
+	drm_intel_bo_unreference(intel_surf->bo);
+
+	free(intel_surf);
 
 	_xvmc_destroy_surface(display, surface);
 
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 0e0ee70..f38bd39 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -173,8 +173,6 @@ typedef struct _intel_xvmc_driver {
 				  XvMCSurface * surface, int priv_count,
 				  CARD32 * priv_data);
 
-	 Status(*destroy_surface) (Display * display, XvMCSurface * surface);
-
 	 Status(*render_surface) (Display * display, XvMCContext * context,
 				  unsigned int picture_structure,
 				  XvMCSurface * target_surface,
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index 7942569..f314a4f 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -636,15 +636,6 @@ static Status create_surface(Display * display,
 	return Success;
 }
 
-static Status destroy_surface(Display * display, XvMCSurface * surface)
-{
-	struct intel_xvmc_surface *priv_surface = surface->privData;
-	XSync(display, False);
-	drm_intel_bo_unreference(priv_surface->bo);
-	free(priv_surface);
-	return Success;
-}
-
 static Status load_qmatrix(Display * display, XvMCContext * context,
 			   const XvMCQMatrix * qmx)
 {
@@ -1244,7 +1235,6 @@ struct _intel_xvmc_driver xvmc_vld_driver = {
 	.create_context = create_context,
 	.destroy_context = destroy_context,
 	.create_surface = create_surface,
-	.destroy_surface = destroy_surface,
 	.load_qmatrix = load_qmatrix,
 	.begin_surface = begin_surface,
 	.render_surface = render_surface,
commit 5f64122551f2d8d41d745351b2e4e68208aa6084
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 16:25:57 2010 +0100

    libXvMC: drop get_surface_status driver callback
    
    It's unused. Also drop all related generic code that tries to do
    clever stuff with this callback. These are all remnants from a
    pre-gem world.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index ec52c6c..0773c2e 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1282,23 +1282,6 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 	return 0;
 }
 
-static int i915_xvmc_mc_get_surface_status(Display * display,
-					   XvMCSurface * surface, int *stat)
-{
-	i915XvMCContext *pI915XvMC;
-	struct intel_xvmc_surface *intel_surf;
-
-	if (!display || !surface || !stat)
-		return BadValue;
-
-	*stat = 0;
-
-	if (!(intel_surf = surface->privData))
-		return XvMCBadSurface;
-
-	return 0;
-}
-
 struct _intel_xvmc_driver i915_xvmc_mc_driver = {
 	.type = XVMC_I915_MPEG2_MC,
 	.num_ctx = 0,
@@ -1308,5 +1291,4 @@ struct _intel_xvmc_driver i915_xvmc_mc_driver = {
 	.create_surface = i915_xvmc_mc_create_surface,
 	.destroy_surface = i915_xvmc_mc_destroy_surface,
 	.render_surface = i915_xvmc_mc_render_surface,
-	.get_surface_status = i915_xvmc_mc_get_surface_status,
 };
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 96aef2d..31e6184 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -877,13 +877,6 @@ static Status render_surface(Display * display,
 	return Success;
 }
 
-static Status get_surface_status(Display * display,
-				 XvMCSurface * surface, int *stats)
-{
-	*stats = 0;
-	return 0;
-}
-
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
@@ -908,5 +901,4 @@ struct _intel_xvmc_driver i965_xvmc_mc_driver = {
 	.create_surface = create_surface,
 	.destroy_surface = destroy_surface,
 	.render_surface = render_surface,
-	.get_surface_status = get_surface_status,
 };
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 0279d5e..f5d9b18 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -742,10 +742,6 @@ _X_EXPORT Status XvMCSyncSurface(Display * display, XvMCSurface * surface)
 	if (!display || !surface)
 		return XvMCBadSurface;
 
-	do {
-		ret = XvMCGetSurfaceStatus(display, surface, &stat);
-	} while (!ret && (stat & XVMC_RENDERING));
-
 	return ret;
 }
 
@@ -763,6 +759,7 @@ _X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface * surface)
 {
 	if (!display || !surface)
 		return XvMCBadSurface;
+
 	return Success;
 }
 
@@ -781,16 +778,10 @@ _X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface * surface)
 _X_EXPORT Status XvMCGetSurfaceStatus(Display * display, XvMCSurface * surface,
 				      int *stat)
 {
-	Status ret;
-
 	if (!display || !surface || !stat)
 		return XvMCBadSurface;
 
-	ret = (xvmc_driver->get_surface_status) (display, surface, stat);
-	if (ret) {
-		XVMC_ERR("get surface status fail\n");
-		return ret;
-	}
+	*stat = 0;
 
 	return Success;
 }
@@ -812,21 +803,7 @@ _X_EXPORT Status XvMCHideSurface(Display * display, XvMCSurface * surface)
 	if (!display || !surface)
 		return XvMCBadSurface;
 
-	XvMCSyncSurface(display, surface);
-
-	/*
-	   Get the status of the surface, if it is not currently displayed
-	   we don't need to worry about it.
-	 */
-	if ((ret = XvMCGetSurfaceStatus(display, surface, &stat)) != Success)
-		return ret;
-
-	if (!(stat & XVMC_DISPLAYING))
-		return Success;
-
-	/* FIXME: */
-	XVMC_ERR("XvMCHideSurface not implemented!\n");
-	return BadValue;
+	return Success;
 }
 
 /*
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 2907313..0e0ee70 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -186,9 +186,6 @@ typedef struct _intel_xvmc_driver {
 				  XvMCMacroBlockArray * macroblock_array,
 				  XvMCBlockArray * blocks);
 
-	 Status(*get_surface_status) (Display * display, XvMCSurface * surface,
-				      int *stat);
-
 	 Status(*begin_surface) (Display * display, XvMCContext * context,
 				 XvMCSurface * target_surface,
 				 XvMCSurface * past_surface,
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index ee216c2..7942569 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -660,13 +660,6 @@ static Status load_qmatrix(Display * display, XvMCContext * context,
 	return Success;
 }
 
-static Status get_surface_status(Display * display, XvMCSurface * surface,
-				 int *status)
-{
-	*status = 0;
-	return Success;
-}
-
 static Status vld_state(const XvMCMpegControl * control)
 {
 	struct brw_vld_state tmp, *vld = &tmp;
@@ -1253,7 +1246,6 @@ struct _intel_xvmc_driver xvmc_vld_driver = {
 	.create_surface = create_surface,
 	.destroy_surface = destroy_surface,
 	.load_qmatrix = load_qmatrix,
-	.get_surface_status = get_surface_status,
 	.begin_surface = begin_surface,
 	.render_surface = render_surface,
 	.put_slice = put_slice,
commit 6c44ce9e127e531224bac825da7918800a3e6a1a
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 16:20:03 2010 +0100

    libXvMC i915: s/i915XvMCSurface/struct intel_xvmc_surface/
    
    The private surface struct now adds nothing. Drop it.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 55058c6..ec52c6c 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -387,7 +387,7 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 					      unsigned int picture_coding_type)
 {
 	i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
-	i915XvMCSurface *pI915Surface = (i915XvMCSurface *) dest->privData;
+	struct intel_xvmc_surface *intel_surf = dest->privData;
 	struct i915_mc_static_indirect_state_buffer *buffer_info;
 	unsigned int w = dest->width;
 
@@ -406,10 +406,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_y.dw1.tiled_surface = 0;	/* linear */
 	buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_y.dw1.pitch = (pI915XvMC->yStride >> 2);	/* in DWords */
-	buffer_info->dest_y.dw2.base_address = pI915Surface->comm.bo->offset >> 2;	/* starting DWORD address */
+	buffer_info->dest_y.dw2.base_address = intel_surf->bo->offset >> 2;	/* starting DWORD address */
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_y.dw2),
-				pI915Surface->comm.bo, 0,
+				intel_surf->bo, 0,
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -424,10 +424,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_u.dw1.pitch = (pI915XvMC->uvStride >> 2);	/* in DWords */
 	buffer_info->dest_u.dw2.base_address =
-		(pI915Surface->comm.bo->offset + UOFFSET(context)) >> 2;
+		(intel_surf->bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_u.dw2),
-				pI915Surface->comm.bo, UOFFSET(context),
+				intel_surf->bo, UOFFSET(context),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -442,10 +442,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_v.dw1.pitch = (pI915XvMC->uvStride >> 2);	/* in Dwords */
 	buffer_info->dest_v.dw2.base_address =
-		(pI915Surface->comm.bo->offset + VOFFSET(context)) >> 2;
+		(intel_surf->bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_v.dw2),
-				pI915Surface->comm.bo, VOFFSET(context),
+				intel_surf->bo, VOFFSET(context),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -521,8 +521,8 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 }
 
 static void i915_mc_map_state_set(XvMCContext * context,
-				  i915XvMCSurface * privPast,
-				  i915XvMCSurface * privFuture)
+				  struct intel_xvmc_surface * privPast,
+				  struct intel_xvmc_surface * privFuture)
 {
 	i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
 	struct i915_mc_map_state *map_state;
@@ -554,10 +554,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->y_forward.tm2.depth = 0;
 	map_state->y_forward.tm2.max_lod = 0;
 	map_state->y_forward.tm2.cube_face = 0;
-	map_state->y_forward.tm0.base_address = privPast->comm.bo->offset >> 2;
+	map_state->y_forward.tm0.base_address = privPast->bo->offset >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),y_forward.tm0),
-				privPast->comm.bo, 0,
+				privPast->bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->y_forward.tm2.pitch = (pI915XvMC->yStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -574,10 +574,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->y_backward.tm2.depth = 0;
 	map_state->y_backward.tm2.max_lod = 0;
 	map_state->y_backward.tm2.cube_face = 0;
-	map_state->y_backward.tm0.base_address = privFuture->comm.bo->offset >> 2;
+	map_state->y_backward.tm0.base_address = privFuture->bo->offset >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),y_backward.tm0),
-				privFuture->comm.bo, 0,
+				privFuture->bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->y_backward.tm2.pitch = (pI915XvMC->yStride >> 2) - 1;
 
@@ -602,10 +602,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_forward.tm2.max_lod = 0;
 	map_state->u_forward.tm2.cube_face = 0;
 	map_state->u_forward.tm0.base_address =
-		(privPast->comm.bo->offset + UOFFSET(context)) >> 2;
+		(privPast->bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_forward.tm0),
-				privPast->comm.bo, UOFFSET(context),
+				privPast->bo, UOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->u_forward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -623,10 +623,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_backward.tm2.max_lod = 0;
 	map_state->u_backward.tm2.cube_face = 0;
 	map_state->u_backward.tm0.base_address =
-		(privFuture->comm.bo->offset + UOFFSET(context)) >> 2;
+		(privFuture->bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_backward.tm0),
-				privFuture->comm.bo, UOFFSET(context),
+				privFuture->bo, UOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->u_backward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;
 
@@ -651,10 +651,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_forward.tm2.max_lod = 0;
 	map_state->v_forward.tm2.cube_face = 0;
 	map_state->v_forward.tm0.base_address =
-		(privPast->comm.bo->offset + VOFFSET(context)) >> 2;
+		(privPast->bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_forward.tm0),
-				privPast->comm.bo, VOFFSET(context),
+				privPast->bo, VOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->v_forward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -672,10 +672,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_backward.tm2.max_lod = 0;
 	map_state->v_backward.tm2.cube_face = 0;
 	map_state->v_backward.tm0.base_address =
-		(privFuture->comm.bo->offset + VOFFSET(context)) >> 2;
+		(privFuture->bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_backward.tm0),
-				privFuture->comm.bo, VOFFSET(context),
+				privFuture->bo, VOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->v_backward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;
 
@@ -974,7 +974,7 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 					  CARD32 * priv_data)
 {
 	i915XvMCContext *pI915XvMC;
-	i915XvMCSurface *pI915Surface;
+	struct intel_xvmc_surface *intel_surf;
 
 	if (!(pI915XvMC = context->privData))
 		return XvMCBadContext;
@@ -982,26 +982,26 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	XVMC_DBG("%s\n", __FUNCTION__);
 
 	PPTHREAD_MUTEX_LOCK();
-	surface->privData = (i915XvMCSurface *) calloc(1, sizeof(i915XvMCSurface));
+	surface->privData = calloc(1, sizeof(struct intel_xvmc_surface));
 
-	if (!(pI915Surface = surface->privData)) {
+	if (!(intel_surf = surface->privData)) {
 		PPTHREAD_MUTEX_UNLOCK();
 		return BadAlloc;
 	}
 
 	/* Initialize private values */
-	pI915Surface->comm.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+	intel_surf->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
 					      "surface",
 					      SIZE_YUV420(context->width,
 						          context->height),
 					      GTT_PAGE_SIZE);
 
 	/* X may still use this buffer when XVMC is already done with it. */
-	drm_intel_bo_disable_reuse(pI915Surface->comm.bo);
+	drm_intel_bo_disable_reuse(intel_surf->bo);
 
-	if (!pI915Surface->comm.bo) {
+	if (!intel_surf->bo) {
 		PPTHREAD_MUTEX_UNLOCK();
-		free(pI915Surface);
+		free(intel_surf);
 		return BadAlloc;
 	}
 
@@ -1014,17 +1014,18 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 static int i915_xvmc_mc_destroy_surface(Display * display,
 					XvMCSurface * surface)
 {
-	i915XvMCSurface *pI915Surface;
+	struct intel_xvmc_surface *intel_surf;
+	i915XvMCContext *pI915XvMC;
 
 	if (!display || !surface)
 		return BadValue;
 
-	if (!(pI915Surface = surface->privData))
+	if (!(intel_surf = surface->privData))
 		return XvMCBadSurface;
 
-	drm_intel_bo_unreference(pI915Surface->comm.bo);
+	drm_intel_bo_unreference(intel_surf->bo);
 
-	free(pI915Surface);
+	free(intel_surf);
 
 	return Success;
 }
@@ -1086,9 +1087,9 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 
 	intel_xvmc_context_ptr intel_ctx;
 
-	i915XvMCSurface *privTarget = NULL;
-	i915XvMCSurface *privFuture = NULL;
-	i915XvMCSurface *privPast = NULL;
+	struct intel_xvmc_surface *privTarget = NULL;
+	struct intel_xvmc_surface *privFuture = NULL;
+	struct intel_xvmc_surface *privPast = NULL;
 	i915XvMCContext *pI915XvMC = NULL;
 
 	XVMC_DBG("%s\n", __FUNCTION__);
@@ -1284,15 +1285,15 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 static int i915_xvmc_mc_get_surface_status(Display * display,
 					   XvMCSurface * surface, int *stat)
 {
-	i915XvMCSurface *pI915Surface;
 	i915XvMCContext *pI915XvMC;
+	struct intel_xvmc_surface *intel_surf;
 
 	if (!display || !surface || !stat)
 		return BadValue;
 
 	*stat = 0;
 
-	if (!(pI915Surface = surface->privData))
+	if (!(intel_surf = surface->privData))
 		return XvMCBadSurface;
 
 	return 0;
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 3f96a9c..e5b8422 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -91,13 +91,4 @@ typedef struct _i915XvMCSubpicture {
 /* Number of YUV buffers per surface */
 #define I830_MAX_BUFS 2
 
-/*
- * i915XvMCSurface: Private data structure for each XvMCSurface. This
- *  structure is referenced by the privData pointer in the XvMCSurface
- *  structure.
- */
-typedef struct _i915XvMCSurface {
-	struct intel_xvmc_surface comm;
-} i915XvMCSurface;
-
 #endif /* _I915XVMC_H */
commit 583ec1f2f7ed32bb42c98baa1ca0fc3735b69b11
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 15:55:44 2010 +0100

    libXvMC i915: rip out unneeded surface fields
    
    All of these are also stored in the context. Also kill the context
    reference counting. Doesn't serve a purpose besides occupying a
    pointer to the context in the private surface struct.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index fdf8cb5..55058c6 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -35,9 +35,9 @@
 #define SIZE_Y420(w, h)         (h * STRIDE(w))
 #define SIZE_UV420(w, h)        ((h >> 1) * STRIDE(w >> 1))
 #define SIZE_YUV420(w, h)       (SIZE_Y420(w,h) + SIZE_UV420(w,h) * 2)
-#define UOFFSET(surface)        (SIZE_Y420(surface->width, surface->height))
-#define VOFFSET(surface)        (SIZE_Y420(surface->width, surface->height) + \
-                                 SIZE_UV420(surface->width, surface->height))
+#define UOFFSET(context)        (SIZE_Y420(context->width, context->height))
+#define VOFFSET(context)        (SIZE_Y420(context->width, context->height) + \
+                                 SIZE_UV420(context->width, context->height))
 
 typedef union {
 	int16_t component[2];
@@ -405,7 +405,7 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_y.dw1.fence_regs = 0;	/* disabled *//* FIXME: tiled y for performance */
 	buffer_info->dest_y.dw1.tiled_surface = 0;	/* linear */
 	buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
-	buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2);	/* in DWords */
+	buffer_info->dest_y.dw1.pitch = (pI915XvMC->yStride >> 2);	/* in DWords */
 	buffer_info->dest_y.dw2.base_address = pI915Surface->comm.bo->offset >> 2;	/* starting DWORD address */
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_y.dw2),
@@ -422,12 +422,12 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_u.dw1.fence_regs = 0;
 	buffer_info->dest_u.dw1.tiled_surface = 0;
 	buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
-	buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2);	/* in DWords */
+	buffer_info->dest_u.dw1.pitch = (pI915XvMC->uvStride >> 2);	/* in DWords */
 	buffer_info->dest_u.dw2.base_address =
-		(pI915Surface->comm.bo->offset + UOFFSET(pI915Surface)) >> 2;
+		(pI915Surface->comm.bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_u.dw2),
-				pI915Surface->comm.bo, UOFFSET(pI915Surface),
+				pI915Surface->comm.bo, UOFFSET(context),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -440,12 +440,12 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_v.dw1.fence_regs = 0;
 	buffer_info->dest_v.dw1.tiled_surface = 0;
 	buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
-	buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2);	/* in Dwords */
+	buffer_info->dest_v.dw1.pitch = (pI915XvMC->uvStride >> 2);	/* in Dwords */
 	buffer_info->dest_v.dw2.base_address =
-		(pI915Surface->comm.bo->offset + VOFFSET(pI915Surface)) >> 2;
+		(pI915Surface->comm.bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_v.dw2),
-				pI915Surface->comm.bo, VOFFSET(pI915Surface),
+				pI915Surface->comm.bo, VOFFSET(context),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -559,7 +559,7 @@ static void i915_mc_map_state_set(XvMCContext * context,
 				offsetof(typeof(*map_state),y_forward.tm0),
 				privPast->comm.bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;	/* in DWords - 1 */
+	map_state->y_forward.tm2.pitch = (pI915XvMC->yStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* Y Backward (Future) */
 	map_state->y_backward.tm0.v_ls_offset = 0;
@@ -579,7 +579,7 @@ static void i915_mc_map_state_set(XvMCContext * context,
 				offsetof(typeof(*map_state),y_backward.tm0),
 				privFuture->comm.bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
+	map_state->y_backward.tm2.pitch = (pI915XvMC->yStride >> 2) - 1;
 
 	/* 3DSATE_MAP_STATE: U */
 	map_state->u_map.dw0.type = CMD_3D;
@@ -602,12 +602,12 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_forward.tm2.max_lod = 0;
 	map_state->u_forward.tm2.cube_face = 0;
 	map_state->u_forward.tm0.base_address =
-		(privPast->comm.bo->offset + UOFFSET(privPast)) >> 2;
+		(privPast->comm.bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_forward.tm0),
-				privPast->comm.bo, UOFFSET(privPast),
+				privPast->comm.bo, UOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
+	map_state->u_forward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* U Backward */
 	map_state->u_backward.tm0.v_ls_offset = 0;
@@ -623,12 +623,12 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_backward.tm2.max_lod = 0;
 	map_state->u_backward.tm2.cube_face = 0;
 	map_state->u_backward.tm0.base_address =
-		(privFuture->comm.bo->offset + UOFFSET(privFuture)) >> 2;
+		(privFuture->comm.bo->offset + UOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_backward.tm0),
-				privFuture->comm.bo, UOFFSET(privFuture),
+				privFuture->comm.bo, UOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+	map_state->u_backward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;
 
 	/* 3DSATE_MAP_STATE: V */
 	map_state->v_map.dw0.type = CMD_3D;
@@ -651,12 +651,12 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_forward.tm2.max_lod = 0;
 	map_state->v_forward.tm2.cube_face = 0;
 	map_state->v_forward.tm0.base_address =
-		(privPast->comm.bo->offset + VOFFSET(privPast)) >> 2;
+		(privPast->comm.bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_forward.tm0),
-				privPast->comm.bo, VOFFSET(privPast),
+				privPast->comm.bo, VOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
+	map_state->v_forward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* V Backward */
 	map_state->v_backward.tm0.v_ls_offset = 0;
@@ -672,12 +672,12 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_backward.tm2.max_lod = 0;
 	map_state->v_backward.tm2.cube_face = 0;
 	map_state->v_backward.tm0.base_address =
-		(privFuture->comm.bo->offset + VOFFSET(privFuture)) >> 2;
+		(privFuture->comm.bo->offset + VOFFSET(context)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_backward.tm0),
-				privFuture->comm.bo, VOFFSET(privFuture),
+				privFuture->comm.bo, VOFFSET(context),
 				I915_GEM_DOMAIN_SAMPLER, 0);
-	map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+	map_state->v_backward.tm2.pitch = (pI915XvMC->uvStride >> 2) - 1;
 
 	drm_intel_gem_bo_unmap_gtt(pI915XvMC->msb_bo);
 }
@@ -891,7 +891,6 @@ static void i915_release_resource(Display * display, XvMCContext * context)
 	if (!(pI915XvMC = context->privData))
 		return;
 
-	pI915XvMC->ref--;
 	i915_xvmc_free_one_time_buffers(pI915XvMC);
 
 	free(pI915XvMC);
@@ -942,7 +941,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	pI915XvMC->haveXv = 0;
 	pI915XvMC->dual_prime = 0;
 	pI915XvMC->port = context->port;
-	pI915XvMC->ref = 1;
 
 	/* pre-init state buffers */
 	i915_mc_one_time_context_init(context);
@@ -992,13 +990,6 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	}
 
 	/* Initialize private values */
-	pI915Surface->yStride = pI915XvMC->yStride;
-	pI915Surface->uvStride = pI915XvMC->uvStride;
-	pI915Surface->width = context->width;
-	pI915Surface->height = context->height;
-	pI915Surface->privContext = pI915XvMC;
-	pI915Surface->privSubPic = NULL;
-
 	pI915Surface->comm.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
 					      "surface",
 					      SIZE_YUV420(context->width,
@@ -1016,7 +1007,6 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 
 	XFree(priv_data);
 
-	pI915XvMC->ref++;
 	PPTHREAD_MUTEX_UNLOCK();
 	return 0;
 }
@@ -1025,7 +1015,6 @@ static int i915_xvmc_mc_destroy_surface(Display * display,
 					XvMCSurface * surface)
 {
 	i915XvMCSurface *pI915Surface;
-	i915XvMCContext *pI915XvMC;
 
 	if (!display || !surface)
 		return BadValue;
@@ -1033,14 +1022,9 @@ static int i915_xvmc_mc_destroy_surface(Display * display,
 	if (!(pI915Surface = surface->privData))
 		return XvMCBadSurface;
 
-	if (!(pI915XvMC = pI915Surface->privContext))
-		return XvMCBadSurface;
-
 	drm_intel_bo_unreference(pI915Surface->comm.bo);
 
 	free(pI915Surface);
-	surface->privData = NULL;
-	pI915XvMC->ref--;
 
 	return Success;
 }
@@ -1311,9 +1295,6 @@ static int i915_xvmc_mc_get_surface_status(Display * display,
 	if (!(pI915Surface = surface->privData))
 		return XvMCBadSurface;
 
-	if (!(pI915XvMC = pI915Surface->privContext))
-		return XvMCBadSurface;
-
 	return 0;
 }
 
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 4a5a98d..3f96a9c 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -98,14 +98,6 @@ typedef struct _i915XvMCSubpicture {
  */
 typedef struct _i915XvMCSurface {
 	struct intel_xvmc_surface comm;
-	unsigned int srfNo;	/* XvMC private surface numbers */
-	unsigned int yStride;	/* Stride of YUV420 Y component. */
-	unsigned int uvStride;
-	unsigned int width;	/* Dimensions */
-	unsigned int height;
-	i915XvMCContext *privContext;
-	i915XvMCSubpicture *privSubPic;	/* Subpicture to be blended when
-					 * displaying. NULL if none. */
 } i915XvMCSurface;
 
 #endif /* _I915XVMC_H */
commit c9aaaed829731cda22d057d6ac6424c587770973
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 15:27:02 2010 +0100

    libXvMC: unify PutSurface
    
    Now that the drm bo is in the common structure, do the PutImage
    handling in common code, too.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 2b96cf4..fdf8cb5 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1297,32 +1297,6 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 	return 0;
 }
 
-static int i915_xvmc_mc_put_surface(Display * display, XvMCSurface * surface,
-				    Drawable draw, short srcx, short srcy,
-				    unsigned short srcw, unsigned short srch,
-				    short destx, short desty,
-				    unsigned short destw, unsigned short desth,
-				    int flags, uint32_t *gem_handle)
-{
-	i915XvMCContext *pI915XvMC;
-	i915XvMCSurface *pI915Surface;
-	i915XvMCSubpicture *pI915SubPic;
-
-	if (!(pI915Surface = surface->privData))
-		return XvMCBadSurface;
-
-	if (!(pI915XvMC = pI915Surface->privContext))
-		return XvMCBadSurface;
-
-	PPTHREAD_MUTEX_LOCK();
-
-	drm_intel_bo_flink(pI915Surface->comm.bo, gem_handle);
-
-	PPTHREAD_MUTEX_UNLOCK();
-
-	return 0;
-}
-
 static int i915_xvmc_mc_get_surface_status(Display * display,
 					   XvMCSurface * surface, int *stat)
 {
@@ -1352,6 +1326,5 @@ struct _intel_xvmc_driver i915_xvmc_mc_driver = {
 	.create_surface = i915_xvmc_mc_create_surface,
 	.destroy_surface = i915_xvmc_mc_destroy_surface,
 	.render_surface = i915_xvmc_mc_render_surface,
-	.put_surface = i915_xvmc_mc_put_surface,
 	.get_surface_status = i915_xvmc_mc_get_surface_status,
 };
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 32cb6c3..96aef2d 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -877,20 +877,6 @@ static Status render_surface(Display * display,
 	return Success;
 }
 
-static Status put_surface(Display * display, XvMCSurface * surface,
-			  Drawable draw, short srcx, short srcy,
-			  unsigned short srcw, unsigned short srch,
-			  short destx, short desty,
-			  unsigned short destw, unsigned short desth,
-			  int flags, uint32_t *gem_handle)
-{
-	struct intel_xvmc_surface *private_surface = surface->privData;
-
-	drm_intel_bo_flink(private_surface->bo, gem_handle);
-
-	return Success;
-}
-
 static Status get_surface_status(Display * display,
 				 XvMCSurface * surface, int *stats)
 {
@@ -922,6 +908,5 @@ struct _intel_xvmc_driver i965_xvmc_mc_driver = {
 	.create_surface = create_surface,
 	.destroy_surface = destroy_surface,
 	.render_surface = render_surface,
-	.put_surface = put_surface,
 	.get_surface_status = get_surface_status,
 };
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 664e91a..0279d5e 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -719,14 +719,9 @@ _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
 		intel_surf->gc = XCreateGC(display, draw, 0, NULL);
 	}
 	intel_surf->last_draw = draw;
-	ret = (xvmc_driver->put_surface) (display, surface, draw, srcx, srcy,
-					  srcw, srch, destx, desty, destw,
-					  desth, flags,
-					  &intel_surf->gem_handle);
-	if (ret) {
-		XVMC_ERR("put surface fail\n");
-		return ret;
-	}
+
+	drm_intel_bo_flink(intel_surf->bo, &intel_surf->gem_handle);
+
 	ret = XvPutImage(display, context->port, draw, intel_surf->gc,
 			 intel_surf->image, srcx, srcy, srcw, srch, destx,
 			 desty, destw, desth);
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 8628082..2907313 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -186,13 +186,6 @@ typedef struct _intel_xvmc_driver {
 				  XvMCMacroBlockArray * macroblock_array,
 				  XvMCBlockArray * blocks);
 
-	 Status(*put_surface) (Display * display, XvMCSurface * surface,
-			       Drawable draw, short srcx, short srcy,
-			       unsigned short srcw, unsigned short srch,
-			       short destx, short desty,
-			       unsigned short destw, unsigned short desth,
-			       int flags, uint32_t *gem_handle);
-
 	 Status(*get_surface_status) (Display * display, XvMCSurface * surface,
 				      int *stat);
 
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index d122e89..ee216c2 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -1046,19 +1046,6 @@ static Status put_slice2(Display * display, XvMCContext * context,
 	return Success;
 }
 
-static Status put_surface(Display * display, XvMCSurface * surface,
-			  Drawable draw, short srcx, short srcy,
-			  unsigned short srcw, unsigned short srch,
-			  short destx, short desty,
-			  unsigned short destw, unsigned short desth,
-			  int flags, uint32_t *gem_handle)
-{
-	struct intel_xvmc_surface *private_surface = surface->privData;
-
-	drm_intel_bo_flink(private_surface->bo, gem_handle);
-	return Success;
-}
-
 static Status render_surface(Display * display,
 			     XvMCContext * context,
 			     unsigned int picture_structure,
@@ -1269,7 +1256,6 @@ struct _intel_xvmc_driver xvmc_vld_driver = {
 	.get_surface_status = get_surface_status,
 	.begin_surface = begin_surface,
 	.render_surface = render_surface,
-	.put_surface = put_surface,
 	.put_slice = put_slice,
 	.put_slice2 = put_slice2
 };
commit 4edff6c972311df2370a8323e346eeabd49ced35
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 15:13:41 2010 +0100

    libXvMC: move drm_intel_bo to common intel_xvmc_surface
    
    i965 lost the last field in it's private surface struct. Kill it
    and any associated headers.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 23f2f42..2b96cf4 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -406,10 +406,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_y.dw1.tiled_surface = 0;	/* linear */
 	buffer_info->dest_y.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_y.dw1.pitch = (pI915Surface->yStride >> 2);	/* in DWords */
-	buffer_info->dest_y.dw2.base_address = pI915Surface->bo->offset >> 2;	/* starting DWORD address */
+	buffer_info->dest_y.dw2.base_address = pI915Surface->comm.bo->offset >> 2;	/* starting DWORD address */
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_y.dw2),
-				pI915Surface->bo, 0,
+				pI915Surface->comm.bo, 0,
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -424,10 +424,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_u.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_u.dw1.pitch = (pI915Surface->uvStride >> 2);	/* in DWords */
 	buffer_info->dest_u.dw2.base_address =
-		(pI915Surface->bo->offset + UOFFSET(pI915Surface)) >> 2;
+		(pI915Surface->comm.bo->offset + UOFFSET(pI915Surface)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_u.dw2),
-				pI915Surface->bo, UOFFSET(pI915Surface),
+				pI915Surface->comm.bo, UOFFSET(pI915Surface),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -442,10 +442,10 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	buffer_info->dest_v.dw1.walk = TILEWALK_XMAJOR;
 	buffer_info->dest_v.dw1.pitch = (pI915Surface->uvStride >> 2);	/* in Dwords */
 	buffer_info->dest_v.dw2.base_address =
-		(pI915Surface->bo->offset + VOFFSET(pI915Surface)) >> 2;
+		(pI915Surface->comm.bo->offset + VOFFSET(pI915Surface)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->sis_bo,
 				offsetof(typeof(*buffer_info),dest_v.dw2),
-				pI915Surface->bo, VOFFSET(pI915Surface),
+				pI915Surface->comm.bo, VOFFSET(pI915Surface),
 				I915_GEM_DOMAIN_RENDER,
 				I915_GEM_DOMAIN_RENDER);
 
@@ -554,10 +554,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->y_forward.tm2.depth = 0;
 	map_state->y_forward.tm2.max_lod = 0;
 	map_state->y_forward.tm2.cube_face = 0;
-	map_state->y_forward.tm0.base_address = privPast->bo->offset >> 2;
+	map_state->y_forward.tm0.base_address = privPast->comm.bo->offset >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),y_forward.tm0),
-				privPast->bo, 0,
+				privPast->comm.bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -574,10 +574,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->y_backward.tm2.depth = 0;
 	map_state->y_backward.tm2.max_lod = 0;
 	map_state->y_backward.tm2.cube_face = 0;
-	map_state->y_backward.tm0.base_address = privFuture->bo->offset >> 2;
+	map_state->y_backward.tm0.base_address = privFuture->comm.bo->offset >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),y_backward.tm0),
-				privFuture->bo, 0,
+				privFuture->comm.bo, 0,
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
 
@@ -602,10 +602,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_forward.tm2.max_lod = 0;
 	map_state->u_forward.tm2.cube_face = 0;
 	map_state->u_forward.tm0.base_address =
-		(privPast->bo->offset + UOFFSET(privPast)) >> 2;
+		(privPast->comm.bo->offset + UOFFSET(privPast)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_forward.tm0),
-				privPast->bo, UOFFSET(privPast),
+				privPast->comm.bo, UOFFSET(privPast),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -623,10 +623,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->u_backward.tm2.max_lod = 0;
 	map_state->u_backward.tm2.cube_face = 0;
 	map_state->u_backward.tm0.base_address =
-		(privFuture->bo->offset + UOFFSET(privFuture)) >> 2;
+		(privFuture->comm.bo->offset + UOFFSET(privFuture)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),u_backward.tm0),
-				privFuture->bo, UOFFSET(privFuture),
+				privFuture->comm.bo, UOFFSET(privFuture),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
 
@@ -651,10 +651,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_forward.tm2.max_lod = 0;
 	map_state->v_forward.tm2.cube_face = 0;
 	map_state->v_forward.tm0.base_address =
-		(privPast->bo->offset + VOFFSET(privPast)) >> 2;
+		(privPast->comm.bo->offset + VOFFSET(privPast)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_forward.tm0),
-				privPast->bo, VOFFSET(privPast),
+				privPast->comm.bo, VOFFSET(privPast),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
 
@@ -672,10 +672,10 @@ static void i915_mc_map_state_set(XvMCContext * context,
 	map_state->v_backward.tm2.max_lod = 0;
 	map_state->v_backward.tm2.cube_face = 0;
 	map_state->v_backward.tm0.base_address =
-		(privFuture->bo->offset + VOFFSET(privFuture)) >> 2;
+		(privFuture->comm.bo->offset + VOFFSET(privFuture)) >> 2;
 	drm_intel_bo_emit_reloc(pI915XvMC->msb_bo,
 				offsetof(typeof(*map_state),v_backward.tm0),
-				privFuture->bo, VOFFSET(privFuture),
+				privFuture->comm.bo, VOFFSET(privFuture),
 				I915_GEM_DOMAIN_SAMPLER, 0);
 	map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
 
@@ -999,16 +999,16 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	pI915Surface->privContext = pI915XvMC;
 	pI915Surface->privSubPic = NULL;
 
-	pI915Surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+	pI915Surface->comm.bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
 					      "surface",
 					      SIZE_YUV420(context->width,
 						          context->height),
 					      GTT_PAGE_SIZE);
 
 	/* X may still use this buffer when XVMC is already done with it. */
-	drm_intel_bo_disable_reuse(pI915Surface->bo);
+	drm_intel_bo_disable_reuse(pI915Surface->comm.bo);
 
-	if (!pI915Surface->bo) {
+	if (!pI915Surface->comm.bo) {
 		PPTHREAD_MUTEX_UNLOCK();
 		free(pI915Surface);
 		return BadAlloc;
@@ -1036,7 +1036,7 @@ static int i915_xvmc_mc_destroy_surface(Display * display,
 	if (!(pI915XvMC = pI915Surface->privContext))
 		return XvMCBadSurface;
 
-	drm_intel_bo_unreference(pI915Surface->bo);
+	drm_intel_bo_unreference(pI915Surface->comm.bo);
 
 	free(pI915Surface);
 	surface->privData = NULL;
@@ -1316,7 +1316,7 @@ static int i915_xvmc_mc_put_surface(Display * display, XvMCSurface * surface,
 
 	PPTHREAD_MUTEX_LOCK();
 
-	drm_intel_bo_flink(pI915Surface->bo, gem_handle);
+	drm_intel_bo_flink(pI915Surface->comm.bo, gem_handle);
 
 	PPTHREAD_MUTEX_UNLOCK();
 
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index af4e204..4a5a98d 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -103,7 +103,6 @@ typedef struct _i915XvMCSurface {
 	unsigned int uvStride;
 	unsigned int width;	/* Dimensions */
 	unsigned int height;
-	drm_intel_bo *bo;
 	i915XvMCContext *privContext;
 	i915XvMCSubpicture *privSubPic;	/* Subpicture to be blended when
 					 * displaying. NULL if none. */
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 8d637ba..32cb6c3 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -24,7 +24,7 @@
  *    Zou Nan hai <nanhai.zou at intel.com>
  *
  */
-#include "i965_xvmc.h"
+#include "intel_xvmc.h"
 #include "i810_reg.h"
 #include "brw_defines.h"
 #include "brw_structs.h"
@@ -256,7 +256,7 @@ static Status create_surface(Display * display,
 			     XvMCContext * context, XvMCSurface * surface,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_surface *priv_surface = malloc(sizeof(struct i965_xvmc_surface));
+	struct intel_xvmc_surface *priv_surface = malloc(sizeof(struct intel_xvmc_surface));
 
 	if (!priv_surface)
 		return BadAlloc;
@@ -273,7 +273,7 @@ static Status create_surface(Display * display,
 
 static Status destroy_surface(Display * display, XvMCSurface * surface)
 {
-	struct i965_xvmc_surface *priv_surface = surface->privData;
+	struct intel_xvmc_surface *priv_surface = surface->privData;
 	XSync(display, False);
 	drm_intel_bo_unreference(priv_surface->bo);
 	free(priv_surface);
@@ -722,11 +722,11 @@ static Status render_surface(Display * display,
 	int i, j;
 	struct i965_xvmc_context *i965_ctx;
 	XvMCMacroBlock *mb;
-	struct i965_xvmc_surface *priv_target_surface =
+	struct intel_xvmc_surface *priv_target_surface =
 	    target_surface->privData;
-	struct i965_xvmc_surface *priv_past_surface =
+	struct intel_xvmc_surface *priv_past_surface =
 	    past_surface ? past_surface->privData : 0;
-	struct i965_xvmc_surface *priv_future_surface =
+	struct intel_xvmc_surface *priv_future_surface =
 	    future_surface ? future_surface->privData : 0;
 	unsigned short *block_ptr;
 	intel_ctx = intel_xvmc_find_context(context->context_id);
@@ -884,7 +884,7 @@ static Status put_surface(Display * display, XvMCSurface * surface,
 			  unsigned short destw, unsigned short desth,
 			  int flags, uint32_t *gem_handle)
 {
-	struct i965_xvmc_surface *private_surface = surface->privData;
+	struct intel_xvmc_surface *private_surface = surface->privData;
 
 	drm_intel_bo_flink(private_surface->bo, gem_handle);
 
diff --git a/src/xvmc/i965_xvmc.h b/src/xvmc/i965_xvmc.h
deleted file mode 100644
index a80866f..0000000
--- a/src/xvmc/i965_xvmc.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "intel_xvmc.h"
-
-#define I965_MAX_SURFACES		12
-struct i965_xvmc_surface {
-	struct intel_xvmc_surface comm;
-	dri_bo *bo;
-};
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 8b4bd4d..8628082 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -113,6 +113,7 @@ struct intel_xvmc_surface {
 	GC gc;
 	Bool gc_init;
 	Drawable last_draw;
+	drm_intel_bo *bo;
 	uint32_t gem_handle;
 };
 typedef struct intel_xvmc_surface *intel_xvmc_surface_ptr;
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index 080640b..d122e89 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -23,7 +23,7 @@
  * Author:
  *    Zou Nan hai <nanhai.zou at intel.com>
  */
-#include "xvmc_vld.h"
+#include "intel_xvmc.h"
 #include "i830_hwmc.h"
 #include "i810_reg.h"
 #include "brw_defines.h"
@@ -325,9 +325,10 @@ struct surface_state_obj {
 	dri_bo *bo;
 };
 
+#define MAX_SURFACES 12
 struct binding_table_obj {
 	dri_bo *bo;
-	struct surface_state_obj surface_states[I965_MAX_SURFACES];
+	struct surface_state_obj surface_states[MAX_SURFACES];
 };
 
 struct slice_data_obj {
@@ -364,7 +365,7 @@ static int free_object(struct media_state *s)
 	for (i = 0; i < MEDIA_KERNEL_NUM; i++)
 		FREE_ONE_BO(s->vfe_state.interface.kernels[i].bo);
 	FREE_ONE_BO(s->binding_table.bo);
-	for (i = 0; i < I965_MAX_SURFACES; i++)
+	for (i = 0; i < MAX_SURFACES; i++)
 		FREE_ONE_BO(s->binding_table.surface_states[i].bo);
 	FREE_ONE_BO(s->slice_data.bo);
 	FREE_ONE_BO(s->mb_data.bo);
@@ -376,7 +377,7 @@ static int alloc_object(struct media_state *s)
 {
 	int i;
 
-	for (i = 0; i < I965_MAX_SURFACES; i++) {
+	for (i = 0; i < MAX_SURFACES; i++) {
 		s->binding_table.surface_states[i].bo =
 		    drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface_state",
 				       sizeof(struct brw_surface_state),
@@ -461,7 +462,7 @@ static Status interface_descriptor()
 		desc->desc1.const_urb_entry_read_offset = 0;
 		desc->desc1.const_urb_entry_read_len = 30;
 
-		desc->desc3.binding_table_entry_count = I965_MAX_SURFACES - 1;
+		desc->desc3.binding_table_entry_count = MAX_SURFACES - 1;
 		desc->desc3.binding_table_pointer =
 		    media_state.binding_table.bo->offset >> 5;
 
@@ -528,18 +529,18 @@ out:
 
 static Status binding_tables()
 {
-	unsigned int table[I965_MAX_SURFACES];
+	unsigned int table[MAX_SURFACES];
 	int i;
 
 	if (media_state.binding_table.bo)
 		drm_intel_bo_unreference(media_state.binding_table.bo);
 	media_state.binding_table.bo =
 	    drm_intel_bo_alloc(xvmc_driver->bufmgr, "binding_table",
-			       I965_MAX_SURFACES * 4, 0x1000);
+			       MAX_SURFACES * 4, 0x1000);
 	if (!media_state.binding_table.bo)
 		return BadAlloc;
 
-	for (i = 0; i < I965_MAX_SURFACES; i++) {
+	for (i = 0; i < MAX_SURFACES; i++) {
 		table[i] =
 		    media_state.binding_table.surface_states[i].bo->offset;
 		drm_intel_bo_emit_reloc(media_state.binding_table.bo,
@@ -620,7 +621,7 @@ static Status create_surface(Display * display,
 			     XvMCContext * context, XvMCSurface * surface,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_surface *priv_surface = malloc(sizeof(struct i965_xvmc_surface));
+	struct intel_xvmc_surface *priv_surface = malloc(sizeof(struct intel_xvmc_surface));
 
 	if (!priv_surface)
 		return BadAlloc;
@@ -637,7 +638,7 @@ static Status create_surface(Display * display,
 
 static Status destroy_surface(Display * display, XvMCSurface * surface)
 {
-	struct i965_xvmc_surface *priv_surface = surface->privData;
+	struct intel_xvmc_surface *priv_surface = surface->privData;
 	XSync(display, False);
 	drm_intel_bo_unreference(priv_surface->bo);
 	free(priv_surface);
@@ -754,9 +755,9 @@ static Status setup_media_surface(int index, dri_bo * bo,
 	return Success;
 }
 
-static Status setup_surface(struct i965_xvmc_surface *target,
-			    struct i965_xvmc_surface *past,
-			    struct i965_xvmc_surface *future, int w, int h)
+static Status setup_surface(struct intel_xvmc_surface *target,
+			    struct intel_xvmc_surface *past,
+			    struct intel_xvmc_surface *future, int w, int h)
 {
 	Status ret;
 	ret = setup_media_surface(0, target->bo, 0, w, h, TRUE);
@@ -810,7 +811,7 @@ static Status begin_surface(Display * display, XvMCContext * context,
 			    const XvMCMpegControl * control)
 {
 	struct i965_xvmc_contex *i965_ctx;
-	struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
+	struct intel_xvmc_surface *priv_target, *priv_past, *priv_future;
 	intel_xvmc_context_ptr intel_ctx;
 	Status ret;
 
@@ -1052,7 +1053,7 @@ static Status put_surface(Display * display, XvMCSurface * surface,
 			  unsigned short destw, unsigned short desth,
 			  int flags, uint32_t *gem_handle)
 {
-	struct i965_xvmc_surface *private_surface = surface->privData;
+	struct intel_xvmc_surface *private_surface = surface->privData;
 
 	drm_intel_bo_flink(private_surface->bo, gem_handle);
 	return Success;
@@ -1070,7 +1071,7 @@ static Status render_surface(Display * display,
 			     XvMCMacroBlockArray * macroblock_array,
 			     XvMCBlockArray * blocks)
 {
-	struct i965_xvmc_surface *priv_target, *priv_past, *priv_future;
+	struct intel_xvmc_surface *priv_target, *priv_past, *priv_future;
 	intel_xvmc_context_ptr intel_ctx;
 	XvMCMacroBlock *mb;
 	Status ret;
diff --git a/src/xvmc/xvmc_vld.h b/src/xvmc/xvmc_vld.h
deleted file mode 100644
index ad2b470..0000000
--- a/src/xvmc/xvmc_vld.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "i965_xvmc.h"
commit 9eeabf876d1f70f5525bbac438414557dd2d4335
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 15:00:58 2010 +0100

    libXvMC: derive driver surfaces from struct intel_xvmc_surface
    
    ... by putting struct intel_xvmc_surface at the beginning. This
    will allow to consolidate surface and bo handling.
    
    Also kill some now dead code used to handle the common surface
    structure.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index c8501e3..23f2f42 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -984,7 +984,7 @@ static Status i915_xvmc_mc_create_surface(Display * display,
 	XVMC_DBG("%s\n", __FUNCTION__);
 
 	PPTHREAD_MUTEX_LOCK();
-	surface->privData = (i915XvMCSurface *) malloc(sizeof(i915XvMCSurface));
+	surface->privData = (i915XvMCSurface *) calloc(1, sizeof(i915XvMCSurface));
 
 	if (!(pI915Surface = surface->privData)) {
 		PPTHREAD_MUTEX_UNLOCK();
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 0bf5928..af4e204 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -97,6 +97,7 @@ typedef struct _i915XvMCSubpicture {
  *  structure.
  */
 typedef struct _i915XvMCSurface {
+	struct intel_xvmc_surface comm;
 	unsigned int srfNo;	/* XvMC private surface numbers */
 	unsigned int yStride;	/* Stride of YUV420 Y component. */
 	unsigned int uvStride;
diff --git a/src/xvmc/i965_xvmc.h b/src/xvmc/i965_xvmc.h
index 5846268..a80866f 100644
--- a/src/xvmc/i965_xvmc.h
+++ b/src/xvmc/i965_xvmc.h
@@ -2,5 +2,6 @@
 
 #define I965_MAX_SURFACES		12
 struct i965_xvmc_surface {
+	struct intel_xvmc_surface comm;
 	dri_bo *bo;
 };
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 8ff27da..664e91a 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -182,63 +182,6 @@ intel_xvmc_context_ptr intel_xvmc_find_context(XID id)
 	return NULL;
 }
 
-static intel_xvmc_surface_ptr intel_xvmc_new_surface(Display * dpy)
-{
-	intel_xvmc_surface_ptr ret;
-
-	ret = (intel_xvmc_surface_ptr) calloc(1, sizeof(intel_xvmc_surface_t));
-	if (!ret)
-		return NULL;
-
-	if (!xvmc_driver->surf_list)
-		ret->next = NULL;
-	else
-		ret->next = xvmc_driver->surf_list;
-	xvmc_driver->surf_list = ret;
-	xvmc_driver->num_surf++;
-
-	ret->image = NULL;
-	ret->gc_init = FALSE;
-
-	return ret;
-
-}
-
-static void intel_xvmc_free_surface(XID id)
-{
-	intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
-	intel_xvmc_surface_ptr pre = p;
-
-	while (p) {
-		if (p->surface && p->surface->surface_id == id) {
-			if (p == xvmc_driver->surf_list)
-				xvmc_driver->surf_list = p->next;
-			else
-				pre->next = p->next;
-			break;
-		}
-		pre = p;
-		p = p->next;
-	}
-
-	if (p) {
-		free(p);
-		xvmc_driver->num_surf--;
-	}
-}
-
-intel_xvmc_surface_ptr intel_xvmc_find_surface(XID id)
-{
-	intel_xvmc_surface_ptr p = xvmc_driver->surf_list;
-
-	while (p) {
-		if (p->surface && p->surface->surface_id == id)
-			return p;
-		p = p->next;
-	}
-	return NULL;
-}
-
 static int
 dri2_connect(Display *display)
 {
@@ -534,17 +477,22 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 	if (!surface)
 		return XvMCBadSurface;
 
-	intel_surf = intel_xvmc_new_surface(display);
-	if (!intel_surf)
-		return BadAlloc;
-	intel_surf->surface = surface;
-
 	if ((ret = _xvmc_create_surface(display, context, surface,
 					&priv_count, &priv_data))) {
 		XVMC_ERR("Unable to create XvMCSurface.");
 		return ret;
 	}
 
+	ret =
+	    (xvmc_driver->create_surface) (display, context, surface,
+					   priv_count, priv_data);
+	if (ret) {
+		XVMC_ERR("create surface failed\n");
+		return ret;
+	}
+
+	intel_surf = surface->privData;
+
 	intel_surf->image = XvCreateImage(display, context->port,
 					  FOURCC_XVMC,
 					  (char *) &intel_surf->gem_handle,
@@ -552,18 +500,9 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 	if (!intel_surf->image) {
 		XVMC_ERR("Can't create XvImage for surface\n");
 		_xvmc_destroy_surface(display, surface);
-		intel_xvmc_free_surface(surface->surface_id);
 		return BadAlloc;
 	}
 
-	ret =
-	    (xvmc_driver->create_surface) (display, context, surface,
-					   priv_count, priv_data);
-	if (ret) {
-		XVMC_ERR("create surface failed\n");
-		return ret;
-	}
-
 	return Success;
 }
 
@@ -577,14 +516,13 @@ _X_EXPORT Status XvMCDestroySurface(Display * display, XvMCSurface * surface)
 	if (!display || !surface)
 		return XvMCBadSurface;
 
-	intel_surf = intel_xvmc_find_surface(surface->surface_id);
+	intel_surf = surface->privData;
 	if (!intel_surf)
 		return XvMCBadSurface;
 
 	XFree(intel_surf->image);
 	if (intel_surf->gc_init)
 		XFreeGC(display, intel_surf->gc);
-	intel_xvmc_free_surface(surface->surface_id);
 
 	(xvmc_driver->destroy_surface) (display, surface);
 
@@ -768,7 +706,7 @@ _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
 		return XvMCBadSurface;
 
 	intel_ctx = intel_xvmc_find_context(surface->context_id);
-	intel_surf = intel_xvmc_find_surface(surface->surface_id);
+	intel_surf = surface->privData;
 	if (!intel_ctx || !intel_surf)
 		return XvMCBadSurface;
 	context = intel_ctx->context;
@@ -781,7 +719,6 @@ _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
 		intel_surf->gc = XCreateGC(display, draw, 0, NULL);
 	}
 	intel_surf->last_draw = draw;
-	/* fill intel_surf->data */
 	ret = (xvmc_driver->put_surface) (display, surface, draw, srcx, srcy,
 					  srcw, srch, destx, desty, destw,
 					  desth, flags,
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 67d8ecc..8b4bd4d 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -108,15 +108,14 @@ typedef struct _intel_xvmc_context {
 	struct _intel_xvmc_context *next;
 } intel_xvmc_context_t, *intel_xvmc_context_ptr;
 
-typedef struct _intel_xvmc_surface {
-	XvMCSurface *surface;
+struct intel_xvmc_surface {
 	XvImage *image;
 	GC gc;
 	Bool gc_init;
 	Drawable last_draw;
 	uint32_t gem_handle;
-	struct _intel_xvmc_surface *next;
-} intel_xvmc_surface_t, *intel_xvmc_surface_ptr;
+};
+typedef struct intel_xvmc_surface *intel_xvmc_surface_ptr;
 
 typedef struct _intel_xvmc_drm_map {
 	drm_handle_t handle;
@@ -159,7 +158,7 @@ typedef struct _intel_xvmc_driver {
 	int num_ctx;
 	intel_xvmc_context_ptr ctx_list;
 	int num_surf;
-	intel_xvmc_surface_ptr surf_list;
+	struct intel_xvmc_surface * surf_list;
 
 	void *private;
 
commit a0058369bbdfb49f8df5ee1e50671115927d3565
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed Mar 10 14:31:40 2010 +0100

    XvMC: kill intel_xvmc_command
    
    We only passed around and actually used the gem handle. Don't
    need a struct for one field alone ...
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index be2a6c1..8682fe0 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -63,14 +63,7 @@ struct intel_xvmc_hw_context {
 
 /* Intel private XvMC command to DDX driver */
 struct intel_xvmc_command {
-	unsigned int command;
-	unsigned int ctxNo;
-	unsigned int srfNo;
-	unsigned int subPicNo;
-	unsigned int flags;
-	unsigned int real_id;
 	uint32_t handle;
-	unsigned int pad[5];
 };
 
 #ifdef _INTEL_XVMC_SERVER_
diff --git a/src/i830_video.c b/src/i830_video.c
index a131cb1..c8edcd6 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -1495,8 +1495,7 @@ I830PutImageTextured(ScrnInfoPtr scrn,
 
 	if (xvmc_passthrough(id)) {
 		int size;
-		struct intel_xvmc_command *cmd
-			= (struct intel_xvmc_command *)buf;
+		uint32_t *gem_handle = (uint32_t *)buf;
 
 		i830_free_video_buffers(adaptor_priv);
 
@@ -1512,7 +1511,7 @@ I830PutImageTextured(ScrnInfoPtr scrn,
 		adaptor_priv->buf =
 			drm_intel_bo_gem_create_from_name(intel->bufmgr,
 							  "xvmc surface",
-							  cmd->handle);
+							  *gem_handle);
 	} else {
 		if (!i830_copy_video_data(scrn, adaptor_priv, width, height,
 					  &dstPitch, &dstPitch2,
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 638998c..c8501e3 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1302,12 +1302,11 @@ static int i915_xvmc_mc_put_surface(Display * display, XvMCSurface * surface,
 				    unsigned short srcw, unsigned short srch,
 				    short destx, short desty,
 				    unsigned short destw, unsigned short desth,
-				    int flags, struct intel_xvmc_command *data)
+				    int flags, uint32_t *gem_handle)
 {
 	i915XvMCContext *pI915XvMC;
 	i915XvMCSurface *pI915Surface;
 	i915XvMCSubpicture *pI915SubPic;
-	uint32_t handle = 0;
 
 	if (!(pI915Surface = surface->privData))
 		return XvMCBadSurface;
@@ -1317,16 +1316,7 @@ static int i915_xvmc_mc_put_surface(Display * display, XvMCSurface * surface,
 
 	PPTHREAD_MUTEX_LOCK();
 
-	drm_intel_bo_flink(pI915Surface->bo, &handle);
-
-	data->command = INTEL_XVMC_COMMAND_DISPLAY;
-	data->ctxNo = pI915XvMC->ctxno;
-	data->srfNo = pI915Surface->srfNo;
-	pI915SubPic = pI915Surface->privSubPic;
-	data->subPicNo = (!pI915SubPic ? 0 : pI915SubPic->srfNo);
-	data->real_id = FOURCC_YV12;
-	data->flags = flags;
-	data->handle = handle;
+	drm_intel_bo_flink(pI915Surface->bo, gem_handle);
 
 	PPTHREAD_MUTEX_UNLOCK();
 
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index cf8d43f..8d637ba 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -882,13 +882,11 @@ static Status put_surface(Display * display, XvMCSurface * surface,
 			  unsigned short srcw, unsigned short srch,
 			  short destx, short desty,
 			  unsigned short destw, unsigned short desth,
-			  int flags, struct intel_xvmc_command *data)
+			  int flags, uint32_t *gem_handle)
 {
 	struct i965_xvmc_surface *private_surface = surface->privData;
-	uint32_t handle = 0;
 
-	drm_intel_bo_flink(private_surface->bo, &handle);
-	data->handle = handle;
+	drm_intel_bo_flink(private_surface->bo, gem_handle);
 
 	return Success;
 }
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index ade2d7d..8ff27da 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -547,7 +547,7 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 
 	intel_surf->image = XvCreateImage(display, context->port,
 					  FOURCC_XVMC,
-					  (char *)&intel_surf->data,
+					  (char *) &intel_surf->gem_handle,
 					  surface->width, surface->height);
 	if (!intel_surf->image) {
 		XVMC_ERR("Can't create XvImage for surface\n");
@@ -555,7 +555,6 @@ _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context,
 		intel_xvmc_free_surface(surface->surface_id);
 		return BadAlloc;
 	}
-	intel_surf->image->data = (char *)&intel_surf->data;
 
 	ret =
 	    (xvmc_driver->create_surface) (display, context, surface,
@@ -785,7 +784,8 @@ _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface,
 	/* fill intel_surf->data */
 	ret = (xvmc_driver->put_surface) (display, surface, draw, srcx, srcy,
 					  srcw, srch, destx, desty, destw,
-					  desth, flags, &intel_surf->data);
+					  desth, flags,
+					  &intel_surf->gem_handle);
 	if (ret) {
 		XVMC_ERR("put surface fail\n");
 		return ret;
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 9776238..67d8ecc 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -114,7 +114,7 @@ typedef struct _intel_xvmc_surface {
 	GC gc;
 	Bool gc_init;
 	Drawable last_draw;
-	struct intel_xvmc_command data;
+	uint32_t gem_handle;
 	struct _intel_xvmc_surface *next;
 } intel_xvmc_surface_t, *intel_xvmc_surface_ptr;
 
@@ -191,7 +191,7 @@ typedef struct _intel_xvmc_driver {
 			       unsigned short srcw, unsigned short srch,
 			       short destx, short desty,
 			       unsigned short destw, unsigned short desth,
-			       int flags, struct intel_xvmc_command * data);
+			       int flags, uint32_t *gem_handle);
 
 	 Status(*get_surface_status) (Display * display, XvMCSurface * surface,
 				      int *stat);
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index fdb9c60..080640b 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -1050,13 +1050,11 @@ static Status put_surface(Display * display, XvMCSurface * surface,
 			  unsigned short srcw, unsigned short srch,
 			  short destx, short desty,
 			  unsigned short destw, unsigned short desth,
-			  int flags, struct intel_xvmc_command *data)
+			  int flags, uint32_t *gem_handle)
 {
 	struct i965_xvmc_surface *private_surface = surface->privData;
-	uint32_t handle;
 
-	drm_intel_bo_flink(private_surface->bo, &handle);
-	data->handle = handle;
+	drm_intel_bo_flink(private_surface->bo, gem_handle);
 	return Success;
 }
 
commit 79fe4caafd21f6ca262901eac4a66ce5a4eaf548
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 16:20:33 2010 +0100

    XvMC: dynamically allocate adaptor
    
    And kill all the static structures. This way it's clearer what's
    common and what's specific. And the code is shorter too.
    
    Also clean up src/i830_hwmc.c - kill the nonstandard surface types
    for i915 and the associated code.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index b50d4de..c75e420 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -30,111 +30,12 @@
 
 #define _INTEL_XVMC_SERVER_
 #include "i830.h"
-#include "intel_bufmgr.h"
 #include "i830_hwmc.h"
 
 #include <X11/extensions/Xv.h>
 #include <X11/extensions/XvMC.h>
 #include <fourcc.h>
 
-struct intel_xvmc_driver *xvmc_driver;
-
-/* set global current driver for xvmc */
-static Bool intel_xvmc_set_driver(struct intel_xvmc_driver *d)
-{
-	if (xvmc_driver) {
-		ErrorF("XvMC driver already set!\n");
-		return FALSE;
-	} else
-		xvmc_driver = d;
-	return TRUE;
-}
-
-/* check chip type and load xvmc driver */
-/* This must be first called! */
-Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
-{
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	Bool ret = FALSE;
-	char buf[64];
-
-	if (!intel->XvMCEnabled)
-		return FALSE;
-
-	/* Needs KMS support. */
-	if (IS_I915G(intel) || IS_I915GM(intel))
-		return FALSE;
-
-	if (IS_I9XX(intel)) {
-		if (IS_I915(intel))
-			ret = intel_xvmc_set_driver(&i915_xvmc_driver);
-		else if (IS_G4X(intel) || IS_IGDNG(intel))
-			ret = intel_xvmc_set_driver(&vld_xvmc_driver);
-		else
-			ret = intel_xvmc_set_driver(&i965_xvmc_driver);
-	} else {
-		ErrorF("Your chipset doesn't support XvMC.\n");
-		return FALSE;
-	}
-
-	if (xf86XvMCScreenInit(pScreen, 1, &xvmc_driver->adaptor)) {
-		xf86DrvMsg(scrn->scrnIndex, X_INFO,
-			   "[XvMC] %s driver initialized.\n",
-			   xvmc_driver->name);
-	} else {
-		intel->XvMCEnabled = FALSE;
-		xf86DrvMsg(scrn->scrnIndex, X_INFO,
-			   "[XvMC] Failed to initialize XvMC.\n");
-		return FALSE;
-	}
-
-	sprintf(buf, "pci:%04x:%02x:%02x.%d",
-		intel->PciInfo->domain,
-		intel->PciInfo->bus, intel->PciInfo->dev, intel->PciInfo->func);
-
-	xf86XvMCRegisterDRInfo(pScreen, INTEL_XVMC_LIBNAME,
-			       buf,
-			       INTEL_XVMC_MAJOR, INTEL_XVMC_MINOR,
-			       INTEL_XVMC_PATCHLEVEL);
-	return TRUE;
-}
-
-/* i915 hwmc support */
-static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
-	SURFACE_TYPE_MPEG2_MPML,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	720,
-	576,
-	720,
-	576,
-	XVMC_MPEG_2,
-	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
-	0,
-	/* &yv12_subpicture_list */
-	NULL,
-};
-
-static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
-	SURFACE_TYPE_MPEG1_MPML,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	720,
-	576,
-	720,
-	576,
-	XVMC_MPEG_1,
-	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
-	0,
-	NULL,
-};
-
-static XF86MCSurfaceInfoPtr ppSI[2] = {
-	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface,
-	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
-};
-
 static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
 			     int *num_priv, CARD32 ** priv)
 {
@@ -190,30 +91,39 @@ static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
 {
 }
 
-/* Fill in the device dependent adaptor record.
- * This is named "Intel(R) Textured Video" because this code falls under the
- * XV extenstion, the name must match or it won't be used.
- *
- * Surface and Subpicture - see above
- * Function pointers to functions below
- */
-static XF86MCAdaptorRec pAdapt = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = ARRAY_SIZE(ppSI),
-	.surfaces = ppSI,
-	.num_subpictures = 0,
-	.subpictures = NULL,
-	.CreateContext = create_context,
-	.DestroyContext = destroy_context,
-	.CreateSurface = create_surface,
-	.DestroySurface = destroy_surface,
-	.CreateSubpicture =  create_subpicture,
-	.DestroySubpicture = destroy_subpicture,
+/* i915 hwmc support */
+static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
+	FOURCC_YV12,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	720,
+	576,
+	720,
+	576,
+	XVMC_MPEG_2,
+	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+	0,
+	/* &yv12_subpicture_list */
+	NULL,
 };
 
-struct intel_xvmc_driver i915_xvmc_driver = {
-	.name = "i915_xvmc",
-	.adaptor = &pAdapt,
+static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
+	FOURCC_YV12,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	720,
+	576,
+	720,
+	576,
+	XVMC_MPEG_1,
+	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+	0,
+	NULL,
+};
+
+static XF86MCSurfaceInfoPtr surface_info_i915[2] = {
+	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface,
+	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
 };
 
 /* i965 and later hwmc support */
@@ -276,38 +186,75 @@ static XF86MCSurfaceInfoPtr surface_info_vld[] = {
 	&yv12_mpeg2_i965_surface,
 };
 
-static XF86MCAdaptorRec adaptor_vld = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = sizeof(surface_info_vld) / sizeof(surface_info_vld[0]),
-	.surfaces = surface_info_vld,
-
-	.CreateContext = create_context,
-	.DestroyContext = destroy_context,
-	.CreateSurface = create_surface,
-	.DestroySurface = destroy_surface,
-	.CreateSubpicture = create_subpicture,
-	.DestroySubpicture = destroy_subpicture
-};
+/* check chip type and load xvmc driver */
+Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
+{
+	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+	static XF86MCAdaptorRec *pAdapt;
+	char *name;
+	char buf[64];
 
-static XF86MCAdaptorRec adaptor = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = sizeof(surface_info_i965) / sizeof(surface_info_i965[0]),
-	.surfaces = surface_info_i965,
-
-	.CreateContext = create_context,
-	.DestroyContext = destroy_context,
-	.CreateSurface = create_surface,
-	.DestroySurface = destroy_surface,
-	.CreateSubpicture = create_subpicture,
-	.DestroySubpicture = destroy_subpicture
-};
+	if (!intel->XvMCEnabled)
+		return FALSE;
 
-struct intel_xvmc_driver i965_xvmc_driver = {
-	.name = "i965_xvmc",
-	.adaptor = &adaptor,
-};
+	/* Needs KMS support. */
+	if (IS_I915G(intel) || IS_I915GM(intel))
+		return FALSE;
 
-struct intel_xvmc_driver vld_xvmc_driver = {
-	.name = "xvmc_vld",
-	.adaptor = &adaptor_vld,
-};
+	if (!IS_I9XX(intel)) {
+		ErrorF("Your chipset doesn't support XvMC.\n");
+		return FALSE;
+	}
+
+	pAdapt = xcalloc(1, sizeof(struct intel_xvmc_hw_context));
+	if (!pAdapt) {
+		ErrorF("Allocation error.\n");
+		return FALSE;
+	}
+
+	pAdapt->name = "Intel(R) Textured Video";
+	pAdapt->num_subpictures = 0;
+	pAdapt->subpictures = NULL;
+	pAdapt->CreateContext = create_context;
+	pAdapt->DestroyContext = destroy_context;
+	pAdapt->CreateSurface = create_surface;
+	pAdapt->DestroySurface = destroy_surface;
+	pAdapt->CreateSubpicture =  create_subpicture;
+	pAdapt->DestroySubpicture = destroy_subpicture;
+
+	if (IS_I915(intel)) {
+		name = "i915_xvmc",
+		pAdapt->num_surfaces = ARRAY_SIZE(surface_info_i915);
+		pAdapt->surfaces = surface_info_i915;
+	} else if (IS_G4X(intel) || IS_IGDNG(intel)) {
+		name = "xvmc_vld",
+		pAdapt->num_surfaces = ARRAY_SIZE(surface_info_vld);
+		pAdapt->surfaces = surface_info_vld;
+	} else {
+		name = "i965_xvmc",
+		pAdapt->num_surfaces = ARRAY_SIZE(surface_info_i965);
+		pAdapt->surfaces = surface_info_i965;
+	}
+
+	if (xf86XvMCScreenInit(pScreen, 1, &pAdapt)) {
+		xf86DrvMsg(scrn->scrnIndex, X_INFO,
+			   "[XvMC] %s driver initialized.\n",
+			   name);
+	} else {
+		intel->XvMCEnabled = FALSE;
+		xf86DrvMsg(scrn->scrnIndex, X_INFO,
+			   "[XvMC] Failed to initialize XvMC.\n");
+		return FALSE;
+	}
+
+	sprintf(buf, "pci:%04x:%02x:%02x.%d",
+		intel->PciInfo->domain,
+		intel->PciInfo->bus, intel->PciInfo->dev, intel->PciInfo->func);
+
+	xf86XvMCRegisterDRInfo(pScreen, INTEL_XVMC_LIBNAME,
+			       buf,
+			       INTEL_XVMC_MAJOR, INTEL_XVMC_MINOR,
+			       INTEL_XVMC_PATCHLEVEL);
+	return TRUE;
+}
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index c347f05..be2a6c1 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -47,21 +47,6 @@
 #define XVMC_I945_MPEG2_VLD	0x04
 #define XVMC_I965_MPEG2_VLD	0x08
 
-/* supported surface types */
-enum {
-	SURFACE_TYPE_MPEG2_MPML = FOURCC_XVMC,	/* mpeg2 MP at ML */
-	SURFACE_TYPE_MPEG1_MPML,	/* mpeg1 MP at ML */
-	SURFACE_TYPE_MAX
-};
-
-/* common header for context private */
-struct hwmc_buffer {
-	drm_handle_t handle;
-	unsigned long offset;
-	unsigned long size;
-	unsigned long bus_addr;
-};
-
 struct intel_xvmc_hw_context {
 	unsigned int type;
 	union {
@@ -91,18 +76,6 @@ struct intel_xvmc_command {
 #ifdef _INTEL_XVMC_SERVER_
 #include <xf86xvmc.h>
 
-struct intel_xvmc_driver {
-	char *name;
-	XF86MCAdaptorPtr adaptor;
-	/* more items for xvmv surface manage? */
-	void *devPrivate;
-};
-
-extern struct intel_xvmc_driver *xvmc_driver;
-extern struct intel_xvmc_driver i915_xvmc_driver;
-extern struct intel_xvmc_driver i965_xvmc_driver;
-extern struct intel_xvmc_driver vld_xvmc_driver;
-
 extern Bool intel_xvmc_adaptor_init(ScreenPtr);
 #endif
 
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 2b110be..638998c 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1137,12 +1137,6 @@ static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
 	if (!i915_xvmc_alloc_render_state_buffers(pI915XvMC))
 		return BadAlloc;
 
-	if (context->surface_type_id >= SURFACE_TYPE_MAX) {
-		XVMC_ERR("Unsupprted surface_type_id %d.",
-			 context->surface_type_id);
-		return BadValue;
-	}
-
 	intel_ctx = intel_xvmc_find_context(context->context_id);
 	if (!intel_ctx) {
 		XVMC_ERR("Can't find intel xvmc context\n");
commit 00b63ecb192b7eafea9482bf5c5c5d442ce2c6fc
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 15:29:15 2010 +0100

    XvMC: directly set driver type in context creation
    
    Instead of threading it through a global variable.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 9155fa2..b50d4de 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -170,11 +170,14 @@ static int create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
 
 	*num_priv = sizeof(struct intel_xvmc_hw_context) >> 2;
 
-	contextRec->type = xvmc_driver->flag;
-	if (contextRec->type == XVMC_I915_MPEG2_MC) {
-		/* i915 private context */
+	if (IS_I915(intel)) {
+		contextRec->type = XVMC_I915_MPEG2_MC;
 		contextRec->i915.use_phys_addr = 0;
 	} else {
+		if (IS_G4X(intel) || IS_IGDNG(intel))
+			contextRec->type = XVMC_I965_MPEG2_VLD;
+		else
+			contextRec->type = XVMC_I965_MPEG2_MC;
 		contextRec->i965.is_g4x = IS_G4X(intel);
 		contextRec->i965.is_965_q = IS_965_Q(intel);
 		contextRec->i965.is_igdng = IS_IGDNG(intel);
@@ -211,7 +214,6 @@ static XF86MCAdaptorRec pAdapt = {
 struct intel_xvmc_driver i915_xvmc_driver = {
 	.name = "i915_xvmc",
 	.adaptor = &pAdapt,
-	.flag = XVMC_I915_MPEG2_MC,
 };
 
 /* i965 and later hwmc support */
@@ -303,11 +305,9 @@ static XF86MCAdaptorRec adaptor = {
 struct intel_xvmc_driver i965_xvmc_driver = {
 	.name = "i965_xvmc",
 	.adaptor = &adaptor,
-	.flag = XVMC_I965_MPEG2_MC,
 };
 
 struct intel_xvmc_driver vld_xvmc_driver = {
 	.name = "xvmc_vld",
 	.adaptor = &adaptor_vld,
-	.flag = XVMC_I965_MPEG2_VLD,
 };
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index b54d9a8..c347f05 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -94,7 +94,6 @@ struct intel_xvmc_command {
 struct intel_xvmc_driver {
 	char *name;
 	XF86MCAdaptorPtr adaptor;
-	unsigned int flag;
 	/* more items for xvmv surface manage? */
 	void *devPrivate;
 };
commit 411cdcb6fcb60085191cf712aba1e0977f145256
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 15:23:02 2010 +0100

    XvMC: init driver in one function call
    
    No point splitting this up. Gets rid of two #ifdef INTEL_XVMC blocks
    in i830_video.c.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 3baf5e3..9155fa2 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -52,10 +52,12 @@ static Bool intel_xvmc_set_driver(struct intel_xvmc_driver *d)
 
 /* check chip type and load xvmc driver */
 /* This must be first called! */
-Bool intel_xvmc_probe(ScrnInfoPtr scrn)
+Bool intel_xvmc_adaptor_init(ScreenPtr pScreen)
 {
+	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	Bool ret = FALSE;
+	char buf[64];
 
 	if (!intel->XvMCEnabled)
 		return FALSE;
@@ -75,17 +77,6 @@ Bool intel_xvmc_probe(ScrnInfoPtr scrn)
 		ErrorF("Your chipset doesn't support XvMC.\n");
 		return FALSE;
 	}
-	return TRUE;
-}
-
-Bool intel_xvmc_screen_init(ScreenPtr pScreen)
-{
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	char buf[64];
-
-	if (!xvmc_driver)
-		return FALSE;
 
 	if (xf86XvMCScreenInit(pScreen, 1, &xvmc_driver->adaptor)) {
 		xf86DrvMsg(scrn->scrnIndex, X_INFO,
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index 1063938..b54d9a8 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -104,8 +104,7 @@ extern struct intel_xvmc_driver i915_xvmc_driver;
 extern struct intel_xvmc_driver i965_xvmc_driver;
 extern struct intel_xvmc_driver vld_xvmc_driver;
 
-extern Bool intel_xvmc_probe(ScrnInfoPtr);
-extern Bool intel_xvmc_screen_init(ScreenPtr);
+extern Bool intel_xvmc_adaptor_init(ScreenPtr);
 #endif
 
 #endif
diff --git a/src/i830_video.c b/src/i830_video.c
index 0e8799d..a131cb1 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -344,9 +344,6 @@ void I830InitVideo(ScreenPtr screen)
 	XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
 	XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL;
 	int num_adaptors;
-#ifdef INTEL_XVMC
-	Bool xvmc_status = FALSE;
-#endif
 
 	num_adaptors = xf86XVListGenericAdaptors(scrn, &adaptors);
 	/* Give our adaptor list enough space for the overlay and/or texture video
@@ -404,11 +401,6 @@ void I830InitVideo(ScreenPtr screen)
 	if (overlayAdaptor && !intel->XvPreferOverlay)
 		adaptors[num_adaptors++] = overlayAdaptor;
 
-#ifdef INTEL_XVMC
-	if (intel_xvmc_probe(scrn))
-		xvmc_status = TRUE;
-#endif
-
 	if (num_adaptors) {
 		xf86XVScreenInit(screen, adaptors, num_adaptors);
 	} else {
@@ -418,8 +410,8 @@ void I830InitVideo(ScreenPtr screen)
 	}
 
 #ifdef INTEL_XVMC
-	if (xvmc_status && texturedAdaptor)
-		intel_xvmc_screen_init(screen);
+	if (texturedAdaptor)
+		intel_xvmc_adaptor_init(screen);
 #endif
 	xfree(adaptors);
 }
commit b666e3e29f22894f43a8e9f7f3d1b950d431c42d
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 14:56:44 2010 +0100

    XvMC: move i965 specific stuff to common context
    
    Like for the i915. With this create_context is now also shared.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index fc653ce..3baf5e3 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -32,7 +32,6 @@
 #include "i830.h"
 #include "intel_bufmgr.h"
 #include "i830_hwmc.h"
-#include "i965_hwmc.h"
 
 #include <X11/extensions/Xv.h>
 #include <X11/extensions/XvMC.h>
@@ -145,40 +144,6 @@ static XF86MCSurfaceInfoPtr ppSI[2] = {
 	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
 };
 
-/*
- *  i915_xvmc_create_context
- *
- *  Some info about the private data:
- *
- *  Set *num_priv to the number of 32bit words that make up the size of
- *  of the data that priv will point to.
- *
- *  *priv = (long *) xcalloc (elements, sizeof(element))
- *  *num_priv = (elements * sizeof(element)) >> 2;
- *
- **************************************************************************/
-
-static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
-				    int *num_priv, long **priv)
-{
-	struct intel_xvmc_hw_context *contextRec;
-
-	*priv = xcalloc(1, sizeof(struct intel_xvmc_hw_context));
-	contextRec = (struct intel_xvmc_hw_context *) *priv;
-	if (!contextRec) {
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	*num_priv = sizeof(struct intel_xvmc_hw_context) >> 2;
-
-	contextRec->type = xvmc_driver->flag;
-	/* i915 private context */
-	contextRec->i915.use_phys_addr = 0;
-
-	return Success;
-}
-
 static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
 			     int *num_priv, CARD32 ** priv)
 {
@@ -199,6 +164,34 @@ static void destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
 {
 }
 
+static int create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
+				    int *num_priv, CARD32 **priv)
+{
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+	struct intel_xvmc_hw_context *contextRec;
+
+	*priv = xcalloc(1, sizeof(struct intel_xvmc_hw_context));
+	contextRec = (struct intel_xvmc_hw_context *) *priv;
+	if (!contextRec) {
+		*num_priv = 0;
+		return BadAlloc;
+	}
+
+	*num_priv = sizeof(struct intel_xvmc_hw_context) >> 2;
+
+	contextRec->type = xvmc_driver->flag;
+	if (contextRec->type == XVMC_I915_MPEG2_MC) {
+		/* i915 private context */
+		contextRec->i915.use_phys_addr = 0;
+	} else {
+		contextRec->i965.is_g4x = IS_G4X(intel);
+		contextRec->i965.is_965_q = IS_965_Q(intel);
+		contextRec->i965.is_igdng = IS_IGDNG(intel);
+	}
+
+	return Success;
+}
+
 static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
 {
 }
@@ -216,8 +209,7 @@ static XF86MCAdaptorRec pAdapt = {
 	.surfaces = ppSI,
 	.num_subpictures = 0,
 	.subpictures = NULL,
-	.CreateContext =
-	    (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
+	.CreateContext = create_context,
 	.DestroyContext = destroy_context,
 	.CreateSurface = create_surface,
 	.DestroySurface = destroy_surface,
@@ -236,33 +228,6 @@ struct intel_xvmc_driver i915_xvmc_driver = {
 #define XVMC_VLD  0x00020000
 #endif
 
-static int create_context(ScrnInfoPtr scrn,
-			  XvMCContextPtr context, int *num_privates,
-			  CARD32 ** private)
-{
-	struct i965_xvmc_context *private_context;
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-
-	unsigned int blocknum =
-	    (((context->width + 15) / 16) * ((context->height + 15) / 16));
-	unsigned int blocksize = 6 * blocknum * 64 * sizeof(short);
-	blocksize = (blocksize + 4095) & (~4095);
-	if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
-		ErrorF("XVMC Can not allocate private context\n");
-		return BadAlloc;
-	}
-
-	private_context->is_g4x = IS_G4X(intel);
-	private_context->is_965_q = IS_965_Q(intel);
-	private_context->is_igdng = IS_IGDNG(intel);
-	private_context->comm.type = xvmc_driver->flag;
-
-	*num_privates = sizeof(*private_context) / sizeof(CARD32);
-	*private = (CARD32 *) private_context;
-
-	return Success;
-}
-
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index 2ca0d53..1063938 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -68,6 +68,11 @@ struct intel_xvmc_hw_context {
 		struct {
 			unsigned int use_phys_addr : 1;
 		} i915;
+		struct {
+			unsigned int is_g4x:1;
+			unsigned int is_965_q:1;
+			unsigned int is_igdng:1;
+		} i965;
 	};
 };
 
diff --git a/src/i965_hwmc.h b/src/i965_hwmc.h
deleted file mode 100644
index 7a23fc8..0000000
--- a/src/i965_hwmc.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#define I965_MC_STATIC_BUFFER_SIZE	(1024*512)
-struct i965_xvmc_context {
-	struct intel_xvmc_hw_context comm;
-	unsigned int is_g4x:1;
-	unsigned int is_965_q:1;
-	unsigned int is_igdng:1;
-};
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 417c32e..cf8d43f 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -29,7 +29,7 @@
 #include "brw_defines.h"
 #include "brw_structs.h"
 #include "intel_batchbuffer.h"
-#include "i965_hwmc.h"
+#include "i830_hwmc.h"
 #define BATCH_STRUCT(x) intelBatchbufferData(&x, sizeof(x), 0)
 #define URB_SIZE     256	/* XXX */
 
@@ -903,12 +903,12 @@ static Status get_surface_status(Display * display,
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_context *i965_ctx;
-	i965_ctx = (struct i965_xvmc_context *)priv_data;
-	context->privData = i965_ctx;
+	struct intel_xvmc_hw_context *ctx;
+	ctx = (struct intel_xvmc_hw_context *)priv_data;
+	context->privData = ctx;
 
-	media_state.is_g4x = i965_ctx->is_g4x;
-	media_state.is_965_q = i965_ctx->is_965_q;
+	media_state.is_g4x = ctx->i965.is_g4x;
+	media_state.is_965_q = ctx->i965.is_965_q;
 
 	if (alloc_object(&media_state))
 		return BadAlloc;
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index 8e8d4d6..fdb9c60 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -24,7 +24,7 @@
  *    Zou Nan hai <nanhai.zou at intel.com>
  */
 #include "xvmc_vld.h"
-#include "i965_hwmc.h"
+#include "i830_hwmc.h"
 #include "i810_reg.h"
 #include "brw_defines.h"
 #include "brw_structs.h"
@@ -488,7 +488,7 @@ static Status interface_descriptor()
 	return Success;
 }
 
-static int setup_media_kernels(struct i965_xvmc_context *i965_ctx)
+static int setup_media_kernels(struct intel_xvmc_hw_context *ctx)
 {
 	int i;
 
@@ -496,7 +496,7 @@ static int setup_media_kernels(struct i965_xvmc_context *i965_ctx)
 	       sizeof(media_gen5_kernels) / sizeof(media_gen5_kernels[0]));
 
 	for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
-		if (i965_ctx->is_igdng)
+		if (ctx->i965.is_igdng)
 			media_state.vfe_state.interface.kernels[i].bo =
 			    drm_intel_bo_alloc(xvmc_driver->bufmgr, "kernel",
 					       media_gen5_kernels[i].size,
@@ -513,7 +513,7 @@ static int setup_media_kernels(struct i965_xvmc_context *i965_ctx)
 	for (i = 0; i < MEDIA_KERNEL_NUM; i++) {
 		dri_bo *bo = media_state.vfe_state.interface.kernels[i].bo;
 
-		if (i965_ctx->is_igdng)
+		if (ctx->i965.is_igdng)
 			drm_intel_bo_subdata(bo, 0, media_gen5_kernels[i].size,
 					     media_gen5_kernels[i].bin);
 		else
@@ -594,14 +594,14 @@ static Status cs_init(int interface_offset)
 static Status create_context(Display * display, XvMCContext * context,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_context *i965_ctx;
-	i965_ctx = (struct i965_xvmc_context *)priv_data;
+	struct intel_xvmc_hw_context *ctx;
+	ctx = (struct intel_xvmc_hw_context *)priv_data;
 	context->privData = priv_data;
 
 	if (alloc_object(&media_state))
 		return BadAlloc;
 
-	if (setup_media_kernels(i965_ctx))
+	if (setup_media_kernels(ctx))
 		return BadAlloc;
 	return Success;
 }
@@ -848,11 +848,11 @@ static Status put_slice(Display * display, XvMCContext * context,
 	return Success;
 }
 
-static void state_base_address(struct i965_xvmc_context *i965_ctx)
+static void state_base_address(struct intel_xvmc_hw_context *ctx)
 {
 	BATCH_LOCALS;
 
-	if (i965_ctx->is_igdng) {
+	if (ctx->i965.is_igdng) {
 		BEGIN_BATCH(8);
 		OUT_BATCH(BRW_STATE_BASE_ADDRESS | 6);
 		OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
@@ -1005,10 +1005,10 @@ static Status put_slice2(Display * display, XvMCContext * context,
 {
 	unsigned int bit_buf;
 	intel_xvmc_context_ptr intel_ctx;
-	struct i965_xvmc_context *i965_ctx;
+	struct intel_xvmc_hw_context *ctx;
 	int q_scale_code, mb_row;
 
-	i965_ctx = (struct i965_xvmc_context *)context->privData;
+	ctx = (struct intel_xvmc_hw_context *)context->privData;
 	mb_row = *(slice - 1) - 1;
 	bit_buf =
 	    (slice[0] << 24) | (slice[1] << 16) | (slice[2] << 8) | (slice[3]);
@@ -1031,7 +1031,7 @@ static Status put_slice2(Display * display, XvMCContext * context,
 
 	intel_ctx = intel_xvmc_find_context(context->context_id);
 	LOCK_HARDWARE(intel_ctx->hw_context);
-	state_base_address(i965_ctx);
+	state_base_address(ctx);
 	pipeline_select();
 	media_state_pointers(VFE_VLD_MODE);
 	urb_layout();
@@ -1079,7 +1079,7 @@ static Status render_surface(Display * display,
 	unsigned short *block_ptr;
 	int i, j;
 	int block_offset = 0;
-	struct i965_xvmc_context *i965_ctx;
+	struct intel_xvmc_hw_context *ctx;
 
 	intel_ctx = intel_xvmc_find_context(context->context_id);
 	if (!intel_ctx) {
@@ -1087,7 +1087,7 @@ static Status render_surface(Display * display,
 		return BadValue;
 	}
 
-	i965_ctx = (struct i965_xvmc_context *)context->privData;
+	ctx = (struct intel_xvmc_hw_context *)context->privData;
 	priv_target = target_surface->privData;
 	priv_past = past_surface ? past_surface->privData : NULL;
 	priv_future = future_surface ? future_surface->privData : NULL;
@@ -1170,7 +1170,7 @@ static Status render_surface(Display * display,
 	}
 
 	LOCK_HARDWARE(intel_ctx->hw_context);
-	state_base_address(i965_ctx);
+	state_base_address(ctx);
 	flush();
 	pipeline_select();
 	urb_layout();
commit e0068b1e63bc914940dbeb52de46657fcf5da1ea
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 14:44:53 2010 +0100

    XvMC: move i915 specific stuff to common context
    
    Doing the same with the i965 code will allow us to share the
    create_context function.
    
    src/i915_hwmc.h is now almost empty. Move the last #defines to
    src/xvmv/i915_xvmc.c where they are actually used and delete the
    file.
    
    Also rename the ddx context struct to something sane.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index de2c5c7..fc653ce 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -32,7 +32,6 @@
 #include "i830.h"
 #include "intel_bufmgr.h"
 #include "i830_hwmc.h"
-#include "i915_hwmc.h"
 #include "i965_hwmc.h"
 
 #include <X11/extensions/Xv.h>
@@ -146,21 +145,6 @@ static XF86MCSurfaceInfoPtr ppSI[2] = {
 	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
 };
 
-/* Check context size not exceed surface type max */
-static void i915_check_context_size(XvMCContextPtr ctx)
-{
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(ppSI); i++) {
-		if (ctx->surface_type_id == ppSI[i]->surface_type_id) {
-			if (ctx->width > ppSI[i]->max_width)
-				ctx->width = ppSI[i]->max_width;
-			if (ctx->height > ppSI[i]->max_height)
-				ctx->height = ppSI[i]->max_height;
-		}
-	}
-}
-
 /*
  *  i915_xvmc_create_context
  *
@@ -177,33 +161,20 @@ static void i915_check_context_size(XvMCContextPtr ctx)
 static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
 				    int *num_priv, long **priv)
 {
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCCreateContextRec *contextRec = NULL;
-
-	*priv = NULL;
-	*num_priv = 0;
-
-	if (!intel->XvMCEnabled) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: XvMC disabled!\n");
-		return BadAlloc;
-	}
-
-	i915_check_context_size(pContext);
-
-	*priv = xcalloc(1, sizeof(I915XvMCCreateContextRec));
-	contextRec = (I915XvMCCreateContextRec *) * priv;
+	struct intel_xvmc_hw_context *contextRec;
 
-	if (!*priv) {
+	*priv = xcalloc(1, sizeof(struct intel_xvmc_hw_context));
+	contextRec = (struct intel_xvmc_hw_context *) *priv;
+	if (!contextRec) {
 		*num_priv = 0;
 		return BadAlloc;
 	}
 
-	*num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
+	*num_priv = sizeof(struct intel_xvmc_hw_context) >> 2;
 
-	contextRec->comm.type = xvmc_driver->flag;
+	contextRec->type = xvmc_driver->flag;
 	/* i915 private context */
-	contextRec->deviceID = DEVICE_ID(intel->PciInfo);
+	contextRec->i915.use_phys_addr = 0;
 
 	return Success;
 }
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index 599b5be..2ca0d53 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -62,8 +62,13 @@ struct hwmc_buffer {
 	unsigned long bus_addr;
 };
 
-struct _intel_xvmc_common {
+struct intel_xvmc_hw_context {
 	unsigned int type;
+	union {
+		struct {
+			unsigned int use_phys_addr : 1;
+		} i915;
+	};
 };
 
 /* Intel private XvMC command to DDX driver */
diff --git a/src/i830_video.c b/src/i830_video.c
index c2a02b5..0e8799d 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -74,7 +74,6 @@
 #ifdef INTEL_XVMC
 #define _INTEL_XVMC_SERVER_
 #include "i830_hwmc.h"
-#include "i915_hwmc.h"
 #endif
 
 #define OFF_DELAY 	250	/* milliseconds */
diff --git a/src/i915_hwmc.h b/src/i915_hwmc.h
deleted file mode 100644
index c036b63..0000000
--- a/src/i915_hwmc.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright © 2006 Intel Corporation
- *
- * 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.
- *
- * Authors:
- *    Xiang Haihao <haihao.xiang at intel.com>
- *
- */
-#ifndef _I915_HWMC_H
-#define _I915_HWMC_H
-
-#include "i830_hwmc.h"
-
-/* i915 hw requires surface to be at least 1KB aligned */
-#define STRIDE(w)               (((w) + 0x3ff) & ~0x3ff)
-#define SIZE_Y420(w, h)         (h * STRIDE(w))
-#define SIZE_UV420(w, h)        ((h >> 1) * STRIDE(w >> 1))
-#define SIZE_YUV420(w, h)       (SIZE_Y420(w,h) + SIZE_UV420(w,h) * 2)
-#define SIZE_XX44(w, h)         (h * STRIDE(w))
-
-#define I915_NUM_XVMC_ATTRIBUTES       0x02
-#define I915_XVMC_VALID 0x80000000
-
-typedef struct {
-	struct _intel_xvmc_common comm;
-	int deviceID;
-} I915XvMCCreateContextRec;
-
-#endif /* _I915_HWMC_H */
diff --git a/src/i965_hwmc.h b/src/i965_hwmc.h
index 8b38867..7a23fc8 100644
--- a/src/i965_hwmc.h
+++ b/src/i965_hwmc.h
@@ -1,6 +1,6 @@
 #define I965_MC_STATIC_BUFFER_SIZE	(1024*512)
 struct i965_xvmc_context {
-	struct _intel_xvmc_common comm;
+	struct intel_xvmc_hw_context comm;
 	unsigned int is_g4x:1;
 	unsigned int is_965_q:1;
 	unsigned int is_igdng:1;
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 0888d63..2b110be 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -31,6 +31,10 @@
 #include "i915_structs.h"
 #include "i915_program.h"
 
+#define STRIDE(w)               (((w) + 0x3ff) & ~0x3ff)
+#define SIZE_Y420(w, h)         (h * STRIDE(w))
+#define SIZE_UV420(w, h)        ((h >> 1) * STRIDE(w >> 1))
+#define SIZE_YUV420(w, h)       (SIZE_Y420(w,h) + SIZE_UV420(w,h) * 2)
 #define UOFFSET(surface)        (SIZE_Y420(surface->width, surface->height))
 #define VOFFSET(surface)        (SIZE_Y420(surface->width, surface->height) + \
                                  SIZE_UV420(surface->width, surface->height))
@@ -347,8 +351,7 @@ static void i915_mc_one_time_state_emit(XvMCContext * context)
 				<< BLOCK_MASK_SHIFT;
 	load_indirect |= 8 - 2; /* length */
 
-	if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
-	    pI915XvMC->deviceID == PCI_CHIP_I915_GM)
+	if (pI915XvMC->use_phys_addr)
 		mem_select = 0;	/* use physical address */
 	else {
 		load_indirect |= OP_3D_LOAD_INDIRECT_GFX_ADDR;
@@ -691,8 +694,7 @@ static void i915_mc_load_indirect_render_emit(XvMCContext * context)
 	load_indirect |= (BLOCK_SIS | BLOCK_MSB) << BLOCK_MASK_SHIFT;
 	load_indirect |= 5 - 2; /* length */
 
-	if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
-	    pI915XvMC->deviceID == PCI_CHIP_I915_GM)
+	if (pI915XvMC->use_phys_addr)
 		mem_select = 0;	/* use physical address */
 	else {
 		load_indirect |= OP_3D_LOAD_INDIRECT_GFX_ADDR;
@@ -901,15 +903,15 @@ static Status i915_xvmc_mc_create_context(Display * display,
 					  CARD32 * priv_data)
 {
 	i915XvMCContext *pI915XvMC = NULL;
-	I915XvMCCreateContextRec *tmpComm = NULL;
+	struct intel_xvmc_hw_context *tmpComm = NULL;
 
 	XVMC_DBG("%s\n", __FUNCTION__);
 
-	if (priv_count != (sizeof(I915XvMCCreateContextRec) >> 2)) {
+	if (priv_count != (sizeof(struct intel_xvmc_hw_context) >> 2)) {
 		XVMC_ERR
 		    ("_xvmc_create_context() returned incorrect data size!");
 		XVMC_INFO("\tExpected %d, got %d",
-			  (int)(sizeof(I915XvMCCreateContextRec) >> 2),
+			  (int)(sizeof(struct intel_xvmc_hw_context) >> 2),
 			  priv_count);
 		_xvmc_destroy_context(display, context);
 		XFree(priv_data);
@@ -924,8 +926,8 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	}
 	pI915XvMC = (i915XvMCContext *) context->privData;
 
-	tmpComm = (I915XvMCCreateContextRec *) priv_data;
-	pI915XvMC->deviceID = tmpComm->deviceID;
+	tmpComm = (struct intel_xvmc_hw_context *) priv_data;
+	pI915XvMC->use_phys_addr = tmpComm->i915.use_phys_addr;
 
 	/* Must free the private data we were passed from X */
 	XFree(priv_data);
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 7fd142e..0bf5928 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -29,7 +29,7 @@
 #define _I915XVMC_H
 
 #include "intel_xvmc.h"
-#include "i915_hwmc.h"
+#include "i830_hwmc.h"
 
 #define I915_SUBPIC_PALETTE_SIZE        16
 #define MAX_SUBCONTEXT_LEN              1024
@@ -56,6 +56,7 @@ typedef struct _i915XvMCContext {
 	unsigned int uvStride;
 	unsigned short ref;
 	unsigned int depth;
+	unsigned int use_phys_addr;
 	XvPortID port;		/* Xv Port ID when displaying */
 	int haveXv;		/* Have I initialized the Xv
 				 * connection for this surface? */
@@ -64,7 +65,6 @@ typedef struct _i915XvMCContext {
 	GC gc;			/* X GC needed for displaying */
 	Drawable draw;		/* Drawable to undisplay from */
 	void *drawHash;
-	int deviceID;
 
 	drm_intel_bo *sis_bo;
 	drm_intel_bo *msb_bo;
diff --git a/src/xvmc/intel_xvmc.c b/src/xvmc/intel_xvmc.c
index 328d3c1..ade2d7d 100644
--- a/src/xvmc/intel_xvmc.c
+++ b/src/xvmc/intel_xvmc.c
@@ -332,7 +332,7 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
 {
 	Status ret;
 	CARD32 *priv_data = NULL;
-	struct _intel_xvmc_common *comm;
+	struct intel_xvmc_hw_context *comm;
 	int major, minor;
 	int error_base;
 	int event_base;
@@ -392,7 +392,7 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
 	}
 	XVMC_DBG("new context %d created\n", (int)context->context_id);
 
-	comm = (struct _intel_xvmc_common *)priv_data;
+	comm = (struct intel_xvmc_hw_context *)priv_data;
 
 	if (xvmc_driver == NULL || xvmc_driver->type != comm->type) {
 		switch (comm->type) {
commit 8cab7b84da6d06c20ad9dbbcd8f3f3d971b438e7
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Tue Mar 9 14:02:23 2010 +0100

    XvMC: unify destroy context function
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index c52d8af..de2c5c7 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -208,12 +208,6 @@ static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
 	return Success;
 }
 
-static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
-				      XvMCContextPtr pContext)
-{
-	return;
-}
-
 static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
 			     int *num_priv, CARD32 ** priv)
 {
@@ -234,6 +228,10 @@ static void destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
 {
 }
 
+static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
+{
+}
+
 /* Fill in the device dependent adaptor record.
  * This is named "Intel(R) Textured Video" because this code falls under the
  * XV extenstion, the name must match or it won't be used.
@@ -249,8 +247,7 @@ static XF86MCAdaptorRec pAdapt = {
 	.subpictures = NULL,
 	.CreateContext =
 	    (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
-	.DestroyContext =
-	    (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
+	.DestroyContext = destroy_context,
 	.CreateSurface = create_surface,
 	.DestroySurface = destroy_surface,
 	.CreateSubpicture =  create_subpicture,
@@ -272,7 +269,7 @@ static int create_context(ScrnInfoPtr scrn,
 			  XvMCContextPtr context, int *num_privates,
 			  CARD32 ** private)
 {
-	struct i965_xvmc_context *private_context, *context_dup;
+	struct i965_xvmc_context *private_context;
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 
 	unsigned int blocknum =
@@ -284,11 +281,6 @@ static int create_context(ScrnInfoPtr scrn,
 		return BadAlloc;
 	}
 
-	if ((context_dup = Xcalloc(sizeof(*private_context))) == NULL) {
-		ErrorF("XVMC Can not allocate private context\n");
-		return BadAlloc;
-	}
-
 	private_context->is_g4x = IS_G4X(intel);
 	private_context->is_965_q = IS_965_Q(intel);
 	private_context->is_igdng = IS_IGDNG(intel);
@@ -296,19 +288,10 @@ static int create_context(ScrnInfoPtr scrn,
 
 	*num_privates = sizeof(*private_context) / sizeof(CARD32);
 	*private = (CARD32 *) private_context;
-	memcpy(context_dup, private_context, sizeof(*private_context));
-	context->driver_priv = context_dup;
 
 	return Success;
 }
 
-static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
-{
-	struct i965_xvmc_context *private_context;
-	private_context = context->driver_priv;
-	Xfree(private_context);
-}
-
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
commit 323464b8e2669423df573a18fd1137cb3cad6700
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 23:46:25 2010 +0100

    XvMC: clean up i830_hwmc.c
    
    - Drop unnecessary macros
    - Denote i965 specific stuff
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 37c1709..c52d8af 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -112,8 +112,6 @@ Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 }
 
 /* i915 hwmc support */
-#define _INTEL_XVMC_SERVER_
-
 static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
 	SURFACE_TYPE_MPEG2_MPML,
 	XVMC_CHROMA_FORMAT_420,
@@ -259,7 +257,6 @@ static XF86MCAdaptorRec pAdapt = {
 	.DestroySubpicture = destroy_subpicture,
 };
 
-/* new xvmc driver interface */
 struct intel_xvmc_driver i915_xvmc_driver = {
 	.name = "i915_xvmc",
 	.adaptor = &pAdapt,
@@ -267,10 +264,6 @@ struct intel_xvmc_driver i915_xvmc_driver = {
 };
 
 /* i965 and later hwmc support */
-#define STRIDE(w)               (w)
-#define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
-#define VLD_MAX_SLICE_LEN	(32*1024)
-
 #ifndef XVMC_VLD
 #define XVMC_VLD  0x00020000
 #endif
@@ -329,7 +322,7 @@ static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	NULL
 };
 
-static XF86MCSurfaceInfoRec yv12_mpeg2_surface = {
+static XF86MCSurfaceInfoRec yv12_mpeg2_i965_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
 	0,
@@ -344,7 +337,7 @@ static XF86MCSurfaceInfoRec yv12_mpeg2_surface = {
 	NULL
 };
 
-static XF86MCSurfaceInfoRec yv12_mpeg1_surface = {
+static XF86MCSurfaceInfoRec yv12_mpeg1_i965_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
 	0,
@@ -361,14 +354,14 @@ static XF86MCSurfaceInfoRec yv12_mpeg1_surface = {
 	NULL
 };
 
-static XF86MCSurfaceInfoPtr surface_info[] = {
-	&yv12_mpeg2_surface,
-	&yv12_mpeg1_surface
+static XF86MCSurfaceInfoPtr surface_info_i965[] = {
+	&yv12_mpeg2_i965_surface,
+	&yv12_mpeg1_i965_surface
 };
 
 static XF86MCSurfaceInfoPtr surface_info_vld[] = {
 	&yv12_mpeg2_vld_surface,
-	&yv12_mpeg2_surface,
+	&yv12_mpeg2_i965_surface,
 };
 
 static XF86MCAdaptorRec adaptor_vld = {
@@ -386,8 +379,8 @@ static XF86MCAdaptorRec adaptor_vld = {
 
 static XF86MCAdaptorRec adaptor = {
 	.name = "Intel(R) Textured Video",
-	.num_surfaces = sizeof(surface_info) / sizeof(surface_info[0]),
-	.surfaces = surface_info,
+	.num_surfaces = sizeof(surface_info_i965) / sizeof(surface_info_i965[0]),
+	.surfaces = surface_info_i965,
 
 	.CreateContext = create_context,
 	.DestroyContext = destroy_context,
commit cfa907adf800e91a3c1f4698ac701b9b83fa600b
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 23:41:56 2010 +0100

    XvMC: unify surface functions
    
    Like for the subpicture stuff, share the "do-nothing" functions ...
    And fix function name spelling, too.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index a55b7e6..37c1709 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -210,34 +210,12 @@ static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
 	return Success;
 }
 
-static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
-				    int *num_priv, long **priv)
-{
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-
-	if (!intel->XvMCEnabled) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: XvMC disabled!\n");
-		return BadAlloc;
-	}
-
-	*priv = NULL;
-	*num_priv = 0;
-
-	return Success;
-}
-
 static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
 				      XvMCContextPtr pContext)
 {
 	return;
 }
 
-static void i915_xvmc_destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf)
-{
-	return;
-}
-
 static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
 			     int *num_priv, CARD32 ** priv)
 {
@@ -248,6 +226,16 @@ static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
 {
 }
 
+static int create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface,
+			  int *num_priv, CARD32 ** priv)
+{
+	return Success;
+}
+
+static void destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
+{
+}
+
 /* Fill in the device dependent adaptor record.
  * This is named "Intel(R) Textured Video" because this code falls under the
  * XV extenstion, the name must match or it won't be used.
@@ -265,10 +253,8 @@ static XF86MCAdaptorRec pAdapt = {
 	    (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
 	.DestroyContext =
 	    (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
-	.CreateSurface =
-	    (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
-	.DestroySurface =
-	    (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
+	.CreateSurface = create_surface,
+	.DestroySurface = destroy_surface,
 	.CreateSubpicture =  create_subpicture,
 	.DestroySubpicture = destroy_subpicture,
 };
@@ -330,16 +316,6 @@ static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
 	Xfree(private_context);
 }
 
-static int create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface,
-			  int *num_priv, CARD32 ** priv)
-{
-	return Success;
-}
-
-static void destory_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
-{
-}
-
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
@@ -403,7 +379,7 @@ static XF86MCAdaptorRec adaptor_vld = {
 	.CreateContext = create_context,
 	.DestroyContext = destroy_context,
 	.CreateSurface = create_surface,
-	.DestroySurface = destory_surface,
+	.DestroySurface = destroy_surface,
 	.CreateSubpicture = create_subpicture,
 	.DestroySubpicture = destroy_subpicture
 };
@@ -416,7 +392,7 @@ static XF86MCAdaptorRec adaptor = {
 	.CreateContext = create_context,
 	.DestroyContext = destroy_context,
 	.CreateSurface = create_surface,
-	.DestroySurface = destory_surface,
+	.DestroySurface = destroy_surface,
 	.CreateSubpicture = create_subpicture,
 	.DestroySubpicture = destroy_subpicture
 };
commit 036cd4bb82131c08b79f596667f00b19a0c8ab79
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 17:33:18 2010 +0100

    i965 XvMC: don't create any surface state in the ddx
    
    Like for i915. Also drop that now totally superflous limit on the
    available surfaces.
    
    Move the surface struct into the userspace library header now that
    the ddx doesn't use it anymore.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 133518a..a55b7e6 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -114,10 +114,6 @@ Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 /* i915 hwmc support */
 #define _INTEL_XVMC_SERVER_
 
-#define I915_XVMC_MAX_BUFFERS 2
-#define I915_XVMC_MAX_CONTEXTS 4
-#define I915_XVMC_MAX_SURFACES 20
-
 static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
 	SURFACE_TYPE_MPEG2_MPML,
 	XVMC_CHROMA_FORMAT_420,
@@ -337,49 +333,11 @@ static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
 static int create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface,
 			  int *num_priv, CARD32 ** priv)
 {
-	XvMCContextPtr ctx = surface->context;
-
-	struct i965_xvmc_surface *priv_surface, *surface_dup;
-	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
-	int i;
-	for (i = 0; i < I965_MAX_SURFACES; i++) {
-		if (priv_ctx->surfaces[i] == NULL) {
-			priv_surface = Xcalloc(sizeof(*priv_surface));
-			if (priv_surface == NULL)
-				return BadAlloc;
-			surface_dup = Xcalloc(sizeof(*priv_surface));
-			if (surface_dup == NULL)
-				return BadAlloc;
-
-			priv_surface->no = i;
-			priv_surface->handle = priv_surface;
-			priv_surface->w = ctx->width;
-			priv_surface->h = ctx->height;
-			priv_ctx->surfaces[i] = surface->driver_priv
-			    = priv_surface;
-			memcpy(surface_dup, priv_surface,
-			       sizeof(*priv_surface));
-			*num_priv = sizeof(*priv_surface) / sizeof(CARD32);
-			*priv = (CARD32 *) surface_dup;
-			break;
-		}
-	}
-
-	if (i >= I965_MAX_SURFACES) {
-		ErrorF("I965 XVMC too many surfaces in one context\n");
-		return BadAlloc;
-	}
-
 	return Success;
 }
 
 static void destory_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
 {
-	XvMCContextPtr ctx = surface->context;
-	struct i965_xvmc_surface *priv_surface = surface->driver_priv;
-	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
-	priv_ctx->surfaces[priv_surface->no] = NULL;
-	Xfree(priv_surface);
 }
 
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
diff --git a/src/i965_hwmc.h b/src/i965_hwmc.h
index 194d07f..8b38867 100644
--- a/src/i965_hwmc.h
+++ b/src/i965_hwmc.h
@@ -1,15 +1,6 @@
 #define I965_MC_STATIC_BUFFER_SIZE	(1024*512)
-#define I965_MAX_SURFACES		12
-struct i965_xvmc_surface {
-	int w, h;
-	unsigned int no;
-	void *handle;
-	dri_bo *bo;
-};
-
 struct i965_xvmc_context {
 	struct _intel_xvmc_common comm;
-	struct i965_xvmc_surface *surfaces[I965_MAX_SURFACES];
 	unsigned int is_g4x:1;
 	unsigned int is_965_q:1;
 	unsigned int is_igdng:1;
diff --git a/src/xvmc/i965_xvmc.c b/src/xvmc/i965_xvmc.c
index 3de6054..417c32e 100644
--- a/src/xvmc/i965_xvmc.c
+++ b/src/xvmc/i965_xvmc.c
@@ -256,12 +256,18 @@ static Status create_surface(Display * display,
 			     XvMCContext * context, XvMCSurface * surface,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_surface *priv_surface =
-	    (struct i965_xvmc_surface *)priv_data;
-	size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
-	surface->privData = priv_data;
+	struct i965_xvmc_surface *priv_surface = malloc(sizeof(struct i965_xvmc_surface));
+
+	if (!priv_surface)
+		return BadAlloc;
+
+	size_t size = SIZE_YUV420(context->width, context->height);
+	surface->privData = priv_surface;
 	priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
 					      size, 0x1000);
+
+	Xfree(priv_data);
+
 	return Success;
 }
 
@@ -269,8 +275,8 @@ static Status destroy_surface(Display * display, XvMCSurface * surface)
 {
 	struct i965_xvmc_surface *priv_surface = surface->privData;
 	XSync(display, False);
-
 	drm_intel_bo_unreference(priv_surface->bo);
+	free(priv_surface);
 	return Success;
 }
 
diff --git a/src/xvmc/i965_xvmc.h b/src/xvmc/i965_xvmc.h
index ed201c8..5846268 100644
--- a/src/xvmc/i965_xvmc.h
+++ b/src/xvmc/i965_xvmc.h
@@ -1 +1,6 @@
 #include "intel_xvmc.h"
+
+#define I965_MAX_SURFACES		12
+struct i965_xvmc_surface {
+	dri_bo *bo;
+};
diff --git a/src/xvmc/xvmc_vld.c b/src/xvmc/xvmc_vld.c
index bea1ec7..8e8d4d6 100644
--- a/src/xvmc/xvmc_vld.c
+++ b/src/xvmc/xvmc_vld.c
@@ -620,13 +620,18 @@ static Status create_surface(Display * display,
 			     XvMCContext * context, XvMCSurface * surface,
 			     int priv_count, CARD32 * priv_data)
 {
-	struct i965_xvmc_surface *priv_surface =
-	    (struct i965_xvmc_surface *)priv_data;
-	size_t size = SIZE_YUV420(priv_surface->w, priv_surface->h);
-	surface->privData = priv_data;
+	struct i965_xvmc_surface *priv_surface = malloc(sizeof(struct i965_xvmc_surface));
+
+	if (!priv_surface)
+		return BadAlloc;
+
+	size_t size = SIZE_YUV420(context->width, context->height);
+	surface->privData = priv_surface;
 	priv_surface->bo = drm_intel_bo_alloc(xvmc_driver->bufmgr, "surface",
 					      size, 0x1000);
 
+	Xfree(priv_data);
+
 	return Success;
 }
 
@@ -635,6 +640,7 @@ static Status destroy_surface(Display * display, XvMCSurface * surface)
 	struct i965_xvmc_surface *priv_surface = surface->privData;
 	XSync(display, False);
 	drm_intel_bo_unreference(priv_surface->bo);
+	free(priv_surface);
 	return Success;
 }
 
commit 69218cc1b51acfee91b471bb973a4419b79cdd85
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 17:05:25 2010 +0100

    XvMC: unify subpicture functions
    
    The XvMC driver api in the server is insane. Even for optional stuff
    like subpicture support it doesn't check for NULL-pointers. So we
    have to retain some dummy functions.
    
    Wonder how many copies of these things exist on fdo ...
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 0c21b8e..133518a 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -231,15 +231,6 @@ static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
 	return Success;
 }
 
-static int i915_xvmc_create_subpict(ScrnInfoPtr scrn, XvMCSubpicturePtr pSubp,
-				    int *num_priv, long **priv)
-{
-	*priv = NULL;
-	*num_priv = 0;
-
-	return Success;
-}
-
 static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
 				      XvMCContextPtr pContext)
 {
@@ -251,10 +242,14 @@ static void i915_xvmc_destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf)
 	return;
 }
 
-static void i915_xvmc_destroy_subpict(ScrnInfoPtr scrn,
-				      XvMCSubpicturePtr pSubp)
+static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
+			     int *num_priv, CARD32 ** priv)
+{
+	return Success;
+}
+
+static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
 {
-	return;
 }
 
 /* Fill in the device dependent adaptor record.
@@ -278,10 +273,8 @@ static XF86MCAdaptorRec pAdapt = {
 	    (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
 	.DestroySurface =
 	    (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
-	.CreateSubpicture =
-	    (xf86XvMCCreateSubpictureProcPtr) i915_xvmc_create_subpict,
-	.DestroySubpicture =
-	    (xf86XvMCDestroySubpictureProcPtr) i915_xvmc_destroy_subpict,
+	.CreateSubpicture =  create_subpicture,
+	.DestroySubpicture = destroy_subpicture,
 };
 
 /* new xvmc driver interface */
@@ -389,16 +382,6 @@ static void destory_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
 	Xfree(priv_surface);
 }
 
-static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
-			     int *num_priv, CARD32 ** priv)
-{
-	return Success;
-}
-
-static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
-{
-}
-
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
commit 5d104e9c5cd5cd2d34c9035dd38794fa9b5578f3
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 17:03:36 2010 +0100

    XvMC: unify PutImage handling
    
    Both xvmc are handing in the bo in the exact same way. So move the code
    to src/i830_video.c and kill this great oeuvre of spaghetti-code.
    
    The xvmc driver ini and fini also lost their last use, kill them, too.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 22e8472..95b02f3 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1340,11 +1340,6 @@ static void i830AdjustFrame(int scrnIndex, int x, int y, int flags)
 static void I830FreeScreen(int scrnIndex, int flags)
 {
 	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
-#ifdef INTEL_XVMC
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	if (intel && intel->XvMCEnabled)
-		intel_xvmc_finish(xf86Screens[scrnIndex]);
-#endif
 
 	i830_close_drm_master(scrn);
 
diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 18b1328..0c21b8e 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -80,33 +80,6 @@ Bool intel_xvmc_probe(ScrnInfoPtr scrn)
 	return TRUE;
 }
 
-void intel_xvmc_finish(ScrnInfoPtr scrn)
-{
-	if (!xvmc_driver)
-		return;
-	(*xvmc_driver->fini) (scrn);
-}
-
-Bool intel_xvmc_driver_init(ScreenPtr pScreen, XF86VideoAdaptorPtr xv_adaptor)
-{
-	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	struct drm_i915_setparam sp;
-	int ret;
-
-	if (!xvmc_driver) {
-		ErrorF("Failed to probe XvMC driver.\n");
-		return FALSE;
-	}
-
-	if (!(*xvmc_driver->init) (scrn, xv_adaptor)) {
-		ErrorF("XvMC driver initialize failed.\n");
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
 Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 {
 	ScrnInfoPtr scrn = xf86Screens[pScreen->myNum];
@@ -121,7 +94,6 @@ Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 			   "[XvMC] %s driver initialized.\n",
 			   xvmc_driver->name);
 	} else {
-		intel_xvmc_finish(scrn);
 		intel->XvMCEnabled = FALSE;
 		xf86DrvMsg(scrn->scrnIndex, X_INFO,
 			   "[XvMC] Failed to initialize XvMC.\n");
@@ -146,10 +118,6 @@ Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 #define I915_XVMC_MAX_CONTEXTS 4
 #define I915_XVMC_MAX_SURFACES 20
 
-typedef struct _I915XvMC {
-	PutImageFuncPtr savePutImage;
-} I915XvMC, *I915XvMCPtr;
-
 static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
 	SURFACE_TYPE_MPEG2_MPML,
 	XVMC_CHROMA_FORMAT_420,
@@ -289,52 +257,6 @@ static void i915_xvmc_destroy_subpict(ScrnInfoPtr scrn,
 	return;
 }
 
-static int i915_xvmc_put_image(ScrnInfoPtr scrn,
-			       short src_x, short src_y,
-			       short drw_x, short drw_y, short src_w,
-			       short src_h, short drw_w, short drw_h,
-			       int id, unsigned char *buf, short width,
-			       short height, Bool sync, RegionPtr clipBoxes,
-			       pointer data, DrawablePtr pDraw)
-{
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf;
-	int ret;
-
-	if (FOURCC_XVMC == id) {
-		/* Pass the GEM object name through the pointer arg. */
-		buf = (void *)(uintptr_t)xvmc_cmd->handle;
-	}
-
-	ret =
-	    pXvMC->savePutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
-				drw_w, drw_h, id, buf, width, height, sync,
-				clipBoxes, data, pDraw);
-	return ret;
-}
-
-static Bool i915_xvmc_init(ScrnInfoPtr scrn, XF86VideoAdaptorPtr XvAdapt)
-{
-	I915XvMCPtr pXvMC;
-
-	pXvMC = (I915XvMCPtr) xcalloc(1, sizeof(I915XvMC));
-	if (!pXvMC) {
-		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
-			   "[XvMC] alloc driver private failed!\n");
-		return FALSE;
-	}
-	xvmc_driver->devPrivate = (void *)pXvMC;
-	/* set up wrappers */
-	pXvMC->savePutImage = XvAdapt->PutImage;
-	XvAdapt->PutImage = i915_xvmc_put_image;
-	return TRUE;
-}
-
-static void i915_xvmc_fini(ScrnInfoPtr scrn)
-{
-	xfree(xvmc_driver->devPrivate);
-}
-
 /* Fill in the device dependent adaptor record.
  * This is named "Intel(R) Textured Video" because this code falls under the
  * XV extenstion, the name must match or it won't be used.
@@ -367,8 +289,6 @@ struct intel_xvmc_driver i915_xvmc_driver = {
 	.name = "i915_xvmc",
 	.adaptor = &pAdapt,
 	.flag = XVMC_I915_MPEG2_MC,
-	.init = i915_xvmc_init,
-	.fini = i915_xvmc_fini,
 };
 
 /* i965 and later hwmc support */
@@ -380,8 +300,6 @@ struct intel_xvmc_driver i915_xvmc_driver = {
 #define XVMC_VLD  0x00020000
 #endif
 
-static PutImageFuncPtr savedXvPutImage;
-
 static int create_context(ScrnInfoPtr scrn,
 			  XvMCContextPtr context, int *num_privates,
 			  CARD32 ** private)
@@ -481,41 +399,6 @@ static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
 {
 }
 
-static int put_image(ScrnInfoPtr scrn,
-		     short src_x, short src_y,
-		     short drw_x, short drw_y, short src_w,
-		     short src_h, short drw_w, short drw_h,
-		     int id, unsigned char *buf, short width,
-		     short height, Bool sync, RegionPtr clipBoxes, pointer data,
-		     DrawablePtr drawable)
-{
-	struct intel_xvmc_command *cmd = (struct intel_xvmc_command *)buf;
-
-	if (id == FOURCC_XVMC) {
-		/* Pass the GEM object name through the pointer arg. */
-		buf = (void *)(uintptr_t)cmd->handle;
-	}
-
-	savedXvPutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
-			drw_w, drw_h, id, buf,
-			width, height, sync, clipBoxes,
-			data, drawable);
-
-	return Success;
-}
-
-static Bool init(ScrnInfoPtr screen_info, XF86VideoAdaptorPtr adaptor)
-{
-	savedXvPutImage = adaptor->PutImage;
-	adaptor->PutImage = put_image;
-
-	return TRUE;
-}
-
-static void fini(ScrnInfoPtr screen_info)
-{
-}
-
 static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
 	FOURCC_YV12,
 	XVMC_CHROMA_FORMAT_420,
@@ -601,14 +484,10 @@ struct intel_xvmc_driver i965_xvmc_driver = {
 	.name = "i965_xvmc",
 	.adaptor = &adaptor,
 	.flag = XVMC_I965_MPEG2_MC,
-	.init = init,
-	.fini = fini
 };
 
 struct intel_xvmc_driver vld_xvmc_driver = {
 	.name = "xvmc_vld",
 	.adaptor = &adaptor_vld,
 	.flag = XVMC_I965_MPEG2_VLD,
-	.init = init,
-	.fini = fini
 };
diff --git a/src/i830_hwmc.h b/src/i830_hwmc.h
index fcb54d4..599b5be 100644
--- a/src/i830_hwmc.h
+++ b/src/i830_hwmc.h
@@ -86,8 +86,6 @@ struct intel_xvmc_driver {
 	XF86MCAdaptorPtr adaptor;
 	unsigned int flag;
 	/* more items for xvmv surface manage? */
-	 Bool(*init) (ScrnInfoPtr, XF86VideoAdaptorPtr);
-	void (*fini) (ScrnInfoPtr);
 	void *devPrivate;
 };
 
@@ -97,9 +95,7 @@ extern struct intel_xvmc_driver i965_xvmc_driver;
 extern struct intel_xvmc_driver vld_xvmc_driver;
 
 extern Bool intel_xvmc_probe(ScrnInfoPtr);
-extern Bool intel_xvmc_driver_init(ScreenPtr, XF86VideoAdaptorPtr);
 extern Bool intel_xvmc_screen_init(ScreenPtr);
-extern void intel_xvmc_finish(ScrnInfoPtr);
 #endif
 
 #endif
diff --git a/src/i830_video.c b/src/i830_video.c
index db72863..c2a02b5 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -406,11 +406,8 @@ void I830InitVideo(ScreenPtr screen)
 		adaptors[num_adaptors++] = overlayAdaptor;
 
 #ifdef INTEL_XVMC
-	if (intel_xvmc_probe(scrn)) {
-		if (texturedAdaptor)
-			xvmc_status =
-			    intel_xvmc_driver_init(screen, texturedAdaptor);
-	}
+	if (intel_xvmc_probe(scrn))
+		xvmc_status = TRUE;
 #endif
 
 	if (num_adaptors) {
@@ -422,7 +419,7 @@ void I830InitVideo(ScreenPtr screen)
 	}
 
 #ifdef INTEL_XVMC
-	if (xvmc_status)
+	if (xvmc_status && texturedAdaptor)
 		intel_xvmc_screen_init(screen);
 #endif
 	xfree(adaptors);
@@ -1507,6 +1504,9 @@ I830PutImageTextured(ScrnInfoPtr scrn,
 
 	if (xvmc_passthrough(id)) {
 		int size;
+		struct intel_xvmc_command *cmd
+			= (struct intel_xvmc_command *)buf;
+
 		i830_free_video_buffers(adaptor_priv);
 
 		i830_setup_dst_params(scrn, adaptor_priv, width, height,
@@ -1521,7 +1521,7 @@ I830PutImageTextured(ScrnInfoPtr scrn,
 		adaptor_priv->buf =
 			drm_intel_bo_gem_create_from_name(intel->bufmgr,
 							  "xvmc surface",
-							  (uintptr_t)buf);
+							  cmd->handle);
 	} else {
 		if (!i830_copy_video_data(scrn, adaptor_priv, width, height,
 					  &dstPitch, &dstPitch2,
commit ebc0ffba79cc4bd564a8bd97327f24a1d15b3d1a
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Mon Mar 8 16:36:24 2010 +0100

    XvMC: merge *_hwmc.c into i830_hwmc.c
    
    After unifying i915 and i965, not much will be left of these files.
    Therefore merge them to make the following changes easier.
    
    This creates some warnings about some redefined macros, but when this
    is all cleaned up they'll all be gone.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/Makefile.am b/src/Makefile.am
index b4bafbd..3ea7fec 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -44,9 +44,7 @@ INTEL_DRI_SRCS = \
 INTEL_XVMC_SRCS = \
 	 i830_hwmc.h \
 	 i830_hwmc.c \
-         i915_hwmc.c \
          i915_hwmc.h \
-         i965_hwmc.c \
          i965_hwmc.h
 
 intel_drv_la_SOURCES = \
diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index aed632b..18b1328 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -30,7 +30,14 @@
 
 #define _INTEL_XVMC_SERVER_
 #include "i830.h"
+#include "intel_bufmgr.h"
 #include "i830_hwmc.h"
+#include "i915_hwmc.h"
+#include "i965_hwmc.h"
+
+#include <X11/extensions/Xv.h>
+#include <X11/extensions/XvMC.h>
+#include <fourcc.h>
 
 struct intel_xvmc_driver *xvmc_driver;
 
@@ -131,3 +138,477 @@ Bool intel_xvmc_screen_init(ScreenPtr pScreen)
 			       INTEL_XVMC_PATCHLEVEL);
 	return TRUE;
 }
+
+/* i915 hwmc support */
+#define _INTEL_XVMC_SERVER_
+
+#define I915_XVMC_MAX_BUFFERS 2
+#define I915_XVMC_MAX_CONTEXTS 4
+#define I915_XVMC_MAX_SURFACES 20
+
+typedef struct _I915XvMC {
+	PutImageFuncPtr savePutImage;
+} I915XvMC, *I915XvMCPtr;
+
+static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
+	SURFACE_TYPE_MPEG2_MPML,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	720,
+	576,
+	720,
+	576,
+	XVMC_MPEG_2,
+	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+	0,
+	/* &yv12_subpicture_list */
+	NULL,
+};
+
+static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
+	SURFACE_TYPE_MPEG1_MPML,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	720,
+	576,
+	720,
+	576,
+	XVMC_MPEG_1,
+	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+	0,
+	NULL,
+};
+
+static XF86MCSurfaceInfoPtr ppSI[2] = {
+	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface,
+	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
+};
+
+/* Check context size not exceed surface type max */
+static void i915_check_context_size(XvMCContextPtr ctx)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(ppSI); i++) {
+		if (ctx->surface_type_id == ppSI[i]->surface_type_id) {
+			if (ctx->width > ppSI[i]->max_width)
+				ctx->width = ppSI[i]->max_width;
+			if (ctx->height > ppSI[i]->max_height)
+				ctx->height = ppSI[i]->max_height;
+		}
+	}
+}
+
+/*
+ *  i915_xvmc_create_context
+ *
+ *  Some info about the private data:
+ *
+ *  Set *num_priv to the number of 32bit words that make up the size of
+ *  of the data that priv will point to.
+ *
+ *  *priv = (long *) xcalloc (elements, sizeof(element))
+ *  *num_priv = (elements * sizeof(element)) >> 2;
+ *
+ **************************************************************************/
+
+static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
+				    int *num_priv, long **priv)
+{
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+	I915XvMCCreateContextRec *contextRec = NULL;
+
+	*priv = NULL;
+	*num_priv = 0;
+
+	if (!intel->XvMCEnabled) {
+		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+			   "[XvMC] i915: XvMC disabled!\n");
+		return BadAlloc;
+	}
+
+	i915_check_context_size(pContext);
+
+	*priv = xcalloc(1, sizeof(I915XvMCCreateContextRec));
+	contextRec = (I915XvMCCreateContextRec *) * priv;
+
+	if (!*priv) {
+		*num_priv = 0;
+		return BadAlloc;
+	}
+
+	*num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
+
+	contextRec->comm.type = xvmc_driver->flag;
+	/* i915 private context */
+	contextRec->deviceID = DEVICE_ID(intel->PciInfo);
+
+	return Success;
+}
+
+static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
+				    int *num_priv, long **priv)
+{
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+
+	if (!intel->XvMCEnabled) {
+		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+			   "[XvMC] i915: XvMC disabled!\n");
+		return BadAlloc;
+	}
+
+	*priv = NULL;
+	*num_priv = 0;
+
+	return Success;
+}
+
+static int i915_xvmc_create_subpict(ScrnInfoPtr scrn, XvMCSubpicturePtr pSubp,
+				    int *num_priv, long **priv)
+{
+	*priv = NULL;
+	*num_priv = 0;
+
+	return Success;
+}
+
+static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
+				      XvMCContextPtr pContext)
+{
+	return;
+}
+
+static void i915_xvmc_destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf)
+{
+	return;
+}
+
+static void i915_xvmc_destroy_subpict(ScrnInfoPtr scrn,
+				      XvMCSubpicturePtr pSubp)
+{
+	return;
+}
+
+static int i915_xvmc_put_image(ScrnInfoPtr scrn,
+			       short src_x, short src_y,
+			       short drw_x, short drw_y, short src_w,
+			       short src_h, short drw_w, short drw_h,
+			       int id, unsigned char *buf, short width,
+			       short height, Bool sync, RegionPtr clipBoxes,
+			       pointer data, DrawablePtr pDraw)
+{
+	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
+	struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf;
+	int ret;
+
+	if (FOURCC_XVMC == id) {
+		/* Pass the GEM object name through the pointer arg. */
+		buf = (void *)(uintptr_t)xvmc_cmd->handle;
+	}
+
+	ret =
+	    pXvMC->savePutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
+				drw_w, drw_h, id, buf, width, height, sync,
+				clipBoxes, data, pDraw);
+	return ret;
+}
+
+static Bool i915_xvmc_init(ScrnInfoPtr scrn, XF86VideoAdaptorPtr XvAdapt)
+{
+	I915XvMCPtr pXvMC;
+
+	pXvMC = (I915XvMCPtr) xcalloc(1, sizeof(I915XvMC));
+	if (!pXvMC) {
+		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+			   "[XvMC] alloc driver private failed!\n");
+		return FALSE;
+	}
+	xvmc_driver->devPrivate = (void *)pXvMC;
+	/* set up wrappers */
+	pXvMC->savePutImage = XvAdapt->PutImage;
+	XvAdapt->PutImage = i915_xvmc_put_image;
+	return TRUE;
+}
+
+static void i915_xvmc_fini(ScrnInfoPtr scrn)
+{
+	xfree(xvmc_driver->devPrivate);
+}
+
+/* Fill in the device dependent adaptor record.
+ * This is named "Intel(R) Textured Video" because this code falls under the
+ * XV extenstion, the name must match or it won't be used.
+ *
+ * Surface and Subpicture - see above
+ * Function pointers to functions below
+ */
+static XF86MCAdaptorRec pAdapt = {
+	.name = "Intel(R) Textured Video",
+	.num_surfaces = ARRAY_SIZE(ppSI),
+	.surfaces = ppSI,
+	.num_subpictures = 0,
+	.subpictures = NULL,
+	.CreateContext =
+	    (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
+	.DestroyContext =
+	    (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
+	.CreateSurface =
+	    (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
+	.DestroySurface =
+	    (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
+	.CreateSubpicture =
+	    (xf86XvMCCreateSubpictureProcPtr) i915_xvmc_create_subpict,
+	.DestroySubpicture =
+	    (xf86XvMCDestroySubpictureProcPtr) i915_xvmc_destroy_subpict,
+};
+
+/* new xvmc driver interface */
+struct intel_xvmc_driver i915_xvmc_driver = {
+	.name = "i915_xvmc",
+	.adaptor = &pAdapt,
+	.flag = XVMC_I915_MPEG2_MC,
+	.init = i915_xvmc_init,
+	.fini = i915_xvmc_fini,
+};
+
+/* i965 and later hwmc support */
+#define STRIDE(w)               (w)
+#define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
+#define VLD_MAX_SLICE_LEN	(32*1024)
+
+#ifndef XVMC_VLD
+#define XVMC_VLD  0x00020000
+#endif
+
+static PutImageFuncPtr savedXvPutImage;
+
+static int create_context(ScrnInfoPtr scrn,
+			  XvMCContextPtr context, int *num_privates,
+			  CARD32 ** private)
+{
+	struct i965_xvmc_context *private_context, *context_dup;
+	intel_screen_private *intel = intel_get_screen_private(scrn);
+
+	unsigned int blocknum =
+	    (((context->width + 15) / 16) * ((context->height + 15) / 16));
+	unsigned int blocksize = 6 * blocknum * 64 * sizeof(short);
+	blocksize = (blocksize + 4095) & (~4095);
+	if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
+		ErrorF("XVMC Can not allocate private context\n");
+		return BadAlloc;
+	}
+
+	if ((context_dup = Xcalloc(sizeof(*private_context))) == NULL) {
+		ErrorF("XVMC Can not allocate private context\n");
+		return BadAlloc;
+	}
+
+	private_context->is_g4x = IS_G4X(intel);
+	private_context->is_965_q = IS_965_Q(intel);
+	private_context->is_igdng = IS_IGDNG(intel);
+	private_context->comm.type = xvmc_driver->flag;
+
+	*num_privates = sizeof(*private_context) / sizeof(CARD32);
+	*private = (CARD32 *) private_context;
+	memcpy(context_dup, private_context, sizeof(*private_context));
+	context->driver_priv = context_dup;
+
+	return Success;
+}
+
+static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
+{
+	struct i965_xvmc_context *private_context;
+	private_context = context->driver_priv;
+	Xfree(private_context);
+}
+
+static int create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface,
+			  int *num_priv, CARD32 ** priv)
+{
+	XvMCContextPtr ctx = surface->context;
+
+	struct i965_xvmc_surface *priv_surface, *surface_dup;
+	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
+	int i;
+	for (i = 0; i < I965_MAX_SURFACES; i++) {
+		if (priv_ctx->surfaces[i] == NULL) {
+			priv_surface = Xcalloc(sizeof(*priv_surface));
+			if (priv_surface == NULL)
+				return BadAlloc;
+			surface_dup = Xcalloc(sizeof(*priv_surface));
+			if (surface_dup == NULL)
+				return BadAlloc;
+
+			priv_surface->no = i;
+			priv_surface->handle = priv_surface;
+			priv_surface->w = ctx->width;
+			priv_surface->h = ctx->height;
+			priv_ctx->surfaces[i] = surface->driver_priv
+			    = priv_surface;
+			memcpy(surface_dup, priv_surface,
+			       sizeof(*priv_surface));
+			*num_priv = sizeof(*priv_surface) / sizeof(CARD32);
+			*priv = (CARD32 *) surface_dup;
+			break;
+		}
+	}
+
+	if (i >= I965_MAX_SURFACES) {
+		ErrorF("I965 XVMC too many surfaces in one context\n");
+		return BadAlloc;
+	}
+
+	return Success;
+}
+
+static void destory_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
+{
+	XvMCContextPtr ctx = surface->context;
+	struct i965_xvmc_surface *priv_surface = surface->driver_priv;
+	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
+	priv_ctx->surfaces[priv_surface->no] = NULL;
+	Xfree(priv_surface);
+}
+
+static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
+			     int *num_priv, CARD32 ** priv)
+{
+	return Success;
+}
+
+static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
+{
+}
+
+static int put_image(ScrnInfoPtr scrn,
+		     short src_x, short src_y,
+		     short drw_x, short drw_y, short src_w,
+		     short src_h, short drw_w, short drw_h,
+		     int id, unsigned char *buf, short width,
+		     short height, Bool sync, RegionPtr clipBoxes, pointer data,
+		     DrawablePtr drawable)
+{
+	struct intel_xvmc_command *cmd = (struct intel_xvmc_command *)buf;
+
+	if (id == FOURCC_XVMC) {
+		/* Pass the GEM object name through the pointer arg. */
+		buf = (void *)(uintptr_t)cmd->handle;
+	}
+
+	savedXvPutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
+			drw_w, drw_h, id, buf,
+			width, height, sync, clipBoxes,
+			data, drawable);
+
+	return Success;
+}
+
+static Bool init(ScrnInfoPtr screen_info, XF86VideoAdaptorPtr adaptor)
+{
+	savedXvPutImage = adaptor->PutImage;
+	adaptor->PutImage = put_image;
+
+	return TRUE;
+}
+
+static void fini(ScrnInfoPtr screen_info)
+{
+}
+
+static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
+	FOURCC_YV12,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	1936,
+	1096,
+	1920,
+	1080,
+	XVMC_MPEG_2 | XVMC_VLD,
+	XVMC_INTRA_UNSIGNED,
+	NULL
+};
+
+static XF86MCSurfaceInfoRec yv12_mpeg2_surface = {
+	FOURCC_YV12,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	1936,
+	1096,
+	1920,
+	1080,
+	XVMC_MPEG_2 | XVMC_MOCOMP,
+	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
+	XVMC_INTRA_UNSIGNED,
+	/* &yv12_subpicture_list */
+	NULL
+};
+
+static XF86MCSurfaceInfoRec yv12_mpeg1_surface = {
+	FOURCC_YV12,
+	XVMC_CHROMA_FORMAT_420,
+	0,
+	1920,
+	1080,
+	1920,
+	1080,
+	XVMC_MPEG_1 | XVMC_MOCOMP,
+	/*XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING |
+	   XVMC_INTRA_UNSIGNED, */
+	XVMC_INTRA_UNSIGNED,
+
+	/*&yv12_subpicture_list */
+	NULL
+};
+
+static XF86MCSurfaceInfoPtr surface_info[] = {
+	&yv12_mpeg2_surface,
+	&yv12_mpeg1_surface
+};
+
+static XF86MCSurfaceInfoPtr surface_info_vld[] = {
+	&yv12_mpeg2_vld_surface,
+	&yv12_mpeg2_surface,
+};
+
+static XF86MCAdaptorRec adaptor_vld = {
+	.name = "Intel(R) Textured Video",
+	.num_surfaces = sizeof(surface_info_vld) / sizeof(surface_info_vld[0]),
+	.surfaces = surface_info_vld,
+
+	.CreateContext = create_context,
+	.DestroyContext = destroy_context,
+	.CreateSurface = create_surface,
+	.DestroySurface = destory_surface,
+	.CreateSubpicture = create_subpicture,
+	.DestroySubpicture = destroy_subpicture
+};
+
+static XF86MCAdaptorRec adaptor = {
+	.name = "Intel(R) Textured Video",
+	.num_surfaces = sizeof(surface_info) / sizeof(surface_info[0]),
+	.surfaces = surface_info,
+
+	.CreateContext = create_context,
+	.DestroyContext = destroy_context,
+	.CreateSurface = create_surface,
+	.DestroySurface = destory_surface,
+	.CreateSubpicture = create_subpicture,
+	.DestroySubpicture = destroy_subpicture
+};
+
+struct intel_xvmc_driver i965_xvmc_driver = {
+	.name = "i965_xvmc",
+	.adaptor = &adaptor,
+	.flag = XVMC_I965_MPEG2_MC,
+	.init = init,
+	.fini = fini
+};
+
+struct intel_xvmc_driver vld_xvmc_driver = {
+	.name = "xvmc_vld",
+	.adaptor = &adaptor_vld,
+	.flag = XVMC_I965_MPEG2_VLD,
+	.init = init,
+	.fini = fini
+};
diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c
deleted file mode 100644
index 40ee507..0000000
--- a/src/i915_hwmc.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright © 2006 Intel Corporation
- *
- * 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.
- *
- * Authors:
- *    Xiang Haihao <haihao.xiang at intel.com>
- *
- */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-
-#include "xf86.h"
-#include "xf86_OSproc.h"
-#include "compiler.h"
-#include "xf86PciInfo.h"
-#include "xf86Pci.h"
-#include "xf86fbman.h"
-#include "regionstr.h"
-
-#include "i830.h"
-#include "i830_video.h"
-#include "xf86xv.h"
-#include "xf86xvmc.h"
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/XvMC.h>
-#include "xaa.h"
-#include "xaalocal.h"
-#include "dixstruct.h"
-#include "fourcc.h"
-
-#if defined(X_NEED_XVPRIV_H) || defined (_XF86_FOURCC_H_)
-#include "xf86xvpriv.h"
-#endif
-
-#define _INTEL_XVMC_SERVER_
-#include "i915_hwmc.h"
-
-#define I915_XVMC_MAX_BUFFERS 2
-#define I915_XVMC_MAX_CONTEXTS 4
-#define I915_XVMC_MAX_SURFACES 20
-
-typedef struct _I915XvMC {
-	PutImageFuncPtr savePutImage;
-} I915XvMC, *I915XvMCPtr;
-
-static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
-	SURFACE_TYPE_MPEG2_MPML,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	720,
-	576,
-	720,
-	576,
-	XVMC_MPEG_2,
-	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
-	0,
-	/* &yv12_subpicture_list */
-	NULL,
-};
-
-static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
-	SURFACE_TYPE_MPEG1_MPML,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	720,
-	576,
-	720,
-	576,
-	XVMC_MPEG_1,
-	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
-	0,
-	NULL,
-};
-
-static XF86MCSurfaceInfoPtr ppSI[2] = {
-	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface,
-	(XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface
-};
-
-/* Check context size not exceed surface type max */
-static void i915_check_context_size(XvMCContextPtr ctx)
-{
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(ppSI); i++) {
-		if (ctx->surface_type_id == ppSI[i]->surface_type_id) {
-			if (ctx->width > ppSI[i]->max_width)
-				ctx->width = ppSI[i]->max_width;
-			if (ctx->height > ppSI[i]->max_height)
-				ctx->height = ppSI[i]->max_height;
-		}
-	}
-}
-
-/*
- *  i915_xvmc_create_context
- *
- *  Some info about the private data:
- *
- *  Set *num_priv to the number of 32bit words that make up the size of
- *  of the data that priv will point to.
- *
- *  *priv = (long *) xcalloc (elements, sizeof(element))
- *  *num_priv = (elements * sizeof(element)) >> 2;
- *
- **************************************************************************/
-
-static int i915_xvmc_create_context(ScrnInfoPtr scrn, XvMCContextPtr pContext,
-				    int *num_priv, long **priv)
-{
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-	I915XvMCCreateContextRec *contextRec = NULL;
-
-	*priv = NULL;
-	*num_priv = 0;
-
-	if (!intel->XvMCEnabled) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: XvMC disabled!\n");
-		return BadAlloc;
-	}
-
-	i915_check_context_size(pContext);
-
-	*priv = xcalloc(1, sizeof(I915XvMCCreateContextRec));
-	contextRec = (I915XvMCCreateContextRec *) * priv;
-
-	if (!*priv) {
-		*num_priv = 0;
-		return BadAlloc;
-	}
-
-	*num_priv = sizeof(I915XvMCCreateContextRec) >> 2;
-
-	contextRec->comm.type = xvmc_driver->flag;
-	/* i915 private context */
-	contextRec->deviceID = DEVICE_ID(intel->PciInfo);
-
-	return Success;
-}
-
-static int i915_xvmc_create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf,
-				    int *num_priv, long **priv)
-{
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-
-	if (!intel->XvMCEnabled) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[XvMC] i915: XvMC disabled!\n");
-		return BadAlloc;
-	}
-
-	*priv = NULL;
-	*num_priv = 0;
-
-	return Success;
-}
-
-static int i915_xvmc_create_subpict(ScrnInfoPtr scrn, XvMCSubpicturePtr pSubp,
-				    int *num_priv, long **priv)
-{
-	*priv = NULL;
-	*num_priv = 0;
-
-	return Success;
-}
-
-static void i915_xvmc_destroy_context(ScrnInfoPtr scrn,
-				      XvMCContextPtr pContext)
-{
-	return;
-}
-
-static void i915_xvmc_destroy_surface(ScrnInfoPtr scrn, XvMCSurfacePtr pSurf)
-{
-	return;
-}
-
-static void i915_xvmc_destroy_subpict(ScrnInfoPtr scrn,
-				      XvMCSubpicturePtr pSubp)
-{
-	return;
-}
-
-static int i915_xvmc_put_image(ScrnInfoPtr scrn,
-			       short src_x, short src_y,
-			       short drw_x, short drw_y, short src_w,
-			       short src_h, short drw_w, short drw_h,
-			       int id, unsigned char *buf, short width,
-			       short height, Bool sync, RegionPtr clipBoxes,
-			       pointer data, DrawablePtr pDraw)
-{
-	I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate;
-	struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf;
-	int ret;
-
-	if (FOURCC_XVMC == id) {
-		/* Pass the GEM object name through the pointer arg. */
-		buf = (void *)(uintptr_t)xvmc_cmd->handle;
-	}
-
-	ret =
-	    pXvMC->savePutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
-				drw_w, drw_h, id, buf, width, height, sync,
-				clipBoxes, data, pDraw);
-	return ret;
-}
-
-static Bool i915_xvmc_init(ScrnInfoPtr scrn, XF86VideoAdaptorPtr XvAdapt)
-{
-	I915XvMCPtr pXvMC;
-
-	pXvMC = (I915XvMCPtr) xcalloc(1, sizeof(I915XvMC));
-	if (!pXvMC) {
-		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
-			   "[XvMC] alloc driver private failed!\n");
-		return FALSE;
-	}
-	xvmc_driver->devPrivate = (void *)pXvMC;
-	/* set up wrappers */
-	pXvMC->savePutImage = XvAdapt->PutImage;
-	XvAdapt->PutImage = i915_xvmc_put_image;
-	return TRUE;
-}
-
-static void i915_xvmc_fini(ScrnInfoPtr scrn)
-{
-	xfree(xvmc_driver->devPrivate);
-}
-
-/* Fill in the device dependent adaptor record.
- * This is named "Intel(R) Textured Video" because this code falls under the
- * XV extenstion, the name must match or it won't be used.
- *
- * Surface and Subpicture - see above
- * Function pointers to functions below
- */
-static XF86MCAdaptorRec pAdapt = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = ARRAY_SIZE(ppSI),
-	.surfaces = ppSI,
-	.num_subpictures = 0,
-	.subpictures = NULL,
-	.CreateContext =
-	    (xf86XvMCCreateContextProcPtr) i915_xvmc_create_context,
-	.DestroyContext =
-	    (xf86XvMCDestroyContextProcPtr) i915_xvmc_destroy_context,
-	.CreateSurface =
-	    (xf86XvMCCreateSurfaceProcPtr) i915_xvmc_create_surface,
-	.DestroySurface =
-	    (xf86XvMCDestroySurfaceProcPtr) i915_xvmc_destroy_surface,
-	.CreateSubpicture =
-	    (xf86XvMCCreateSubpictureProcPtr) i915_xvmc_create_subpict,
-	.DestroySubpicture =
-	    (xf86XvMCDestroySubpictureProcPtr) i915_xvmc_destroy_subpict,
-};
-
-/* new xvmc driver interface */
-struct intel_xvmc_driver i915_xvmc_driver = {
-	.name = "i915_xvmc",
-	.adaptor = &pAdapt,
-	.flag = XVMC_I915_MPEG2_MC,
-	.init = i915_xvmc_init,
-	.fini = i915_xvmc_fini,
-};
diff --git a/src/i965_hwmc.c b/src/i965_hwmc.c
deleted file mode 100644
index 682107a..0000000
--- a/src/i965_hwmc.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright © 2008 Intel Corporation
- *
- * 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:
- *    Zou Nan hai <nanhai.zou at intel.com>
- *
- */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/XvMC.h>
-#include <fourcc.h>
-
-#include "i830.h"
-#define _INTEL_XVMC_SERVER_
-#include "i830_hwmc.h"
-#include "i965_hwmc.h"
-#include "intel_bufmgr.h"
-
-#define STRIDE(w)               (w)
-#define SIZE_YUV420(w, h)       (h * (STRIDE(w) + STRIDE(w >> 1)))
-#define VLD_MAX_SLICE_LEN	(32*1024)
-
-#ifndef XVMC_VLD
-#define XVMC_VLD  0x00020000
-#endif
-
-static PutImageFuncPtr savedXvPutImage;
-
-static int create_context(ScrnInfoPtr scrn,
-			  XvMCContextPtr context, int *num_privates,
-			  CARD32 ** private)
-{
-	struct i965_xvmc_context *private_context, *context_dup;
-	intel_screen_private *intel = intel_get_screen_private(scrn);
-
-	unsigned int blocknum =
-	    (((context->width + 15) / 16) * ((context->height + 15) / 16));
-	unsigned int blocksize = 6 * blocknum * 64 * sizeof(short);
-	blocksize = (blocksize + 4095) & (~4095);
-	if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
-		ErrorF("XVMC Can not allocate private context\n");
-		return BadAlloc;
-	}
-
-	if ((context_dup = Xcalloc(sizeof(*private_context))) == NULL) {
-		ErrorF("XVMC Can not allocate private context\n");
-		return BadAlloc;
-	}
-
-	private_context->is_g4x = IS_G4X(intel);
-	private_context->is_965_q = IS_965_Q(intel);
-	private_context->is_igdng = IS_IGDNG(intel);
-	private_context->comm.type = xvmc_driver->flag;
-
-	*num_privates = sizeof(*private_context) / sizeof(CARD32);
-	*private = (CARD32 *) private_context;
-	memcpy(context_dup, private_context, sizeof(*private_context));
-	context->driver_priv = context_dup;
-
-	return Success;
-}
-
-static void destroy_context(ScrnInfoPtr scrn, XvMCContextPtr context)
-{
-	struct i965_xvmc_context *private_context;
-	private_context = context->driver_priv;
-	Xfree(private_context);
-}
-
-static int create_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface,
-			  int *num_priv, CARD32 ** priv)
-{
-	XvMCContextPtr ctx = surface->context;
-
-	struct i965_xvmc_surface *priv_surface, *surface_dup;
-	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
-	int i;
-	for (i = 0; i < I965_MAX_SURFACES; i++) {
-		if (priv_ctx->surfaces[i] == NULL) {
-			priv_surface = Xcalloc(sizeof(*priv_surface));
-			if (priv_surface == NULL)
-				return BadAlloc;
-			surface_dup = Xcalloc(sizeof(*priv_surface));
-			if (surface_dup == NULL)
-				return BadAlloc;
-
-			priv_surface->no = i;
-			priv_surface->handle = priv_surface;
-			priv_surface->w = ctx->width;
-			priv_surface->h = ctx->height;
-			priv_ctx->surfaces[i] = surface->driver_priv
-			    = priv_surface;
-			memcpy(surface_dup, priv_surface,
-			       sizeof(*priv_surface));
-			*num_priv = sizeof(*priv_surface) / sizeof(CARD32);
-			*priv = (CARD32 *) surface_dup;
-			break;
-		}
-	}
-
-	if (i >= I965_MAX_SURFACES) {
-		ErrorF("I965 XVMC too many surfaces in one context\n");
-		return BadAlloc;
-	}
-
-	return Success;
-}
-
-static void destory_surface(ScrnInfoPtr scrn, XvMCSurfacePtr surface)
-{
-	XvMCContextPtr ctx = surface->context;
-	struct i965_xvmc_surface *priv_surface = surface->driver_priv;
-	struct i965_xvmc_context *priv_ctx = ctx->driver_priv;
-	priv_ctx->surfaces[priv_surface->no] = NULL;
-	Xfree(priv_surface);
-}
-
-static int create_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture,
-			     int *num_priv, CARD32 ** priv)
-{
-	return Success;
-}
-
-static void destroy_subpicture(ScrnInfoPtr scrn, XvMCSubpicturePtr subpicture)
-{
-}
-
-static int put_image(ScrnInfoPtr scrn,
-		     short src_x, short src_y,
-		     short drw_x, short drw_y, short src_w,
-		     short src_h, short drw_w, short drw_h,
-		     int id, unsigned char *buf, short width,
-		     short height, Bool sync, RegionPtr clipBoxes, pointer data,
-		     DrawablePtr drawable)
-{
-	struct intel_xvmc_command *cmd = (struct intel_xvmc_command *)buf;
-
-	if (id == FOURCC_XVMC) {
-		/* Pass the GEM object name through the pointer arg. */
-		buf = (void *)(uintptr_t)cmd->handle;
-	}
-
-	savedXvPutImage(scrn, src_x, src_y, drw_x, drw_y, src_w, src_h,
-			drw_w, drw_h, id, buf,
-			width, height, sync, clipBoxes,
-			data, drawable);
-
-	return Success;
-}
-
-static Bool init(ScrnInfoPtr screen_info, XF86VideoAdaptorPtr adaptor)
-{
-	savedXvPutImage = adaptor->PutImage;
-	adaptor->PutImage = put_image;
-
-	return TRUE;
-}
-
-static void fini(ScrnInfoPtr screen_info)
-{
-}
-
-static XF86MCSurfaceInfoRec yv12_mpeg2_vld_surface = {
-	FOURCC_YV12,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	1936,
-	1096,
-	1920,
-	1080,
-	XVMC_MPEG_2 | XVMC_VLD,
-	XVMC_INTRA_UNSIGNED,
-	NULL
-};
-
-static XF86MCSurfaceInfoRec yv12_mpeg2_surface = {
-	FOURCC_YV12,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	1936,
-	1096,
-	1920,
-	1080,
-	XVMC_MPEG_2 | XVMC_MOCOMP,
-	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
-	XVMC_INTRA_UNSIGNED,
-	/* &yv12_subpicture_list */
-	NULL
-};
-
-static XF86MCSurfaceInfoRec yv12_mpeg1_surface = {
-	FOURCC_YV12,
-	XVMC_CHROMA_FORMAT_420,
-	0,
-	1920,
-	1080,
-	1920,
-	1080,
-	XVMC_MPEG_1 | XVMC_MOCOMP,
-	/*XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING |
-	   XVMC_INTRA_UNSIGNED, */
-	XVMC_INTRA_UNSIGNED,
-
-	/*&yv12_subpicture_list */
-	NULL
-};
-
-static XF86MCSurfaceInfoPtr surface_info[] = {
-	&yv12_mpeg2_surface,
-	&yv12_mpeg1_surface
-};
-
-static XF86MCSurfaceInfoPtr surface_info_vld[] = {
-	&yv12_mpeg2_vld_surface,
-	&yv12_mpeg2_surface,
-};
-
-static XF86MCAdaptorRec adaptor_vld = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = sizeof(surface_info_vld) / sizeof(surface_info_vld[0]),
-	.surfaces = surface_info_vld,
-
-	.CreateContext = create_context,
-	.DestroyContext = destroy_context,
-	.CreateSurface = create_surface,
-	.DestroySurface = destory_surface,
-	.CreateSubpicture = create_subpicture,
-	.DestroySubpicture = destroy_subpicture
-};
-
-static XF86MCAdaptorRec adaptor = {
-	.name = "Intel(R) Textured Video",
-	.num_surfaces = sizeof(surface_info) / sizeof(surface_info[0]),
-	.surfaces = surface_info,
-
-	.CreateContext = create_context,
-	.DestroyContext = destroy_context,
-	.CreateSurface = create_surface,
-	.DestroySurface = destory_surface,
-	.CreateSubpicture = create_subpicture,
-	.DestroySubpicture = destroy_subpicture
-};
-
-struct intel_xvmc_driver i965_xvmc_driver = {
-	.name = "i965_xvmc",
-	.adaptor = &adaptor,
-	.flag = XVMC_I965_MPEG2_MC,
-	.init = init,
-	.fini = fini
-};
-
-struct intel_xvmc_driver vld_xvmc_driver = {
-	.name = "xvmc_vld",
-	.adaptor = &adaptor_vld,
-	.flag = XVMC_I965_MPEG2_VLD,
-	.init = init,
-	.fini = fini
-};
commit 8199f8f191f8385ef3a228e0ec014a8bbd44002b
Author: Daniel Vetter <daniel at fliege.ffwll.ch>
Date:   Sun Mar 7 23:17:49 2010 +0100

    i915 XvMC: kill more subpict support remnants
    
    This things just won't die!
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c
index 457c89b..40ee507 100644
--- a/src/i915_hwmc.c
+++ b/src/i915_hwmc.c
@@ -64,20 +64,6 @@ typedef struct _I915XvMC {
 	PutImageFuncPtr savePutImage;
 } I915XvMC, *I915XvMCPtr;
 
-/*
-static int yv12_subpicture_index_list[2] =
-{
-    FOURCC_IA44,
-    FOURCC_AI44
-};
-
-static XF86MCImageIDList yv12_subpicture_list =
-{
-    ARRARY_SIZE(yv12_subpicture_index_list),
-    yv12_subpicture_index_list
-};
- */
-
 static XF86MCSurfaceInfoRec i915_YV12_mpg2_surface = {
 	SURFACE_TYPE_MPEG2_MPML,
 	XVMC_CHROMA_FORMAT_420,
@@ -104,7 +90,6 @@ static XF86MCSurfaceInfoRec i915_YV12_mpg1_surface = {
 	XVMC_MPEG_1,
 	/* XVMC_OVERLAID_SURFACE | XVMC_SUBPICTURE_INDEPENDENT_SCALING, */
 	0,
-	/* &yv12_subpicture_list */
 	NULL,
 };
 
commit 29ba8a84f7cf5c29a5f38688a1ac0ccf41d8e4ec
Author: Daniel Vetter <daniel at fliege.ffwll.ch>
Date:   Sun Mar 7 23:16:28 2010 +0100

    XvMC: everyone's using execbuffer!
    
    XvMC was switched over from batchbuffers a few years ago ...
    
    Signed-off-by: Daniel Vetter <daniel at fliege.ffwll.ch>

diff --git a/src/i830_hwmc.c b/src/i830_hwmc.c
index 3533426..aed632b 100644
--- a/src/i830_hwmc.c
+++ b/src/i830_hwmc.c
@@ -97,15 +97,7 @@ Bool intel_xvmc_driver_init(ScreenPtr pScreen, XF86VideoAdaptorPtr xv_adaptor)
 		return FALSE;
 	}
 
-	/* Currently XvMC uses batchbuffer */
-	sp.param = I915_SETPARAM_ALLOW_BATCHBUFFER;
-	sp.value = 1;
-	ret = drmCommandWrite(intel->drmSubFD, DRM_I915_SETPARAM,
-			      &sp, sizeof(sp));
-	if (ret == 0)
-		return TRUE;
-
-	return FALSE;
+	return TRUE;
 }
 
 Bool intel_xvmc_screen_init(ScreenPtr pScreen)


More information about the xorg-commit mailing list