i915 XvMC: switch msb to drm_intel_bo

Like for the static indirect state buffer.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Carl Worth <cworth@cworth.org>
This commit is contained in:
Daniel Vetter 2010-03-02 21:53:20 +01:00 committed by Carl Worth
parent d27955c697
commit 62846d88d4
2 changed files with 30 additions and 53 deletions

View File

@ -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();
}
@ -825,13 +816,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,
@ -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,

View File

@ -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;