xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/glamor_egl/glamor_xf86_xv.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright © 2013 Red Hat
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *      Dave Airlie <airlied@redhat.com>
25  *
26  * some code is derived from the xf86-video-ati radeon driver, mainly
27  * the calculations.
28  */
29 
30 /** @file glamor_xf86_xv.c
31  *
32  * This implements the XF86 XV interface, and calls into glamor core
33  * for its support of the suspiciously similar XF86 and Kdrive
34  * device-dependent XV interfaces.
35  */
36 
37 #ifdef HAVE_DIX_CONFIG_H
38 #include <dix-config.h>
39 #endif
40 
41 #define GLAMOR_FOR_XORG
42 #include "glamor_priv.h"
43 
44 #include <X11/extensions/Xv.h>
45 #include "fourcc.h"
46 
47 #define NUM_FORMATS 4
48 
49 static XF86VideoFormatRec Formats[NUM_FORMATS] = {
50     {15, TrueColor}, {16, TrueColor}, {24, TrueColor}, {30, TrueColor}
51 };
52 
53 static void
glamor_xf86_xv_stop_video(ScrnInfoPtr pScrn,void * data,Bool cleanup)54 glamor_xf86_xv_stop_video(ScrnInfoPtr pScrn, void *data, Bool cleanup)
55 {
56     if (!cleanup)
57         return;
58 
59     glamor_xv_stop_video(data);
60 }
61 
62 static int
glamor_xf86_xv_set_port_attribute(ScrnInfoPtr pScrn,Atom attribute,INT32 value,void * data)63 glamor_xf86_xv_set_port_attribute(ScrnInfoPtr pScrn,
64                                   Atom attribute, INT32 value, void *data)
65 {
66     return glamor_xv_set_port_attribute(data, attribute, value);
67 }
68 
69 static int
glamor_xf86_xv_get_port_attribute(ScrnInfoPtr pScrn,Atom attribute,INT32 * value,void * data)70 glamor_xf86_xv_get_port_attribute(ScrnInfoPtr pScrn,
71                                   Atom attribute, INT32 *value, void *data)
72 {
73     return glamor_xv_get_port_attribute(data, attribute, value);
74 }
75 
76 static void
glamor_xf86_xv_query_best_size(ScrnInfoPtr pScrn,Bool motion,short vid_w,short vid_h,short drw_w,short drw_h,unsigned int * p_w,unsigned int * p_h,void * data)77 glamor_xf86_xv_query_best_size(ScrnInfoPtr pScrn,
78                                Bool motion,
79                                short vid_w, short vid_h,
80                                short drw_w, short drw_h,
81                                unsigned int *p_w, unsigned int *p_h, void *data)
82 {
83     *p_w = drw_w;
84     *p_h = drw_h;
85 }
86 
87 static int
glamor_xf86_xv_query_image_attributes(ScrnInfoPtr pScrn,int id,unsigned short * w,unsigned short * h,int * pitches,int * offsets)88 glamor_xf86_xv_query_image_attributes(ScrnInfoPtr pScrn,
89                                       int id,
90                                       unsigned short *w, unsigned short *h,
91                                       int *pitches, int *offsets)
92 {
93     return glamor_xv_query_image_attributes(id, w, h, pitches, offsets);
94 }
95 
96 static int
glamor_xf86_xv_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,void * data,DrawablePtr pDrawable)97 glamor_xf86_xv_put_image(ScrnInfoPtr pScrn,
98                     short src_x, short src_y,
99                     short drw_x, short drw_y,
100                     short src_w, short src_h,
101                     short drw_w, short drw_h,
102                     int id,
103                     unsigned char *buf,
104                     short width,
105                     short height,
106                     Bool sync,
107                     RegionPtr clipBoxes, void *data, DrawablePtr pDrawable)
108 {
109     return glamor_xv_put_image(data, pDrawable,
110                                src_x, src_y,
111                                drw_x, drw_y,
112                                src_w, src_h,
113                                drw_w, drw_h,
114                                id, buf, width, height, sync, clipBoxes);
115 }
116 
117 static XF86VideoEncodingRec DummyEncodingGLAMOR[1] = {
118     {
119      0,
120      "XV_IMAGE",
121      8192, 8192,
122      {1, 1}
123      }
124 };
125 
126 XF86VideoAdaptorPtr
glamor_xv_init(ScreenPtr screen,int num_texture_ports)127 glamor_xv_init(ScreenPtr screen, int num_texture_ports)
128 {
129     glamor_port_private *port_priv;
130     XF86VideoAdaptorPtr adapt;
131     int i;
132 
133     glamor_xv_core_init(screen);
134 
135     adapt = calloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports *
136                    (sizeof(glamor_port_private) + sizeof(DevUnion)));
137     if (adapt == NULL)
138         return NULL;
139 
140     adapt->type = XvWindowMask | XvInputMask | XvImageMask;
141     adapt->flags = 0;
142     adapt->name = "GLAMOR Textured Video";
143     adapt->nEncodings = 1;
144     adapt->pEncodings = DummyEncodingGLAMOR;
145 
146     adapt->nFormats = NUM_FORMATS;
147     adapt->pFormats = Formats;
148     adapt->nPorts = num_texture_ports;
149     adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
150 
151     adapt->pAttributes = glamor_xv_attributes;
152     adapt->nAttributes = glamor_xv_num_attributes;
153 
154     port_priv =
155         (glamor_port_private *) (&adapt->pPortPrivates[num_texture_ports]);
156     adapt->pImages = glamor_xv_images;
157     adapt->nImages = glamor_xv_num_images;
158     adapt->PutVideo = NULL;
159     adapt->PutStill = NULL;
160     adapt->GetVideo = NULL;
161     adapt->GetStill = NULL;
162     adapt->StopVideo = glamor_xf86_xv_stop_video;
163     adapt->SetPortAttribute = glamor_xf86_xv_set_port_attribute;
164     adapt->GetPortAttribute = glamor_xf86_xv_get_port_attribute;
165     adapt->QueryBestSize = glamor_xf86_xv_query_best_size;
166     adapt->PutImage = glamor_xf86_xv_put_image;
167     adapt->ReputImage = NULL;
168     adapt->QueryImageAttributes = glamor_xf86_xv_query_image_attributes;
169 
170     for (i = 0; i < num_texture_ports; i++) {
171         glamor_port_private *pPriv = &port_priv[i];
172 
173         glamor_xv_init_port(pPriv);
174         adapt->pPortPrivates[i].ptr = (void *) (pPriv);
175     }
176     return adapt;
177 }
178