diff options
-rw-r--r-- | src/xvmc/i915_xvmc.c | 81 | ||||
-rw-r--r-- | 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 4cee3cbf..65d2d3e1 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 57a7e2d0..d885612f 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; |