xref: /OK3568_Linux_fs/external/xserver/hw/xwayland/xwayland-glamor-xv.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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