1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 1998-2003 by The XFree86 Project, Inc.
3*4882a593Smuzhiyun * Copyright © 2013 Red Hat
4*4882a593Smuzhiyun * Copyright © 2014 Intel Corporation
5*4882a593Smuzhiyun * Copyright © 2016 Red Hat
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
8*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
9*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
10*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
12*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next
15*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the
16*4882a593Smuzhiyun * Software.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24*4882a593Smuzhiyun * IN THE SOFTWARE.
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun * Authors:
27*4882a593Smuzhiyun * Olivier Fourdan <ofourdan@redhat.com>
28*4882a593Smuzhiyun *
29*4882a593Smuzhiyun * Derived from the glamor_xf86_xv, ephyr_glamor_xv and xf86xv
30*4882a593Smuzhiyun * implementations
31*4882a593Smuzhiyun */
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include "xwayland.h"
34*4882a593Smuzhiyun #include "glamor_priv.h"
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #include <X11/extensions/Xv.h>
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define NUM_FORMATS 3
39*4882a593Smuzhiyun #define NUM_PORTS 16
40*4882a593Smuzhiyun #define ADAPTOR_NAME "glamor textured video"
41*4882a593Smuzhiyun #define ENCODER_NAME "XV_IMAGE"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun static DevPrivateKeyRec xwlXvScreenPrivateKeyRec;
44*4882a593Smuzhiyun #define xwlXvScreenPrivateKey (&xwlXvScreenPrivateKeyRec)
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun typedef struct {
47*4882a593Smuzhiyun XvAdaptorPtr glxv_adaptor; /* We have only one adaptor, glamor Xv */
48*4882a593Smuzhiyun glamor_port_private *port_privates;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun CloseScreenProcPtr CloseScreen;
51*4882a593Smuzhiyun } xwlXvScreenRec, *xwlXvScreenPtr;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun typedef struct {
54*4882a593Smuzhiyun char depth;
55*4882a593Smuzhiyun short class;
56*4882a593Smuzhiyun } xwlVideoFormatRec, *xwlVideoFormatPtr;
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun static xwlVideoFormatRec Formats[NUM_FORMATS] = {
59*4882a593Smuzhiyun {15, TrueColor},
60*4882a593Smuzhiyun {16, TrueColor},
61*4882a593Smuzhiyun {24, TrueColor}
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun static int
xwl_glamor_xv_stop_video(XvPortPtr pPort,DrawablePtr pDraw)65*4882a593Smuzhiyun xwl_glamor_xv_stop_video(XvPortPtr pPort,
66*4882a593Smuzhiyun DrawablePtr pDraw)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun if (pDraw->type != DRAWABLE_WINDOW)
71*4882a593Smuzhiyun return BadAlloc;
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun glamor_xv_stop_video(gpp);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun return Success;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun static int
xwl_glamor_xv_set_port_attribute(XvPortPtr pPort,Atom attribute,INT32 value)79*4882a593Smuzhiyun xwl_glamor_xv_set_port_attribute(XvPortPtr pPort,
80*4882a593Smuzhiyun Atom attribute,
81*4882a593Smuzhiyun INT32 value)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun return glamor_xv_set_port_attribute(gpp, attribute, value);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun static int
xwl_glamor_xv_get_port_attribute(XvPortPtr pPort,Atom attribute,INT32 * pValue)89*4882a593Smuzhiyun xwl_glamor_xv_get_port_attribute(XvPortPtr pPort,
90*4882a593Smuzhiyun Atom attribute,
91*4882a593Smuzhiyun INT32 *pValue)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun return glamor_xv_get_port_attribute(gpp, attribute, pValue);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static int
xwl_glamor_xv_query_best_size(XvPortPtr pPort,CARD8 motion,CARD16 vid_w,CARD16 vid_h,CARD16 drw_w,CARD16 drw_h,unsigned int * p_w,unsigned int * p_h)99*4882a593Smuzhiyun xwl_glamor_xv_query_best_size(XvPortPtr pPort,
100*4882a593Smuzhiyun CARD8 motion,
101*4882a593Smuzhiyun CARD16 vid_w,
102*4882a593Smuzhiyun CARD16 vid_h,
103*4882a593Smuzhiyun CARD16 drw_w,
104*4882a593Smuzhiyun CARD16 drw_h,
105*4882a593Smuzhiyun unsigned int *p_w,
106*4882a593Smuzhiyun unsigned int *p_h)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun *p_w = drw_w;
109*4882a593Smuzhiyun *p_h = drw_h;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun return Success;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun static int
xwl_glamor_xv_query_image_attributes(XvPortPtr pPort,XvImagePtr format,CARD16 * width,CARD16 * height,int * pitches,int * offsets)115*4882a593Smuzhiyun xwl_glamor_xv_query_image_attributes(XvPortPtr pPort,
116*4882a593Smuzhiyun XvImagePtr format,
117*4882a593Smuzhiyun CARD16 *width,
118*4882a593Smuzhiyun CARD16 *height,
119*4882a593Smuzhiyun int *pitches,
120*4882a593Smuzhiyun int *offsets)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun return glamor_xv_query_image_attributes(format->id,
123*4882a593Smuzhiyun width,
124*4882a593Smuzhiyun height,
125*4882a593Smuzhiyun pitches,
126*4882a593Smuzhiyun offsets);
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun static int
xwl_glamor_xv_put_image(DrawablePtr pDrawable,XvPortPtr pPort,GCPtr pGC,INT16 src_x,INT16 src_y,CARD16 src_w,CARD16 src_h,INT16 drw_x,INT16 drw_y,CARD16 drw_w,CARD16 drw_h,XvImagePtr format,unsigned char * data,Bool sync,CARD16 width,CARD16 height)130*4882a593Smuzhiyun xwl_glamor_xv_put_image(DrawablePtr pDrawable,
131*4882a593Smuzhiyun XvPortPtr pPort,
132*4882a593Smuzhiyun GCPtr pGC,
133*4882a593Smuzhiyun INT16 src_x,
134*4882a593Smuzhiyun INT16 src_y,
135*4882a593Smuzhiyun CARD16 src_w,
136*4882a593Smuzhiyun CARD16 src_h,
137*4882a593Smuzhiyun INT16 drw_x,
138*4882a593Smuzhiyun INT16 drw_y,
139*4882a593Smuzhiyun CARD16 drw_w,
140*4882a593Smuzhiyun CARD16 drw_h,
141*4882a593Smuzhiyun XvImagePtr format,
142*4882a593Smuzhiyun unsigned char *data,
143*4882a593Smuzhiyun Bool sync,
144*4882a593Smuzhiyun CARD16 width,
145*4882a593Smuzhiyun CARD16 height)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun glamor_port_private *gpp = (glamor_port_private *) (pPort->devPriv.ptr);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun RegionRec WinRegion;
150*4882a593Smuzhiyun RegionRec ClipRegion;
151*4882a593Smuzhiyun BoxRec WinBox;
152*4882a593Smuzhiyun int ret = Success;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun if (pDrawable->type != DRAWABLE_WINDOW)
155*4882a593Smuzhiyun return BadWindow;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun WinBox.x1 = pDrawable->x + drw_x;
158*4882a593Smuzhiyun WinBox.y1 = pDrawable->y + drw_y;
159*4882a593Smuzhiyun WinBox.x2 = WinBox.x1 + drw_w;
160*4882a593Smuzhiyun WinBox.y2 = WinBox.y1 + drw_h;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun RegionInit(&WinRegion, &WinBox, 1);
163*4882a593Smuzhiyun RegionInit(&ClipRegion, NullBox, 1);
164*4882a593Smuzhiyun RegionIntersect(&ClipRegion, &WinRegion, pGC->pCompositeClip);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun if (RegionNotEmpty(&ClipRegion))
167*4882a593Smuzhiyun ret = glamor_xv_put_image(gpp,
168*4882a593Smuzhiyun pDrawable,
169*4882a593Smuzhiyun src_x,
170*4882a593Smuzhiyun src_y,
171*4882a593Smuzhiyun pDrawable->x + drw_x,
172*4882a593Smuzhiyun pDrawable->y + drw_y,
173*4882a593Smuzhiyun src_w,
174*4882a593Smuzhiyun src_h,
175*4882a593Smuzhiyun drw_w,
176*4882a593Smuzhiyun drw_h,
177*4882a593Smuzhiyun format->id,
178*4882a593Smuzhiyun data,
179*4882a593Smuzhiyun width,
180*4882a593Smuzhiyun height,
181*4882a593Smuzhiyun sync,
182*4882a593Smuzhiyun &ClipRegion);
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun RegionUninit(&WinRegion);
185*4882a593Smuzhiyun RegionUninit(&ClipRegion);
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun return ret;
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun static Bool
xwl_glamor_xv_add_formats(XvAdaptorPtr pa)192*4882a593Smuzhiyun xwl_glamor_xv_add_formats(XvAdaptorPtr pa)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun ScreenPtr pScreen;
195*4882a593Smuzhiyun XvFormatPtr pFormat, pf;
196*4882a593Smuzhiyun VisualPtr pVisual;
197*4882a593Smuzhiyun int numFormat;
198*4882a593Smuzhiyun int totFormat;
199*4882a593Smuzhiyun int numVisuals;
200*4882a593Smuzhiyun int i;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun totFormat = NUM_FORMATS;
203*4882a593Smuzhiyun pFormat = xnfcalloc(totFormat, sizeof(XvFormatRec));
204*4882a593Smuzhiyun pScreen = pa->pScreen;
205*4882a593Smuzhiyun for (pf = pFormat, i = 0, numFormat = 0; i < NUM_FORMATS; i++) {
206*4882a593Smuzhiyun numVisuals = pScreen->numVisuals;
207*4882a593Smuzhiyun pVisual = pScreen->visuals;
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun while (numVisuals--) {
210*4882a593Smuzhiyun if ((pVisual->class == Formats[i].class) &&
211*4882a593Smuzhiyun (pVisual->nplanes == Formats[i].depth)) {
212*4882a593Smuzhiyun if (numFormat >= totFormat) {
213*4882a593Smuzhiyun void *moreSpace;
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun totFormat *= 2;
216*4882a593Smuzhiyun moreSpace = xnfreallocarray(pFormat, totFormat,
217*4882a593Smuzhiyun sizeof(XvFormatRec));
218*4882a593Smuzhiyun pFormat = moreSpace;
219*4882a593Smuzhiyun pf = pFormat + numFormat;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun pf->visual = pVisual->vid;
223*4882a593Smuzhiyun pf->depth = Formats[i].depth;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun pf++;
226*4882a593Smuzhiyun numFormat++;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun pVisual++;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun pa->nFormats = numFormat;
232*4882a593Smuzhiyun pa->pFormats = pFormat;
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun return numFormat != 0;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun static Bool
xwl_glamor_xv_add_ports(XvAdaptorPtr pa)238*4882a593Smuzhiyun xwl_glamor_xv_add_ports(XvAdaptorPtr pa)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun XvPortPtr pPorts, pp;
241*4882a593Smuzhiyun xwlXvScreenPtr xwlXvScreen;
242*4882a593Smuzhiyun unsigned long PortResource = 0;
243*4882a593Smuzhiyun int nPorts;
244*4882a593Smuzhiyun int i;
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun pPorts = xnfcalloc(NUM_PORTS, sizeof(XvPortRec));
247*4882a593Smuzhiyun xwlXvScreen = dixLookupPrivate(&(pa->pScreen)->devPrivates,
248*4882a593Smuzhiyun xwlXvScreenPrivateKey);
249*4882a593Smuzhiyun xwlXvScreen->port_privates = xnfcalloc(NUM_PORTS,
250*4882a593Smuzhiyun sizeof(glamor_port_private));
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun PortResource = XvGetRTPort();
253*4882a593Smuzhiyun for (pp = pPorts, i = 0, nPorts = 0; i < NUM_PORTS; i++) {
254*4882a593Smuzhiyun if (!(pp->id = FakeClientID(0)))
255*4882a593Smuzhiyun continue;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun pp->pAdaptor = pa;
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun glamor_xv_init_port(&xwlXvScreen->port_privates[i]);
260*4882a593Smuzhiyun pp->devPriv.ptr = &xwlXvScreen->port_privates[i];
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun if (AddResource(pp->id, PortResource, pp)) {
263*4882a593Smuzhiyun pp++;
264*4882a593Smuzhiyun nPorts++;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun pa->base_id = pPorts->id;
269*4882a593Smuzhiyun pa->nPorts = nPorts;
270*4882a593Smuzhiyun pa->pPorts = pPorts;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun return nPorts != 0;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun static void
xwl_glamor_xv_add_attributes(XvAdaptorPtr pa)276*4882a593Smuzhiyun xwl_glamor_xv_add_attributes(XvAdaptorPtr pa)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun int i;
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun pa->pAttributes = xnfcalloc(glamor_xv_num_attributes, sizeof(XvAttributeRec));
281*4882a593Smuzhiyun memcpy(pa->pAttributes, glamor_xv_attributes,
282*4882a593Smuzhiyun glamor_xv_num_attributes * sizeof(XvAttributeRec));
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun for (i = 0; i < glamor_xv_num_attributes; i++)
285*4882a593Smuzhiyun pa->pAttributes[i].name = strdup(glamor_xv_attributes[i].name);
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun pa->nAttributes = glamor_xv_num_attributes;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun static void
xwl_glamor_xv_add_images(XvAdaptorPtr pa)291*4882a593Smuzhiyun xwl_glamor_xv_add_images(XvAdaptorPtr pa)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun pa->pImages = xnfcalloc(glamor_xv_num_images, sizeof(XvImageRec));
294*4882a593Smuzhiyun memcpy(pa->pImages, glamor_xv_images, glamor_xv_num_images * sizeof(XvImageRec));
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun pa->nImages = glamor_xv_num_images;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun static void
xwl_glamor_xv_add_encodings(XvAdaptorPtr pa)300*4882a593Smuzhiyun xwl_glamor_xv_add_encodings(XvAdaptorPtr pa)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun XvEncodingPtr pe;
303*4882a593Smuzhiyun GLint texsize;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texsize);
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun pe = xnfcalloc(1, sizeof(XvEncodingRec));
308*4882a593Smuzhiyun pe->id = 0;
309*4882a593Smuzhiyun pe->pScreen = pa->pScreen;
310*4882a593Smuzhiyun pe->name = strdup(ENCODER_NAME);
311*4882a593Smuzhiyun pe->width = texsize;
312*4882a593Smuzhiyun pe->height = texsize;
313*4882a593Smuzhiyun pe->rate.numerator = 1;
314*4882a593Smuzhiyun pe->rate.denominator = 1;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun pa->pEncodings = pe;
317*4882a593Smuzhiyun pa->nEncodings = 1;
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun static Bool
xwl_glamor_xv_add_adaptors(ScreenPtr pScreen)321*4882a593Smuzhiyun xwl_glamor_xv_add_adaptors(ScreenPtr pScreen)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun DevPrivateKey XvScreenKey;
324*4882a593Smuzhiyun XvScreenPtr XvScreen;
325*4882a593Smuzhiyun xwlXvScreenPtr xwlXvScreen;
326*4882a593Smuzhiyun XvAdaptorPtr pa;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun if (XvScreenInit(pScreen) != Success)
329*4882a593Smuzhiyun return FALSE;
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun XvScreenKey = XvGetScreenKey();
332*4882a593Smuzhiyun XvScreen = dixLookupPrivate(&(pScreen)->devPrivates, XvScreenKey);
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun XvScreen->nAdaptors = 0;
335*4882a593Smuzhiyun XvScreen->pAdaptors = NULL;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun pa = xnfcalloc(1, sizeof(XvAdaptorRec));
338*4882a593Smuzhiyun pa->pScreen = pScreen;
339*4882a593Smuzhiyun pa->type = (unsigned char) (XvInputMask | XvImageMask);
340*4882a593Smuzhiyun pa->ddStopVideo = xwl_glamor_xv_stop_video;
341*4882a593Smuzhiyun pa->ddPutImage = xwl_glamor_xv_put_image;
342*4882a593Smuzhiyun pa->ddSetPortAttribute = xwl_glamor_xv_set_port_attribute;
343*4882a593Smuzhiyun pa->ddGetPortAttribute = xwl_glamor_xv_get_port_attribute;
344*4882a593Smuzhiyun pa->ddQueryBestSize = xwl_glamor_xv_query_best_size;
345*4882a593Smuzhiyun pa->ddQueryImageAttributes = xwl_glamor_xv_query_image_attributes;
346*4882a593Smuzhiyun pa->name = strdup(ADAPTOR_NAME);
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun xwl_glamor_xv_add_encodings(pa);
349*4882a593Smuzhiyun xwl_glamor_xv_add_images(pa);
350*4882a593Smuzhiyun xwl_glamor_xv_add_attributes(pa);
351*4882a593Smuzhiyun if (!xwl_glamor_xv_add_formats(pa))
352*4882a593Smuzhiyun goto failed;
353*4882a593Smuzhiyun if (!xwl_glamor_xv_add_ports(pa))
354*4882a593Smuzhiyun goto failed;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun /* We're good now with out Xv adaptor */
357*4882a593Smuzhiyun XvScreen->nAdaptors = 1;
358*4882a593Smuzhiyun XvScreen->pAdaptors = pa;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun xwlXvScreen = dixLookupPrivate(&(pa->pScreen)->devPrivates,
361*4882a593Smuzhiyun xwlXvScreenPrivateKey);
362*4882a593Smuzhiyun xwlXvScreen->glxv_adaptor = pa;
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun return TRUE;
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun failed:
367*4882a593Smuzhiyun XvFreeAdaptor(pa);
368*4882a593Smuzhiyun free(pa);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun return FALSE;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun static Bool
xwl_glamor_xv_close_screen(ScreenPtr pScreen)374*4882a593Smuzhiyun xwl_glamor_xv_close_screen(ScreenPtr pScreen)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun xwlXvScreenPtr xwlXvScreen;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
379*4882a593Smuzhiyun xwlXvScreenPrivateKey);
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun if (xwlXvScreen->glxv_adaptor) {
382*4882a593Smuzhiyun XvFreeAdaptor(xwlXvScreen->glxv_adaptor);
383*4882a593Smuzhiyun free(xwlXvScreen->glxv_adaptor);
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun free(xwlXvScreen->port_privates);
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun pScreen->CloseScreen = xwlXvScreen->CloseScreen;
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun return pScreen->CloseScreen(pScreen);
390*4882a593Smuzhiyun }
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun Bool
xwl_glamor_xv_init(ScreenPtr pScreen)393*4882a593Smuzhiyun xwl_glamor_xv_init(ScreenPtr pScreen)
394*4882a593Smuzhiyun {
395*4882a593Smuzhiyun xwlXvScreenPtr xwlXvScreen;
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun if (!dixRegisterPrivateKey(xwlXvScreenPrivateKey, PRIVATE_SCREEN,
398*4882a593Smuzhiyun sizeof(xwlXvScreenRec)))
399*4882a593Smuzhiyun return FALSE;
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
402*4882a593Smuzhiyun xwlXvScreenPrivateKey);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun xwlXvScreen->port_privates = NULL;
405*4882a593Smuzhiyun xwlXvScreen->glxv_adaptor = NULL;
406*4882a593Smuzhiyun xwlXvScreen->CloseScreen = pScreen->CloseScreen;
407*4882a593Smuzhiyun pScreen->CloseScreen = xwl_glamor_xv_close_screen;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun glamor_xv_core_init(pScreen);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun return xwl_glamor_xv_add_adaptors(pScreen);
412*4882a593Smuzhiyun }
413