105b261ecSmrg 205b261ecSmrg/* 305b261ecSmrg * Copyright (c) 2001-2003 by The XFree86 Project, Inc. 405b261ecSmrg * 505b261ecSmrg * Permission is hereby granted, free of charge, to any person obtaining a 605b261ecSmrg * copy of this software and associated documentation files (the "Software"), 705b261ecSmrg * to deal in the Software without restriction, including without limitation 805b261ecSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 905b261ecSmrg * and/or sell copies of the Software, and to permit persons to whom the 1005b261ecSmrg * Software is furnished to do so, subject to the following conditions: 1105b261ecSmrg * 1205b261ecSmrg * The above copyright notice and this permission notice shall be included in 1305b261ecSmrg * all copies or substantial portions of the Software. 1405b261ecSmrg * 1505b261ecSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1605b261ecSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1705b261ecSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1805b261ecSmrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1905b261ecSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2005b261ecSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2105b261ecSmrg * OTHER DEALINGS IN THE SOFTWARE. 2205b261ecSmrg * 2305b261ecSmrg * Except as contained in this notice, the name of the copyright holder(s) 2405b261ecSmrg * and author(s) shall not be used in advertising or otherwise to promote 2505b261ecSmrg * the sale, use or other dealings in this Software without prior written 2605b261ecSmrg * authorization from the copyright holder(s) and author(s). 2705b261ecSmrg */ 2805b261ecSmrg 2905b261ecSmrg#ifdef HAVE_XORG_CONFIG_H 3005b261ecSmrg#include <xorg-config.h> 3105b261ecSmrg#endif 3205b261ecSmrg 3305b261ecSmrg#include "misc.h" 3405b261ecSmrg#include "xf86.h" 3505b261ecSmrg#include "xf86_OSproc.h" 3605b261ecSmrg 3705b261ecSmrg#include <X11/X.h> 3805b261ecSmrg#include <X11/Xproto.h> 3905b261ecSmrg#include "scrnintstr.h" 4005b261ecSmrg#include "resource.h" 4105b261ecSmrg#include "dixstruct.h" 4205b261ecSmrg 4305b261ecSmrg#include "xf86xvpriv.h" 4405b261ecSmrg#include "xf86xvmc.h" 4505b261ecSmrg 4605b261ecSmrgtypedef struct { 4735c4bbdfSmrg CloseScreenProcPtr CloseScreen; 4835c4bbdfSmrg int num_adaptors; 4935c4bbdfSmrg XF86MCAdaptorPtr *adaptors; 5035c4bbdfSmrg XvMCAdaptorPtr dixinfo; 5105b261ecSmrg} xf86XvMCScreenRec, *xf86XvMCScreenPtr; 5205b261ecSmrg 536747b715Smrgstatic DevPrivateKeyRec XF86XvMCScreenKeyRec; 5435c4bbdfSmrg 556747b715Smrg#define XF86XvMCScreenKey (&XF86XvMCScreenKeyRec) 5605b261ecSmrg 574642e01fSmrg#define XF86XVMC_GET_PRIVATE(pScreen) (xf86XvMCScreenPtr) \ 584642e01fSmrg dixLookupPrivate(&(pScreen)->devPrivates, XF86XvMCScreenKey) 5905b261ecSmrg 6035c4bbdfSmrgstatic int 6135c4bbdfSmrgxf86XvMCCreateContext(XvPortPtr pPort, 6235c4bbdfSmrg XvMCContextPtr pContext, int *num_priv, CARD32 **priv) 6305b261ecSmrg{ 6405b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 6535c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 6605b261ecSmrg 6735c4bbdfSmrg pContext->port_priv = (XvPortRecPrivatePtr) (pPort->devPriv.ptr); 6805b261ecSmrg 6935c4bbdfSmrg return (*pScreenPriv->adaptors[pContext->adapt_num]->CreateContext) (pScrn, 7035c4bbdfSmrg pContext, 7135c4bbdfSmrg num_priv, 7235c4bbdfSmrg priv); 7305b261ecSmrg} 7405b261ecSmrg 7535c4bbdfSmrgstatic void 7635c4bbdfSmrgxf86XvMCDestroyContext(XvMCContextPtr pContext) 7705b261ecSmrg{ 7805b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 7935c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 8005b261ecSmrg 8135c4bbdfSmrg (*pScreenPriv->adaptors[pContext->adapt_num]->DestroyContext) (pScrn, 8235c4bbdfSmrg pContext); 8305b261ecSmrg} 8405b261ecSmrg 8535c4bbdfSmrgstatic int 8635c4bbdfSmrgxf86XvMCCreateSurface(XvMCSurfacePtr pSurface, int *num_priv, CARD32 **priv) 8705b261ecSmrg{ 8805b261ecSmrg XvMCContextPtr pContext = pSurface->context; 8905b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 9035c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 9105b261ecSmrg 9235c4bbdfSmrg return (*pScreenPriv->adaptors[pContext->adapt_num]->CreateSurface) (pScrn, 9335c4bbdfSmrg pSurface, 9435c4bbdfSmrg num_priv, 9535c4bbdfSmrg priv); 9605b261ecSmrg} 9705b261ecSmrg 9835c4bbdfSmrgstatic void 9935c4bbdfSmrgxf86XvMCDestroySurface(XvMCSurfacePtr pSurface) 10005b261ecSmrg{ 10105b261ecSmrg XvMCContextPtr pContext = pSurface->context; 10205b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 10335c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 10405b261ecSmrg 10535c4bbdfSmrg (*pScreenPriv->adaptors[pContext->adapt_num]->DestroySurface) (pScrn, 10635c4bbdfSmrg pSurface); 10705b261ecSmrg} 10805b261ecSmrg 10935c4bbdfSmrgstatic int 11035c4bbdfSmrgxf86XvMCCreateSubpicture(XvMCSubpicturePtr pSubpicture, 11135c4bbdfSmrg int *num_priv, CARD32 **priv) 11205b261ecSmrg{ 11305b261ecSmrg XvMCContextPtr pContext = pSubpicture->context; 11405b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 11535c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 11605b261ecSmrg 11735c4bbdfSmrg return (*pScreenPriv->adaptors[pContext->adapt_num]-> 11835c4bbdfSmrg CreateSubpicture) (pScrn, pSubpicture, num_priv, priv); 11905b261ecSmrg} 12005b261ecSmrg 12105b261ecSmrgstatic void 12235c4bbdfSmrgxf86XvMCDestroySubpicture(XvMCSubpicturePtr pSubpicture) 12305b261ecSmrg{ 12405b261ecSmrg XvMCContextPtr pContext = pSubpicture->context; 12505b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen); 12635c4bbdfSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen); 12705b261ecSmrg 12835c4bbdfSmrg (*pScreenPriv->adaptors[pContext->adapt_num]->DestroySubpicture) (pScrn, 12935c4bbdfSmrg pSubpicture); 13005b261ecSmrg} 13105b261ecSmrg 13205b261ecSmrgstatic Bool 13335c4bbdfSmrgxf86XvMCCloseScreen(ScreenPtr pScreen) 13405b261ecSmrg{ 13505b261ecSmrg xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pScreen); 13605b261ecSmrg 13705b261ecSmrg pScreen->CloseScreen = pScreenPriv->CloseScreen; 13805b261ecSmrg 1396747b715Smrg free(pScreenPriv->dixinfo); 1406747b715Smrg free(pScreenPriv); 14105b261ecSmrg 14235c4bbdfSmrg return (*pScreen->CloseScreen) (pScreen); 14305b261ecSmrg} 14405b261ecSmrg 14535c4bbdfSmrgBool 14635c4bbdfSmrgxf86XvMCScreenInit(ScreenPtr pScreen, 14735c4bbdfSmrg int num_adaptors, XF86MCAdaptorPtr * adaptors) 14805b261ecSmrg{ 14935c4bbdfSmrg XvMCAdaptorPtr pAdapt; 15035c4bbdfSmrg xf86XvMCScreenPtr pScreenPriv; 15135c4bbdfSmrg XvScreenPtr pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 15235c4bbdfSmrg XF86XvScreenKey); 15335c4bbdfSmrg int i, j; 15435c4bbdfSmrg 15535c4bbdfSmrg if (noXvExtension) 15635c4bbdfSmrg return FALSE; 15735c4bbdfSmrg 15835c4bbdfSmrg if (!(pAdapt = xallocarray(num_adaptors, sizeof(XvMCAdaptorRec)))) 15935c4bbdfSmrg return FALSE; 16035c4bbdfSmrg 16135c4bbdfSmrg if (!dixRegisterPrivateKey(&XF86XvMCScreenKeyRec, PRIVATE_SCREEN, 0)) { 16235c4bbdfSmrg free(pAdapt); 16335c4bbdfSmrg return FALSE; 16435c4bbdfSmrg } 16535c4bbdfSmrg 16635c4bbdfSmrg if (!(pScreenPriv = malloc(sizeof(xf86XvMCScreenRec)))) { 16735c4bbdfSmrg free(pAdapt); 16835c4bbdfSmrg return FALSE; 16935c4bbdfSmrg } 17035c4bbdfSmrg 17135c4bbdfSmrg dixSetPrivate(&pScreen->devPrivates, XF86XvMCScreenKey, pScreenPriv); 17235c4bbdfSmrg 17335c4bbdfSmrg pScreenPriv->CloseScreen = pScreen->CloseScreen; 17435c4bbdfSmrg pScreen->CloseScreen = xf86XvMCCloseScreen; 17535c4bbdfSmrg 17635c4bbdfSmrg pScreenPriv->num_adaptors = num_adaptors; 17735c4bbdfSmrg pScreenPriv->adaptors = adaptors; 17835c4bbdfSmrg pScreenPriv->dixinfo = pAdapt; 17935c4bbdfSmrg 18035c4bbdfSmrg for (i = 0; i < num_adaptors; i++) { 18135c4bbdfSmrg pAdapt[i].xv_adaptor = NULL; 18235c4bbdfSmrg for (j = 0; j < pxvs->nAdaptors; j++) { 18335c4bbdfSmrg if (!strcmp((*adaptors)->name, pxvs->pAdaptors[j].name)) { 18435c4bbdfSmrg pAdapt[i].xv_adaptor = &(pxvs->pAdaptors[j]); 18535c4bbdfSmrg break; 18635c4bbdfSmrg } 18735c4bbdfSmrg } 18835c4bbdfSmrg if (!pAdapt[i].xv_adaptor) { 18935c4bbdfSmrg /* no adaptor by that name */ 1901b5d61b8Smrg pScreenPriv->dixinfo = FALSE; 19135c4bbdfSmrg free(pAdapt); 19235c4bbdfSmrg return FALSE; 19335c4bbdfSmrg } 19435c4bbdfSmrg pAdapt[i].num_surfaces = (*adaptors)->num_surfaces; 19535c4bbdfSmrg pAdapt[i].surfaces = (XvMCSurfaceInfoPtr *) ((*adaptors)->surfaces); 19635c4bbdfSmrg pAdapt[i].num_subpictures = (*adaptors)->num_subpictures; 19735c4bbdfSmrg pAdapt[i].subpictures = (XvImagePtr *) ((*adaptors)->subpictures); 19835c4bbdfSmrg pAdapt[i].CreateContext = xf86XvMCCreateContext; 19935c4bbdfSmrg pAdapt[i].DestroyContext = xf86XvMCDestroyContext; 20035c4bbdfSmrg pAdapt[i].CreateSurface = xf86XvMCCreateSurface; 20135c4bbdfSmrg pAdapt[i].DestroySurface = xf86XvMCDestroySurface; 20235c4bbdfSmrg pAdapt[i].CreateSubpicture = xf86XvMCCreateSubpicture; 20335c4bbdfSmrg pAdapt[i].DestroySubpicture = xf86XvMCDestroySubpicture; 20435c4bbdfSmrg adaptors++; 20535c4bbdfSmrg } 20635c4bbdfSmrg 20735c4bbdfSmrg if (Success != XvMCScreenInit(pScreen, num_adaptors, pAdapt)) 20835c4bbdfSmrg return FALSE; 20935c4bbdfSmrg 21035c4bbdfSmrg return TRUE; 21105b261ecSmrg} 21205b261ecSmrg 21335c4bbdfSmrgXF86MCAdaptorPtr 21435c4bbdfSmrgxf86XvMCCreateAdaptorRec(void) 21505b261ecSmrg{ 21635c4bbdfSmrg return calloc(1, sizeof(XF86MCAdaptorRec)); 21705b261ecSmrg} 21805b261ecSmrg 21935c4bbdfSmrgvoid 22035c4bbdfSmrgxf86XvMCDestroyAdaptorRec(XF86MCAdaptorPtr adaptor) 22105b261ecSmrg{ 22235c4bbdfSmrg free(adaptor); 22305b261ecSmrg} 224