[Intel-gfx] [PATCH 10/18] i915 XvMC: switch msb to drm_intel_bo

Daniel Vetter daniel.vetter at ffwll.ch
Tue Mar 2 21:53:20 CET 2010


Like for the static indirect state buffer.

Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
---
 src/xvmc/i915_xvmc.c |   81 ++++++++++++++++++--------------------------------
 src/xvmc/i915_xvmc.h |    2 +-
 2 files changed, 30 insertions(+), 53 deletions(-)

diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 4cee3cb..65d2d3e 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -499,14 +499,17 @@ static void i915_mc_static_indirect_state_set(XvMCContext * context,
 	drm_intel_gem_bo_unmap_gtt(pI915XvMC->sis_bo);
 }
 
-static void i915_mc_map_state_init(XvMCContext * context)
+static void i915_mc_map_state_set(XvMCContext * context,
+				  i915XvMCSurface * privPast,
+				  i915XvMCSurface * privFuture)
 {
 	i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
+	struct i915_mc_map_state *map_state;
 	unsigned int w = context->width;
 	unsigned int h = context->height;
-	struct i915_mc_map_state *map_state;
 
-	map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
+	drm_intel_gem_bo_map_gtt(pI915XvMC->msb_bo);
+	map_state = pI915XvMC->msb_bo->virtual;
 
 	memset(map_state, 0, sizeof(*map_state));
 
@@ -530,6 +533,8 @@ static void i915_mc_map_state_init(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 = (YOFFSET(privPast) >> 2);
+	map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* Y Backward (Future) */
 	map_state->y_backward.tm0.v_ls_offset = 0;
@@ -544,6 +549,8 @@ static void i915_mc_map_state_init(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 = (YOFFSET(privFuture) >> 2);
+	map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
 
 	/* 3DSATE_MAP_STATE: U */
 	map_state->u_map.dw0.type = CMD_3D;
@@ -565,6 +572,8 @@ static void i915_mc_map_state_init(XvMCContext * context)
 	map_state->u_forward.tm2.depth = 0;
 	map_state->u_forward.tm2.max_lod = 0;
 	map_state->u_forward.tm2.cube_face = 0;
+	map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);
+	map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* U Backward */
 	map_state->u_backward.tm0.v_ls_offset = 0;
@@ -579,6 +588,9 @@ static void i915_mc_map_state_init(XvMCContext * context)
 	map_state->u_backward.tm2.depth = 0;
 	map_state->u_backward.tm2.max_lod = 0;
 	map_state->u_backward.tm2.cube_face = 0;
+	map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);
+	map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+
 
 	/* 3DSATE_MAP_STATE: V */
 	map_state->v_map.dw0.type = CMD_3D;
@@ -600,6 +612,8 @@ static void i915_mc_map_state_init(XvMCContext * context)
 	map_state->v_forward.tm2.depth = 0;
 	map_state->v_forward.tm2.max_lod = 0;
 	map_state->v_forward.tm2.cube_face = 0;
+	map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);
+	map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
 
 	/* V Backward */
 	map_state->v_backward.tm0.v_ls_offset = 0;
@@ -614,29 +628,10 @@ static void i915_mc_map_state_init(XvMCContext * context)
 	map_state->v_backward.tm2.depth = 0;
 	map_state->v_backward.tm2.max_lod = 0;
 	map_state->v_backward.tm2.cube_face = 0;
-}
-
-static void i915_mc_map_state_set(XvMCContext * context,
-				  i915XvMCSurface * privPast,
-				  i915XvMCSurface * privFuture)
-{
-	i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
-	struct i915_mc_map_state *map_state;
-
-	map_state = (struct i915_mc_map_state *)pI915XvMC->msb.map;
-
-	map_state->y_forward.tm0.base_address = (YOFFSET(privPast) >> 2);
-	map_state->y_forward.tm2.pitch = (privPast->yStride >> 2) - 1;	/* in DWords - 1 */
-	map_state->y_backward.tm0.base_address = (YOFFSET(privFuture) >> 2);
-	map_state->y_backward.tm2.pitch = (privFuture->yStride >> 2) - 1;
-	map_state->u_forward.tm0.base_address = (UOFFSET(privPast) >> 2);
-	map_state->u_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
-	map_state->u_backward.tm0.base_address = (UOFFSET(privFuture) >> 2);
-	map_state->u_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
-	map_state->v_forward.tm0.base_address = (VOFFSET(privPast) >> 2);
-	map_state->v_forward.tm2.pitch = (privPast->uvStride >> 2) - 1;	/* in DWords - 1 */
 	map_state->v_backward.tm0.base_address = (VOFFSET(privFuture) >> 2);
 	map_state->v_backward.tm2.pitch = (privFuture->uvStride >> 2) - 1;
+
+	drm_intel_gem_bo_unmap_gtt(pI915XvMC->msb_bo);
 }
 
 static void i915_flush(int map, int render)
