1*4882a593Smuzhiyun
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2001-2003 by The XFree86 Project, Inc.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
6*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
7*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
8*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
10*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in
13*4882a593Smuzhiyun * all copies or substantial portions of the Software.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*4882a593Smuzhiyun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*4882a593Smuzhiyun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*4882a593Smuzhiyun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*4882a593Smuzhiyun * OTHER DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * Except as contained in this notice, the name of the copyright holder(s)
24*4882a593Smuzhiyun * and author(s) shall not be used in advertising or otherwise to promote
25*4882a593Smuzhiyun * the sale, use or other dealings in this Software without prior written
26*4882a593Smuzhiyun * authorization from the copyright holder(s) and author(s).
27*4882a593Smuzhiyun */
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
30*4882a593Smuzhiyun #include <xorg-config.h>
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include "misc.h"
34*4882a593Smuzhiyun #include "xf86.h"
35*4882a593Smuzhiyun #include "xf86_OSproc.h"
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #include <X11/X.h>
38*4882a593Smuzhiyun #include <X11/Xproto.h>
39*4882a593Smuzhiyun #include "scrnintstr.h"
40*4882a593Smuzhiyun #include "resource.h"
41*4882a593Smuzhiyun #include "dixstruct.h"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #include "xf86xvpriv.h"
44*4882a593Smuzhiyun #include "xf86xvmc.h"
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun typedef struct {
47*4882a593Smuzhiyun CloseScreenProcPtr CloseScreen;
48*4882a593Smuzhiyun int num_adaptors;
49*4882a593Smuzhiyun XF86MCAdaptorPtr *adaptors;
50*4882a593Smuzhiyun XvMCAdaptorPtr dixinfo;
51*4882a593Smuzhiyun } xf86XvMCScreenRec, *xf86XvMCScreenPtr;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun static DevPrivateKeyRec XF86XvMCScreenKeyRec;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #define XF86XvMCScreenKey (&XF86XvMCScreenKeyRec)
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun #define XF86XVMC_GET_PRIVATE(pScreen) (xf86XvMCScreenPtr) \
58*4882a593Smuzhiyun dixLookupPrivate(&(pScreen)->devPrivates, XF86XvMCScreenKey)
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun static int
xf86XvMCCreateContext(XvPortPtr pPort,XvMCContextPtr pContext,int * num_priv,CARD32 ** priv)61*4882a593Smuzhiyun xf86XvMCCreateContext(XvPortPtr pPort,
62*4882a593Smuzhiyun XvMCContextPtr pContext, int *num_priv, CARD32 **priv)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
65*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun pContext->port_priv = (XvPortRecPrivatePtr) (pPort->devPriv.ptr);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun return (*pScreenPriv->adaptors[pContext->adapt_num]->CreateContext) (pScrn,
70*4882a593Smuzhiyun pContext,
71*4882a593Smuzhiyun num_priv,
72*4882a593Smuzhiyun priv);
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun static void
xf86XvMCDestroyContext(XvMCContextPtr pContext)76*4882a593Smuzhiyun xf86XvMCDestroyContext(XvMCContextPtr pContext)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
79*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun (*pScreenPriv->adaptors[pContext->adapt_num]->DestroyContext) (pScrn,
82*4882a593Smuzhiyun pContext);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun static int
xf86XvMCCreateSurface(XvMCSurfacePtr pSurface,int * num_priv,CARD32 ** priv)86*4882a593Smuzhiyun xf86XvMCCreateSurface(XvMCSurfacePtr pSurface, int *num_priv, CARD32 **priv)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun XvMCContextPtr pContext = pSurface->context;
89*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
90*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun return (*pScreenPriv->adaptors[pContext->adapt_num]->CreateSurface) (pScrn,
93*4882a593Smuzhiyun pSurface,
94*4882a593Smuzhiyun num_priv,
95*4882a593Smuzhiyun priv);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static void
xf86XvMCDestroySurface(XvMCSurfacePtr pSurface)99*4882a593Smuzhiyun xf86XvMCDestroySurface(XvMCSurfacePtr pSurface)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun XvMCContextPtr pContext = pSurface->context;
102*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
103*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun (*pScreenPriv->adaptors[pContext->adapt_num]->DestroySurface) (pScrn,
106*4882a593Smuzhiyun pSurface);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun static int
xf86XvMCCreateSubpicture(XvMCSubpicturePtr pSubpicture,int * num_priv,CARD32 ** priv)110*4882a593Smuzhiyun xf86XvMCCreateSubpicture(XvMCSubpicturePtr pSubpicture,
111*4882a593Smuzhiyun int *num_priv, CARD32 **priv)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun XvMCContextPtr pContext = pSubpicture->context;
114*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
115*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun return (*pScreenPriv->adaptors[pContext->adapt_num]->
118*4882a593Smuzhiyun CreateSubpicture) (pScrn, pSubpicture, num_priv, priv);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun static void
xf86XvMCDestroySubpicture(XvMCSubpicturePtr pSubpicture)122*4882a593Smuzhiyun xf86XvMCDestroySubpicture(XvMCSubpicturePtr pSubpicture)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun XvMCContextPtr pContext = pSubpicture->context;
125*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pContext->pScreen);
126*4882a593Smuzhiyun ScrnInfoPtr pScrn = xf86ScreenToScrn(pContext->pScreen);
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun (*pScreenPriv->adaptors[pContext->adapt_num]->DestroySubpicture) (pScrn,
129*4882a593Smuzhiyun pSubpicture);
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun static Bool
xf86XvMCCloseScreen(ScreenPtr pScreen)133*4882a593Smuzhiyun xf86XvMCCloseScreen(ScreenPtr pScreen)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv = XF86XVMC_GET_PRIVATE(pScreen);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun pScreen->CloseScreen = pScreenPriv->CloseScreen;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun free(pScreenPriv->dixinfo);
140*4882a593Smuzhiyun free(pScreenPriv);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun return (*pScreen->CloseScreen) (pScreen);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun Bool
xf86XvMCScreenInit(ScreenPtr pScreen,int num_adaptors,XF86MCAdaptorPtr * adaptors)146*4882a593Smuzhiyun xf86XvMCScreenInit(ScreenPtr pScreen,
147*4882a593Smuzhiyun int num_adaptors, XF86MCAdaptorPtr * adaptors)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun XvMCAdaptorPtr pAdapt;
150*4882a593Smuzhiyun xf86XvMCScreenPtr pScreenPriv;
151*4882a593Smuzhiyun XvScreenPtr pxvs = (XvScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
152*4882a593Smuzhiyun XF86XvScreenKey);
153*4882a593Smuzhiyun int i, j;
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun if (noXvExtension)
156*4882a593Smuzhiyun return FALSE;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (!(pAdapt = xallocarray(num_adaptors, sizeof(XvMCAdaptorRec))))
159*4882a593Smuzhiyun return FALSE;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun if (!dixRegisterPrivateKey(&XF86XvMCScreenKeyRec, PRIVATE_SCREEN, 0)) {
162*4882a593Smuzhiyun free(pAdapt);
163*4882a593Smuzhiyun return FALSE;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun if (!(pScreenPriv = malloc(sizeof(xf86XvMCScreenRec)))) {
167*4882a593Smuzhiyun free(pAdapt);
168*4882a593Smuzhiyun return FALSE;
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun dixSetPrivate(&pScreen->devPrivates, XF86XvMCScreenKey, pScreenPriv);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun pScreenPriv->CloseScreen = pScreen->CloseScreen;
174*4882a593Smuzhiyun pScreen->CloseScreen = xf86XvMCCloseScreen;
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun pScreenPriv->num_adaptors = num_adaptors;
177*4882a593Smuzhiyun pScreenPriv->adaptors = adaptors;
178*4882a593Smuzhiyun pScreenPriv->dixinfo = pAdapt;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun for (i = 0; i < num_adaptors; i++) {
181*4882a593Smuzhiyun pAdapt[i].xv_adaptor = NULL;
182*4882a593Smuzhiyun for (j = 0; j < pxvs->nAdaptors; j++) {
183*4882a593Smuzhiyun if (!strcmp((*adaptors)->name, pxvs->pAdaptors[j].name)) {
184*4882a593Smuzhiyun pAdapt[i].xv_adaptor = &(pxvs->pAdaptors[j]);
185*4882a593Smuzhiyun break;
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun if (!pAdapt[i].xv_adaptor) {
189*4882a593Smuzhiyun /* no adaptor by that name */
190*4882a593Smuzhiyun pScreenPriv->dixinfo = FALSE;
191*4882a593Smuzhiyun free(pAdapt);
192*4882a593Smuzhiyun return FALSE;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun pAdapt[i].num_surfaces = (*adaptors)->num_surfaces;
195*4882a593Smuzhiyun pAdapt[i].surfaces = (XvMCSurfaceInfoPtr *) ((*adaptors)->surfaces);
196*4882a593Smuzhiyun pAdapt[i].num_subpictures = (*adaptors)->num_subpictures;
197*4882a593Smuzhiyun pAdapt[i].subpictures = (XvImagePtr *) ((*adaptors)->subpictures);
198*4882a593Smuzhiyun pAdapt[i].CreateContext = xf86XvMCCreateContext;
199*4882a593Smuzhiyun pAdapt[i].DestroyContext = xf86XvMCDestroyContext;
200*4882a593Smuzhiyun pAdapt[i].CreateSurface = xf86XvMCCreateSurface;
201*4882a593Smuzhiyun pAdapt[i].DestroySurface = xf86XvMCDestroySurface;
202*4882a593Smuzhiyun pAdapt[i].CreateSubpicture = xf86XvMCCreateSubpicture;
203*4882a593Smuzhiyun pAdapt[i].DestroySubpicture = xf86XvMCDestroySubpicture;
204*4882a593Smuzhiyun adaptors++;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun if (Success != XvMCScreenInit(pScreen, num_adaptors, pAdapt))
208*4882a593Smuzhiyun return FALSE;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun return TRUE;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun XF86MCAdaptorPtr
xf86XvMCCreateAdaptorRec(void)214*4882a593Smuzhiyun xf86XvMCCreateAdaptorRec(void)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun return calloc(1, sizeof(XF86MCAdaptorRec));
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun void
xf86XvMCDestroyAdaptorRec(XF86MCAdaptorPtr adaptor)220*4882a593Smuzhiyun xf86XvMCDestroyAdaptorRec(XF86MCAdaptorPtr adaptor)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun free(adaptor);
223*4882a593Smuzhiyun }
224