diff options
Diffstat (limited to 'src/i915_hwmc.c')
-rw-r--r-- | src/i915_hwmc.c | 1401 |
1 files changed, 710 insertions, 691 deletions
diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c index 152b42b3..02e5fe88 100644 --- a/src/i915_hwmc.c +++ b/src/i915_hwmc.c @@ -61,37 +61,34 @@ #define I915_XVMC_MAX_CONTEXTS 4 #define I915_XVMC_MAX_SURFACES 20 -typedef struct _I915XvMCSurfacePriv -{ - i830_memory *surface; - unsigned long offsets[I915_XVMC_MAX_BUFFERS]; - drm_handle_t surface_handle; +typedef struct _I915XvMCSurfacePriv { + i830_memory *surface; + unsigned long offsets[I915_XVMC_MAX_BUFFERS]; + drm_handle_t surface_handle; } I915XvMCSurfacePriv; -typedef struct _I915XvMCContextPriv -{ - i830_memory *mcStaticIndirectState; - drm_handle_t sis_handle; - i830_memory *mcSamplerState; - drm_handle_t ssb_handle; - i830_memory *mcMapState; - drm_handle_t msb_handle; - i830_memory *mcPixelShaderProgram; - drm_handle_t psp_handle; - i830_memory *mcPixelShaderConstants; - drm_handle_t psc_handle; - i830_memory *mcCorrdata; - drm_handle_t corrdata_handle; +typedef struct _I915XvMCContextPriv { + i830_memory *mcStaticIndirectState; + drm_handle_t sis_handle; + i830_memory *mcSamplerState; + drm_handle_t ssb_handle; + i830_memory *mcMapState; + drm_handle_t msb_handle; + i830_memory *mcPixelShaderProgram; + drm_handle_t psp_handle; + i830_memory *mcPixelShaderConstants; + drm_handle_t psc_handle; + i830_memory *mcCorrdata; + drm_handle_t corrdata_handle; } I915XvMCContextPriv; -typedef struct _I915XvMC -{ - XID contexts[I915_XVMC_MAX_CONTEXTS]; - XID surfaces[I915_XVMC_MAX_SURFACES]; - I915XvMCSurfacePriv *sfprivs[I915_XVMC_MAX_SURFACES]; - I915XvMCContextPriv *ctxprivs[I915_XVMC_MAX_CONTEXTS]; - int ncontexts,nsurfaces; - PutImageFuncPtr savePutImage; +typedef struct _I915XvMC { + XID contexts[I915_XVMC_MAX_CONTEXTS]; + XID surfaces[I915_XVMC_MAX_SURFACES]; + I915XvMCSurfacePriv *sfprivs[I915_XVMC_MAX_SURFACES]; + I915XvMCContextPriv *ctxprivs[I915_XVMC_MAX_CONTEXTS]; + int ncontexts, nsurfaces; + PutImageFuncPtr savePutImage; } I915XvMC, *I915XvMCPtr; /* @@ -108,42 +105,39 @@ static XF86MCImageIDList yv12_subpicture_list = }; */ -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_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, - /* &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, + /* &yv12_subpicture_list */ + NULL, }; -static XF86MCSurfaceInfoPtr ppSI[2] = -{ - (XF86MCSurfaceInfoPtr)&i915_YV12_mpg2_surface, - (XF86MCSurfaceInfoPtr)&i915_YV12_mpg1_surface +static XF86MCSurfaceInfoPtr ppSI[2] = { + (XF86MCSurfaceInfoPtr) & i915_YV12_mpg2_surface, + (XF86MCSurfaceInfoPtr) & i915_YV12_mpg1_surface }; #if 0 @@ -151,27 +145,25 @@ static XF86MCSurfaceInfoPtr ppSI[2] = static XF86ImageRec ia44_subpicture = XVIMAGE_IA44; static XF86ImageRec ai44_subpicture = XVIMAGE_AI44; -static XF86ImagePtr i915_subpicture_list[2] = -{ - (XF86ImagePtr)&ia44_subpicture, - (XF86ImagePtr)&ai44_subpicture +static XF86ImagePtr i915_subpicture_list[2] = { + (XF86ImagePtr) & ia44_subpicture, + (XF86ImagePtr) & ai44_subpicture }; #endif /* Check context size not exceed surface type max */ -static void -i915_check_context_size(XvMCContextPtr ctx) +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; + 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; + } } - } } /* @@ -179,222 +171,231 @@ i915_check_context_size(XvMCContextPtr ctx) */ static void initI915XvMC(I915XvMCPtr xvmc) { - unsigned int i; - - for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { - xvmc->contexts[i] = 0; - xvmc->ctxprivs[i] = NULL; - } - - for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { - xvmc->surfaces[i] = 0; - xvmc->sfprivs[i] = NULL; - } - xvmc->ncontexts = 0; - xvmc->nsurfaces = 0; + unsigned int i; + + for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { + xvmc->contexts[i] = 0; + xvmc->ctxprivs[i] = NULL; + } + + for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { + xvmc->surfaces[i] = 0; + xvmc->sfprivs[i] = NULL; + } + xvmc->ncontexts = 0; + xvmc->nsurfaces = 0; } static void cleanupI915XvMC(I915XvMCPtr xvmc) { - int i; - - for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { - xvmc->contexts[i] = 0; - if (xvmc->ctxprivs[i]) { - xfree(xvmc->ctxprivs[i]); - xvmc->ctxprivs[i] = NULL; - } - } - - for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { - xvmc->surfaces[i] = 0; - if (xvmc->sfprivs[i]) { - xfree(xvmc->sfprivs[i]); - xvmc->sfprivs[i] = NULL; - } - } + int i; + + for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { + xvmc->contexts[i] = 0; + if (xvmc->ctxprivs[i]) { + xfree(xvmc->ctxprivs[i]); + xvmc->ctxprivs[i] = NULL; + } + } + + for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { + xvmc->surfaces[i] = 0; + if (xvmc->sfprivs[i]) { + xfree(xvmc->sfprivs[i]); + xvmc->sfprivs[i] = NULL; + } + } } -static Bool i915_map_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv) +static Bool i915_map_xvmc_buffers(ScrnInfoPtr pScrn, + I915XvMCContextPriv * ctxpriv) { - I830Ptr pI830 = I830PTR(pScrn); - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcStaticIndirectState->offset + pI830->LinearAddr), - ctxpriv->mcStaticIndirectState->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->sis_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(sis_handle) failed!\n"); - return FALSE; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcSamplerState->offset + pI830->LinearAddr), - ctxpriv->mcSamplerState->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->ssb_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(ssb_handle) failed!\n"); - return FALSE; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcMapState->offset + pI830->LinearAddr), - ctxpriv->mcMapState->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->msb_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(msb_handle) failed!\n"); - return FALSE; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcPixelShaderProgram->offset + pI830->LinearAddr), - ctxpriv->mcPixelShaderProgram->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->psp_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(psp_handle) failed!\n"); - return FALSE; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcPixelShaderConstants->offset + pI830->LinearAddr), - ctxpriv->mcPixelShaderConstants->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->psc_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(psc_handle) failed!\n"); - return FALSE; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(ctxpriv->mcCorrdata->offset + pI830->LinearAddr), - ctxpriv->mcCorrdata->size, DRM_AGP, 0, - (drmAddress)&ctxpriv->corrdata_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(corrdata_handle) failed!\n"); - return FALSE; - } - - - return TRUE; + I830Ptr pI830 = I830PTR(pScrn); + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcStaticIndirectState->offset + + pI830->LinearAddr), + ctxpriv->mcStaticIndirectState->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->sis_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(sis_handle) failed!\n"); + return FALSE; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcSamplerState->offset + + pI830->LinearAddr), + ctxpriv->mcSamplerState->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->ssb_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(ssb_handle) failed!\n"); + return FALSE; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcMapState->offset + + pI830->LinearAddr), + ctxpriv->mcMapState->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->msb_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(msb_handle) failed!\n"); + return FALSE; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcPixelShaderProgram->offset + + pI830->LinearAddr), + ctxpriv->mcPixelShaderProgram->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->psp_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(psp_handle) failed!\n"); + return FALSE; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcPixelShaderConstants->offset + + pI830->LinearAddr), + ctxpriv->mcPixelShaderConstants->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->psc_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(psc_handle) failed!\n"); + return FALSE; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (ctxpriv->mcCorrdata->offset + + pI830->LinearAddr), + ctxpriv->mcCorrdata->size, DRM_AGP, 0, + (drmAddress) & ctxpriv->corrdata_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(corrdata_handle) failed!\n"); + return FALSE; + } + + return TRUE; } -static void i915_unmap_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv) +static void i915_unmap_xvmc_buffers(ScrnInfoPtr pScrn, + I915XvMCContextPriv * ctxpriv) { - I830Ptr pI830 = I830PTR(pScrn); - - if (ctxpriv->sis_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->sis_handle); - ctxpriv->sis_handle = 0; - } - - if (ctxpriv->ssb_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->ssb_handle); - ctxpriv->ssb_handle = 0; - } - - if (ctxpriv->msb_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->msb_handle); - ctxpriv->msb_handle = 0; - } - - if (ctxpriv->psp_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->psp_handle); - ctxpriv->psp_handle = 0; - } - - if (ctxpriv->psc_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->psc_handle); - ctxpriv->psc_handle = 0; - } - - if (ctxpriv->corrdata_handle) { - drmRmMap(pI830->drmSubFD, ctxpriv->corrdata_handle); - ctxpriv->corrdata_handle = 0; - } + I830Ptr pI830 = I830PTR(pScrn); + + if (ctxpriv->sis_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->sis_handle); + ctxpriv->sis_handle = 0; + } + + if (ctxpriv->ssb_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->ssb_handle); + ctxpriv->ssb_handle = 0; + } + + if (ctxpriv->msb_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->msb_handle); + ctxpriv->msb_handle = 0; + } + + if (ctxpriv->psp_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->psp_handle); + ctxpriv->psp_handle = 0; + } + + if (ctxpriv->psc_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->psc_handle); + ctxpriv->psc_handle = 0; + } + + if (ctxpriv->corrdata_handle) { + drmRmMap(pI830->drmSubFD, ctxpriv->corrdata_handle); + ctxpriv->corrdata_handle = 0; + } } -static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv) +static Bool i915_allocate_xvmc_buffers(ScrnInfoPtr pScrn, + I915XvMCContextPriv * ctxpriv) { - I830Ptr pI830 = I830PTR(pScrn); - int flags = ALIGN_BOTH_ENDS; - - /* on 915G/GM, load indirect can only use physical address...sigh */ - if (IS_I915G(pI830) || IS_I915GM(pI830)) - flags |= NEED_PHYSICAL_ADDR; - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Static Indirect State", - &(ctxpriv->mcStaticIndirectState), 4 * 1024, - flags)) { - return FALSE; - } - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Sampler State", - &(ctxpriv->mcSamplerState), 4 * 1024, - flags)) { - return FALSE; - } - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Map State", - &(ctxpriv->mcMapState), 4 * 1024, - flags)) { - return FALSE; - } - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Program", - &(ctxpriv->mcPixelShaderProgram), 4 * 1024, - flags)) { - return FALSE; - } - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Constants", - &(ctxpriv->mcPixelShaderConstants), 4 * 1024, - flags)) { - return FALSE; - } - - if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Correction Data Buffer", - &(ctxpriv->mcCorrdata), 512 * 1024, - ALIGN_BOTH_ENDS)) { - return FALSE; - } - - if (1) - i830_describe_allocations(pScrn, 1, "i915_mc: "); - - return TRUE; + I830Ptr pI830 = I830PTR(pScrn); + int flags = ALIGN_BOTH_ENDS; + + /* on 915G/GM, load indirect can only use physical address...sigh */ + if (IS_I915G(pI830) || IS_I915GM(pI830)) + flags |= NEED_PHYSICAL_ADDR; + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Static Indirect State", + &(ctxpriv->mcStaticIndirectState), + 4 * 1024, flags)) { + return FALSE; + } + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Sampler State", + &(ctxpriv->mcSamplerState), 4 * 1024, + flags)) { + return FALSE; + } + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Map State", + &(ctxpriv->mcMapState), 4 * 1024, + flags)) { + return FALSE; + } + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Program", + &(ctxpriv->mcPixelShaderProgram), + 4 * 1024, flags)) { + return FALSE; + } + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Pixel Shader Constants", + &(ctxpriv->mcPixelShaderConstants), + 4 * 1024, flags)) { + return FALSE; + } + + if (!i830_allocate_xvmc_buffer(pScrn, "[XvMC]Correction Data Buffer", + &(ctxpriv->mcCorrdata), 512 * 1024, + ALIGN_BOTH_ENDS)) { + return FALSE; + } + + if (1) + i830_describe_allocations(pScrn, 1, "i915_mc: "); + + return TRUE; } -static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpriv) +static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn, + I915XvMCContextPriv * ctxpriv) { - if (ctxpriv->mcStaticIndirectState) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcStaticIndirectState); - ctxpriv->mcStaticIndirectState = NULL; - } - - if (ctxpriv->mcSamplerState) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcSamplerState); - ctxpriv->mcSamplerState = NULL; - } - - if (ctxpriv->mcMapState) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcMapState); - ctxpriv->mcMapState = NULL; - } - - if (ctxpriv->mcPixelShaderProgram) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderProgram); - ctxpriv->mcPixelShaderProgram = NULL; - } - - if (ctxpriv->mcPixelShaderConstants) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderConstants); - ctxpriv->mcPixelShaderConstants = NULL; - } - - if (ctxpriv->mcCorrdata) { - i830_free_xvmc_buffer(pScrn, ctxpriv->mcCorrdata); - ctxpriv->mcCorrdata = NULL; - } + if (ctxpriv->mcStaticIndirectState) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcStaticIndirectState); + ctxpriv->mcStaticIndirectState = NULL; + } + + if (ctxpriv->mcSamplerState) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcSamplerState); + ctxpriv->mcSamplerState = NULL; + } + + if (ctxpriv->mcMapState) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcMapState); + ctxpriv->mcMapState = NULL; + } + + if (ctxpriv->mcPixelShaderProgram) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderProgram); + ctxpriv->mcPixelShaderProgram = NULL; + } + + if (ctxpriv->mcPixelShaderConstants) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcPixelShaderConstants); + ctxpriv->mcPixelShaderConstants = NULL; + } + + if (ctxpriv->mcCorrdata) { + i830_free_xvmc_buffer(pScrn, ctxpriv->mcCorrdata); + ctxpriv->mcCorrdata = NULL; + } } @@ -411,444 +412,457 @@ static void i915_free_xvmc_buffers(ScrnInfoPtr pScrn, I915XvMCContextPriv *ctxpr * **************************************************************************/ -static int i915_xvmc_create_context (ScrnInfoPtr pScrn, XvMCContextPtr pContext, - int *num_priv, long **priv ) +static int i915_xvmc_create_context(ScrnInfoPtr pScrn, XvMCContextPtr pContext, + int *num_priv, long **priv) { - I830Ptr pI830 = I830PTR(pScrn); - I915XvMCCreateContextRec *contextRec = NULL; - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - I915XvMCContextPriv *ctxpriv = NULL; - int i; - - *priv = NULL; - *num_priv = 0; - - if (!pI830->XvMCEnabled) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: XvMC disabled!\n"); - return BadAlloc; - } - - for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { - if (!pXvMC->contexts[i]) - break; - } - - if (i == I915_XVMC_MAX_CONTEXTS || + I830Ptr pI830 = I830PTR(pScrn); + I915XvMCCreateContextRec *contextRec = NULL; + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + I915XvMCContextPriv *ctxpriv = NULL; + int i; + + *priv = NULL; + *num_priv = 0; + + if (!pI830->XvMCEnabled) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: XvMC disabled!\n"); + return BadAlloc; + } + + for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { + if (!pXvMC->contexts[i]) + break; + } + + if (i == I915_XVMC_MAX_CONTEXTS || pXvMC->ncontexts >= I915_XVMC_MAX_CONTEXTS) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Out of contexts.\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; - - ctxpriv = (I915XvMCContextPriv *)xcalloc(1, sizeof(I915XvMCContextPriv)); - - if (!ctxpriv) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Unable to allocate memory!\n"); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - if (!i915_allocate_xvmc_buffers(pScrn, ctxpriv)) { - i915_free_xvmc_buffers(pScrn, ctxpriv); - xfree(ctxpriv); - ctxpriv = NULL; - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - if (!i915_map_xvmc_buffers(pScrn, ctxpriv)) { - i915_unmap_xvmc_buffers(pScrn, ctxpriv); - i915_free_xvmc_buffers(pScrn, ctxpriv); - xfree(ctxpriv); - ctxpriv = NULL; - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - /* common context items */ - contextRec->comm.type = xvmc_driver->flag; - contextRec->comm.batchbuffer.offset = xvmc_driver->batch->offset; - contextRec->comm.batchbuffer.size = xvmc_driver->batch->size; - contextRec->comm.batchbuffer.handle = xvmc_driver->batch_handle; - - /* i915 private context */ - contextRec->ctxno = i; - contextRec->sis.handle = ctxpriv->sis_handle; - contextRec->sis.offset = ctxpriv->mcStaticIndirectState->offset; - contextRec->sis.size = ctxpriv->mcStaticIndirectState->size; - contextRec->ssb.handle = ctxpriv->ssb_handle; - contextRec->ssb.offset = ctxpriv->mcSamplerState->offset; - contextRec->ssb.size = ctxpriv->mcSamplerState->size; - contextRec->msb.handle = ctxpriv->msb_handle; - contextRec->msb.offset = ctxpriv->mcMapState->offset; - contextRec->msb.size = ctxpriv->mcMapState->size; - contextRec->psp.handle = ctxpriv->psp_handle; - contextRec->psp.offset = ctxpriv->mcPixelShaderProgram->offset; - contextRec->psp.size = ctxpriv->mcPixelShaderProgram->size; - contextRec->psc.handle = ctxpriv->psc_handle; - contextRec->psc.offset = ctxpriv->mcPixelShaderConstants->offset; - contextRec->psc.size = ctxpriv->mcPixelShaderConstants->size; - contextRec->corrdata.handle = ctxpriv->corrdata_handle; - contextRec->corrdata.offset = ctxpriv->mcCorrdata->offset; - contextRec->corrdata.size = ctxpriv->mcCorrdata->size; - contextRec->deviceID = DEVICE_ID(pI830->PciInfo); - - /* XXX: KMS */ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Out of contexts.\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; + + ctxpriv = + (I915XvMCContextPriv *) xcalloc(1, sizeof(I915XvMCContextPriv)); + + if (!ctxpriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Unable to allocate memory!\n"); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + if (!i915_allocate_xvmc_buffers(pScrn, ctxpriv)) { + i915_free_xvmc_buffers(pScrn, ctxpriv); + xfree(ctxpriv); + ctxpriv = NULL; + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + if (!i915_map_xvmc_buffers(pScrn, ctxpriv)) { + i915_unmap_xvmc_buffers(pScrn, ctxpriv); + i915_free_xvmc_buffers(pScrn, ctxpriv); + xfree(ctxpriv); + ctxpriv = NULL; + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + /* common context items */ + contextRec->comm.type = xvmc_driver->flag; + contextRec->comm.batchbuffer.offset = xvmc_driver->batch->offset; + contextRec->comm.batchbuffer.size = xvmc_driver->batch->size; + contextRec->comm.batchbuffer.handle = xvmc_driver->batch_handle; + + /* i915 private context */ + contextRec->ctxno = i; + contextRec->sis.handle = ctxpriv->sis_handle; + contextRec->sis.offset = ctxpriv->mcStaticIndirectState->offset; + contextRec->sis.size = ctxpriv->mcStaticIndirectState->size; + contextRec->ssb.handle = ctxpriv->ssb_handle; + contextRec->ssb.offset = ctxpriv->mcSamplerState->offset; + contextRec->ssb.size = ctxpriv->mcSamplerState->size; + contextRec->msb.handle = ctxpriv->msb_handle; + contextRec->msb.offset = ctxpriv->mcMapState->offset; + contextRec->msb.size = ctxpriv->mcMapState->size; + contextRec->psp.handle = ctxpriv->psp_handle; + contextRec->psp.offset = ctxpriv->mcPixelShaderProgram->offset; + contextRec->psp.size = ctxpriv->mcPixelShaderProgram->size; + contextRec->psc.handle = ctxpriv->psc_handle; + contextRec->psc.offset = ctxpriv->mcPixelShaderConstants->offset; + contextRec->psc.size = ctxpriv->mcPixelShaderConstants->size; + contextRec->corrdata.handle = ctxpriv->corrdata_handle; + contextRec->corrdata.offset = ctxpriv->mcCorrdata->offset; + contextRec->corrdata.size = ctxpriv->mcCorrdata->size; + contextRec->deviceID = DEVICE_ID(pI830->PciInfo); + + /* XXX: KMS */ #if 0 - if (IS_I915G(pI830) || IS_I915GM(pI830)) { - contextRec->sis.bus_addr = ctxpriv->mcStaticIndirectState->bus_addr; - contextRec->ssb.bus_addr = ctxpriv->mcSamplerState->bus_addr; - contextRec->msb.bus_addr = ctxpriv->mcMapState->bus_addr; - contextRec->psp.bus_addr = ctxpriv->mcPixelShaderProgram->bus_addr; - contextRec->psc.bus_addr = ctxpriv->mcPixelShaderConstants->bus_addr; - } + if (IS_I915G(pI830) || IS_I915GM(pI830)) { + contextRec->sis.bus_addr = + ctxpriv->mcStaticIndirectState->bus_addr; + contextRec->ssb.bus_addr = ctxpriv->mcSamplerState->bus_addr; + contextRec->msb.bus_addr = ctxpriv->mcMapState->bus_addr; + contextRec->psp.bus_addr = + ctxpriv->mcPixelShaderProgram->bus_addr; + contextRec->psc.bus_addr = + ctxpriv->mcPixelShaderConstants->bus_addr; + } #endif - pXvMC->ncontexts++; - pXvMC->contexts[i] = pContext->context_id; - pXvMC->ctxprivs[i] = ctxpriv; + pXvMC->ncontexts++; + pXvMC->contexts[i] = pContext->context_id; + pXvMC->ctxprivs[i] = ctxpriv; - return Success; + return Success; } -static int i915_xvmc_create_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, - int *num_priv, long **priv ) +static int i915_xvmc_create_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, + int *num_priv, long **priv) { - I830Ptr pI830 = I830PTR(pScrn); - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - I915XvMCSurfacePriv *sfpriv = NULL; - I915XvMCCreateSurfaceRec *surfaceRec = NULL; - XvMCContextPtr ctx = NULL; - unsigned int srfno; - unsigned long bufsize; - - if (!pI830->XvMCEnabled) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: XvMC disabled!\n"); - return BadAlloc; - } - - *priv = NULL; - *num_priv = 0; - - for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) { - if (!pXvMC->surfaces[srfno]) - break; - } - - if (srfno == I915_XVMC_MAX_SURFACES || + I830Ptr pI830 = I830PTR(pScrn); + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + I915XvMCSurfacePriv *sfpriv = NULL; + I915XvMCCreateSurfaceRec *surfaceRec = NULL; + XvMCContextPtr ctx = NULL; + unsigned int srfno; + unsigned long bufsize; + + if (!pI830->XvMCEnabled) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: XvMC disabled!\n"); + return BadAlloc; + } + + *priv = NULL; + *num_priv = 0; + + for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) { + if (!pXvMC->surfaces[srfno]) + break; + } + + if (srfno == I915_XVMC_MAX_SURFACES || pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Too many surfaces !\n"); - return BadAlloc; - } - - *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec)); - surfaceRec = (I915XvMCCreateSurfaceRec *)*priv; - - if (!*priv) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915:Unable to allocate surface priv ret memory!\n"); - return BadAlloc; - } - - *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2; - sfpriv = (I915XvMCSurfacePriv *)xcalloc(1, sizeof(I915XvMCSurfacePriv)); - - if (!sfpriv) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Unable to allocate surface priv memory!\n"); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - ctx = pSurf->context; - bufsize = SIZE_YUV420(ctx->width, ctx->height); - - if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface", - &(sfpriv->surface), bufsize, - ALIGN_BOTH_ENDS)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915 : Failed to allocate XvMC surface space!\n"); - xfree(sfpriv); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - if (0) - i830_describe_allocations(pScrn, 1, ""); - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(sfpriv->surface->offset + pI830->LinearAddr), - sfpriv->surface->size, DRM_AGP, 0, - (drmAddress)&sfpriv->surface_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(surface_handle) failed!\n"); - i830_free_xvmc_buffer(pScrn, sfpriv->surface); - xfree(sfpriv); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - surfaceRec->srfno = srfno; - surfaceRec->srf.handle = sfpriv->surface_handle; - surfaceRec->srf.offset = sfpriv->surface->offset; - surfaceRec->srf.size = sfpriv->surface->size; - - pXvMC->surfaces[srfno] = pSurf->surface_id; - pXvMC->sfprivs[srfno]= sfpriv; - pXvMC->nsurfaces++; - - return Success; + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Too many surfaces !\n"); + return BadAlloc; + } + + *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec)); + surfaceRec = (I915XvMCCreateSurfaceRec *) * priv; + + if (!*priv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915:Unable to allocate surface priv ret memory!\n"); + return BadAlloc; + } + + *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2; + sfpriv = + (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv)); + + if (!sfpriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Unable to allocate surface priv memory!\n"); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + ctx = pSurf->context; + bufsize = SIZE_YUV420(ctx->width, ctx->height); + + if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface", + &(sfpriv->surface), bufsize, + ALIGN_BOTH_ENDS)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915 : Failed to allocate XvMC surface space!\n"); + xfree(sfpriv); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + if (0) + i830_describe_allocations(pScrn, 1, ""); + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (sfpriv->surface->offset + + pI830->LinearAddr), sfpriv->surface->size, + DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(surface_handle) failed!\n"); + i830_free_xvmc_buffer(pScrn, sfpriv->surface); + xfree(sfpriv); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + surfaceRec->srfno = srfno; + surfaceRec->srf.handle = sfpriv->surface_handle; + surfaceRec->srf.offset = sfpriv->surface->offset; + surfaceRec->srf.size = sfpriv->surface->size; + + pXvMC->surfaces[srfno] = pSurf->surface_id; + pXvMC->sfprivs[srfno] = sfpriv; + pXvMC->nsurfaces++; + + return Success; } static int i915_xvmc_create_subpict(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp, - int *num_priv, long **priv ) + int *num_priv, long **priv) { - I830Ptr pI830 = I830PTR(pScrn); - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - I915XvMCSurfacePriv *sfpriv = NULL; - I915XvMCCreateSurfaceRec *surfaceRec = NULL; - XvMCContextPtr ctx = NULL; - unsigned int srfno; - unsigned int bufsize; - - *priv = NULL; - *num_priv = 0; - - for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) { - if (!pXvMC->surfaces[srfno]) - break; - } - - if (srfno == I915_XVMC_MAX_SURFACES || + I830Ptr pI830 = I830PTR(pScrn); + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + I915XvMCSurfacePriv *sfpriv = NULL; + I915XvMCCreateSurfaceRec *surfaceRec = NULL; + XvMCContextPtr ctx = NULL; + unsigned int srfno; + unsigned int bufsize; + + *priv = NULL; + *num_priv = 0; + + for (srfno = 0; srfno < I915_XVMC_MAX_SURFACES; ++srfno) { + if (!pXvMC->surfaces[srfno]) + break; + } + + if (srfno == I915_XVMC_MAX_SURFACES || pXvMC->nsurfaces >= I915_XVMC_MAX_SURFACES) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Too many surfaces !\n"); - return BadAlloc; - } - - *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec)); - surfaceRec = (I915XvMCCreateSurfaceRec *)*priv; - - if (!*priv) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Unable to allocate memory!\n"); - return BadAlloc; - } - - *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2; - sfpriv = (I915XvMCSurfacePriv *)xcalloc(1, sizeof(I915XvMCSurfacePriv)); - - if (!sfpriv) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915: Unable to allocate memory!\n"); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - ctx = pSubp->context; - bufsize = SIZE_XX44(ctx->width, ctx->height); - - if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface", - &(sfpriv->surface), bufsize, - ALIGN_BOTH_ENDS)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n"); - xfree(sfpriv); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - if (drmAddMap(pI830->drmSubFD, - (drm_handle_t)(sfpriv->surface->offset + pI830->LinearAddr), - sfpriv->surface->size, DRM_AGP, 0, - (drmAddress)&sfpriv->surface_handle) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] drmAddMap(surface_handle) failed!\n"); - i830_free_xvmc_buffer(pScrn, sfpriv->surface); - xfree(sfpriv); - xfree(*priv); - *priv = NULL; - *num_priv = 0; - return BadAlloc; - } - - surfaceRec->srfno = srfno; - surfaceRec->srf.handle = sfpriv->surface_handle; - surfaceRec->srf.offset = sfpriv->surface->offset; - surfaceRec->srf.size = sfpriv->surface->size; - - pXvMC->sfprivs[srfno] = sfpriv; - pXvMC->surfaces[srfno] = pSubp->subpicture_id; - pXvMC->nsurfaces++; - - return Success; + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Too many surfaces !\n"); + return BadAlloc; + } + + *priv = xcalloc(1, sizeof(I915XvMCCreateSurfaceRec)); + surfaceRec = (I915XvMCCreateSurfaceRec *) * priv; + + if (!*priv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Unable to allocate memory!\n"); + return BadAlloc; + } + + *num_priv = sizeof(I915XvMCCreateSurfaceRec) >> 2; + sfpriv = + (I915XvMCSurfacePriv *) xcalloc(1, sizeof(I915XvMCSurfacePriv)); + + if (!sfpriv) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915: Unable to allocate memory!\n"); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + ctx = pSubp->context; + bufsize = SIZE_XX44(ctx->width, ctx->height); + + if (!i830_allocate_xvmc_buffer(pScrn, "XvMC surface", + &(sfpriv->surface), bufsize, + ALIGN_BOTH_ENDS)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] I915XvMCCreateSurface: Failed to allocate XvMC surface space!\n"); + xfree(sfpriv); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + if (drmAddMap(pI830->drmSubFD, + (drm_handle_t) (sfpriv->surface->offset + + pI830->LinearAddr), sfpriv->surface->size, + DRM_AGP, 0, (drmAddress) & sfpriv->surface_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] drmAddMap(surface_handle) failed!\n"); + i830_free_xvmc_buffer(pScrn, sfpriv->surface); + xfree(sfpriv); + xfree(*priv); + *priv = NULL; + *num_priv = 0; + return BadAlloc; + } + + surfaceRec->srfno = srfno; + surfaceRec->srf.handle = sfpriv->surface_handle; + surfaceRec->srf.offset = sfpriv->surface->offset; + surfaceRec->srf.size = sfpriv->surface->size; + + pXvMC->sfprivs[srfno] = sfpriv; + pXvMC->surfaces[srfno] = pSubp->subpicture_id; + pXvMC->nsurfaces++; + + return Success; } -static void i915_xvmc_destroy_context (ScrnInfoPtr pScrn, - XvMCContextPtr pContext) +static void i915_xvmc_destroy_context(ScrnInfoPtr pScrn, + XvMCContextPtr pContext) { - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - int i; - - for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { - if (pXvMC->contexts[i] == pContext->context_id) { - i915_unmap_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]); - i915_free_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]); - xfree(pXvMC->ctxprivs[i]); - pXvMC->ctxprivs[i] = 0; - pXvMC->ncontexts--; - pXvMC->contexts[i] = 0; - return; - } - } - - return; + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + int i; + + for (i = 0; i < I915_XVMC_MAX_CONTEXTS; i++) { + if (pXvMC->contexts[i] == pContext->context_id) { + i915_unmap_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]); + i915_free_xvmc_buffers(pScrn, pXvMC->ctxprivs[i]); + xfree(pXvMC->ctxprivs[i]); + pXvMC->ctxprivs[i] = 0; + pXvMC->ncontexts--; + pXvMC->contexts[i] = 0; + return; + } + } + + return; } -static void i915_xvmc_destroy_surface (ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) +static void i915_xvmc_destroy_surface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) { - I830Ptr pI830 = I830PTR(pScrn); - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - int i; - - for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { - if (pXvMC->surfaces[i] == pSurf->surface_id) { - drmRmMap(pI830->drmSubFD, pXvMC->sfprivs[i]->surface_handle); - i830_free_xvmc_buffer(pScrn, pXvMC->sfprivs[i]->surface); - xfree(pXvMC->sfprivs[i]); - pXvMC->nsurfaces--; - pXvMC->sfprivs[i] = 0; - pXvMC->surfaces[i] = 0; - return; - } - } - - return; + I830Ptr pI830 = I830PTR(pScrn); + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + int i; + + for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { + if (pXvMC->surfaces[i] == pSurf->surface_id) { + drmRmMap(pI830->drmSubFD, + pXvMC->sfprivs[i]->surface_handle); + i830_free_xvmc_buffer(pScrn, + pXvMC->sfprivs[i]->surface); + xfree(pXvMC->sfprivs[i]); + pXvMC->nsurfaces--; + pXvMC->sfprivs[i] = 0; + pXvMC->surfaces[i] = 0; + return; + } + } + + return; } -static void i915_xvmc_destroy_subpict (ScrnInfoPtr pScrn, - XvMCSubpicturePtr pSubp) +static void i915_xvmc_destroy_subpict(ScrnInfoPtr pScrn, + XvMCSubpicturePtr pSubp) { - I830Ptr pI830 = I830PTR(pScrn); - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; - int i; - - for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { - if (pXvMC->surfaces[i] == pSubp->subpicture_id) { - drmRmMap(pI830->drmSubFD, pXvMC->sfprivs[i]->surface_handle); - i830_free_xvmc_buffer(pScrn, pXvMC->sfprivs[i]->surface); - xfree(pXvMC->sfprivs[i]); - pXvMC->nsurfaces--; - pXvMC->sfprivs[i] = 0; - pXvMC->surfaces[i] = 0; - return; - } - } - - return; + I830Ptr pI830 = I830PTR(pScrn); + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + int i; + + for (i = 0; i < I915_XVMC_MAX_SURFACES; i++) { + if (pXvMC->surfaces[i] == pSubp->subpicture_id) { + drmRmMap(pI830->drmSubFD, + pXvMC->sfprivs[i]->surface_handle); + i830_free_xvmc_buffer(pScrn, + pXvMC->sfprivs[i]->surface); + xfree(pXvMC->sfprivs[i]); + pXvMC->nsurfaces--; + pXvMC->sfprivs[i] = 0; + pXvMC->surfaces[i] = 0; + return; + } + } + + return; } static int i915_xvmc_put_image(ScrnInfoPtr pScrn, - 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) + 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) { - switch (xvmc_cmd->command) { - case INTEL_XVMC_COMMAND_DISPLAY: - if ((xvmc_cmd->srfNo >= I915_XVMC_MAX_SURFACES) || - !pXvMC->surfaces[xvmc_cmd->srfNo] || - !pXvMC->sfprivs[xvmc_cmd->srfNo]) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[XvMC] i915 put image: Invalid parameters!\n"); - return 1; + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; + struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf; + int ret; + + if (FOURCC_XVMC == id) { + switch (xvmc_cmd->command) { + case INTEL_XVMC_COMMAND_DISPLAY: + if ((xvmc_cmd->srfNo >= I915_XVMC_MAX_SURFACES) || + !pXvMC->surfaces[xvmc_cmd->srfNo] || + !pXvMC->sfprivs[xvmc_cmd->srfNo]) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[XvMC] i915 put image: Invalid parameters!\n"); + return 1; + } + + /* use char *buf to hold our surface offset...hacky! */ + buf = + (unsigned char *)pXvMC->sfprivs[xvmc_cmd->srfNo]-> + surface->offset; + break; + default: + return 0; } - - /* use char *buf to hold our surface offset...hacky! */ - buf = (unsigned char *)pXvMC->sfprivs[xvmc_cmd->srfNo]->surface->offset; - break; - default: - return 0; } - } - ret = pXvMC->savePutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h, - drw_w, drw_h, id, buf, width, height, sync, clipBoxes, - data, pDraw); - return ret; + ret = + pXvMC->savePutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h, + drw_w, drw_h, id, buf, width, height, sync, + clipBoxes, data, pDraw); + return ret; } static Bool i915_xvmc_init(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt) { - I915XvMCPtr pXvMC; - - pXvMC = (I915XvMCPtr)xcalloc(1, sizeof(I915XvMC)); - if (!pXvMC) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "[XvMC] alloc driver private failed!\n"); - return FALSE; - } - xvmc_driver->devPrivate = (void*)pXvMC; - if (!intel_xvmc_init_batch(pScrn)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "[XvMC] fail to init batch buffer\n"); - xfree(pXvMC); - return FALSE; - } - initI915XvMC(pXvMC); - - /* set up wrappers */ - pXvMC->savePutImage = XvAdapt->PutImage; - XvAdapt->PutImage = i915_xvmc_put_image; - return TRUE; + I915XvMCPtr pXvMC; + + pXvMC = (I915XvMCPtr) xcalloc(1, sizeof(I915XvMC)); + if (!pXvMC) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[XvMC] alloc driver private failed!\n"); + return FALSE; + } + xvmc_driver->devPrivate = (void *)pXvMC; + if (!intel_xvmc_init_batch(pScrn)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[XvMC] fail to init batch buffer\n"); + xfree(pXvMC); + return FALSE; + } + initI915XvMC(pXvMC); + + /* set up wrappers */ + pXvMC->savePutImage = XvAdapt->PutImage; + XvAdapt->PutImage = i915_xvmc_put_image; + return TRUE; } static void i915_xvmc_fini(ScrnInfoPtr pScrn) { - I915XvMCPtr pXvMC = (I915XvMCPtr)xvmc_driver->devPrivate; + I915XvMCPtr pXvMC = (I915XvMCPtr) xvmc_driver->devPrivate; - cleanupI915XvMC(pXvMC); - intel_xvmc_fini_batch(pScrn); - xfree(xvmc_driver->devPrivate); + cleanupI915XvMC(pXvMC); + intel_xvmc_fini_batch(pScrn); + xfree(xvmc_driver->devPrivate); } /* Fill in the device dependent adaptor record. @@ -858,30 +872,35 @@ static void i915_xvmc_fini(ScrnInfoPtr pScrn) * 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, +static XF86MCAdaptorRec pAdapt = { + .name = "Intel(R) Textured Video", + .num_surfaces = ARRAY_SIZE(ppSI), + .surfaces = ppSI, #if 0 - .num_subpictures = ARRARY_SIZE(i915_subpicture_list), - .subpictures = i915_subpicture_list, + .num_subpictures = ARRARY_SIZE(i915_subpicture_list), + .subpictures = i915_subpicture_list, #endif - .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, + .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, + .name = "i915_xvmc", + .adaptor = &pAdapt, + .flag = XVMC_I915_MPEG2_MC, + .init = i915_xvmc_init, + .fini = i915_xvmc_fini, }; |