@@ -655,7 +650,6 @@ static void i915_flush(int map, int render)
 static void i915_mc_load_indirect_render_emit(XvMCContext * context)
 {
 	i915XvMCContext *pI915XvMC = (i915XvMCContext *) context->privData;
-	msb_state *msb;
 	int mem_select;
 	uint32_t load_indirect, buffer_address;
 	BATCH_LOCALS;
@@ -680,11 +674,8 @@ static void i915_mc_load_indirect_render_emit(XvMCContext * context)
 	OUT_BATCH(16);	/* 4 * 3 + 2 + 3 - 1 */
 
 	/* Map state buffer (reference buffer info) */
-	if (mem_select)
-		buffer_address = pI915XvMC->msb.offset;
-	else
-		buffer_address = pI915XvMC->msb.bus_addr;
-	OUT_BATCH(buffer_address | STATE_VALID | STATE_FORCE);
+	OUT_RELOC(pI915XvMC->msb_bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
+			STATE_VALID | STATE_FORCE);
 	OUT_BATCH(23);	/* 3 * 8 - 1 */
 	ADVANCE_BATCH();
 }
@@ -826,13 +817,6 @@ static void i915_mc_mpeg_macroblock_2fbmv(XvMCContext * context,
 static int i915_xvmc_map_buffers(i915XvMCContext * pI915XvMC)
 {
 	if (drmMap(xvmc_driver->fd,
-		   pI915XvMC->msb.handle,
-		   pI915XvMC->msb.size,
-		   (drmAddress *) & pI915XvMC->msb.map) != 0) {
-		return -1;
-	}
-
-	if (drmMap(xvmc_driver->fd,
 		   pI915XvMC->corrdata.handle,
 		   pI915XvMC->corrdata.size,
 		   (drmAddress *) & pI915XvMC->corrdata.map) != 0) {
@@ -844,11 +828,6 @@ static int i915_xvmc_map_buffers(i915XvMCContext * pI915XvMC)
 
 static void i915_xvmc_unmap_buffers(i915XvMCContext * pI915XvMC)
 {
-	if (pI915XvMC->msb.map) {
-		drmUnmap(pI915XvMC->msb.map, pI915XvMC->msb.size);
-		pI915XvMC->msb.map = NULL;
-	}
-
 	if (pI915XvMC->corrdata.map) {
 		drmUnmap(pI915XvMC->corrdata.map, pI915XvMC->corrdata.size);
 		pI915XvMC->corrdata.map = NULL;
@@ -937,14 +916,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	tmpComm = (I915XvMCCreateContextRec *) priv_data;
 	pI915XvMC->ctxno = tmpComm->ctxno;
 	pI915XvMC->deviceID = tmpComm->deviceID;
-	pI915XvMC->msb.handle = tmpComm->msb.handle;
-	pI915XvMC->msb.offset = tmpComm->msb.offset;
-	pI915XvMC->msb.size = tmpComm->msb.size;
-
-	if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
-	    pI915XvMC->deviceID == PCI_CHIP_I915_GM) {
-		pI915XvMC->msb.bus_addr = tmpComm->msb.bus_addr;
-	}
 
 	pI915XvMC->corrdata.handle = tmpComm->corrdata.handle;
 	pI915XvMC->corrdata.offset = tmpComm->corrdata.offset;
@@ -971,8 +942,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
 	/* pre-init state buffers */
 	i915_mc_one_time_context_init(context);
 
-	i915_mc_map_state_init(context);
-
 	return Success;
 
 unmap_buffers:
@@ -1100,12 +1069,20 @@ static int i915_xvmc_alloc_render_state_buffers(i915XvMCContext *pI915XvMC)
 	if (!pI915XvMC->sis_bo)
 		return 0;
 
+	pI915XvMC->msb_bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+					       "msb",
+					       GTT_PAGE_SIZE,
+					       GTT_PAGE_SIZE);
+	if (!pI915XvMC->msb_bo)
+		return 0;
+
 	return 1;
 }
 
 static void i915_xvmc_free_render_state_buffers(i915XvMCContext *pI915XvMC)
 {
 	drm_intel_bo_unreference(pI915XvMC->sis_bo);
+	drm_intel_bo_unreference(pI915XvMC->msb_bo);
 }
 
 static int i915_xvmc_mc_render_surface(Display * display, XvMCContext * context,
diff --git a/src/xvmc/i915_xvmc.h b/src/xvmc/i915_xvmc.h
index 57a7e2d..d885612 100644
--- a/src/xvmc/i915_xvmc.h
+++ b/src/xvmc/i915_xvmc.h
@@ -66,7 +66,7 @@ typedef struct _i915XvMCContext {
 	int deviceID;
 
 	drm_intel_bo *sis_bo;
-	intel_xvmc_drm_map_t msb;
+	drm_intel_bo *msb_bo;
 	drm_intel_bo *ssb_bo;
 	drm_intel_bo *psp_bo;
 	drm_intel_bo *psc_bo;
-- 
1.6.6.1




More information about the Intel-gfx mailing list