xref: /OK3568_Linux_fs/external/xserver/hw/xwin/dri/windowsdri.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright © 2014 Jon Turney
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun  * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun  * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*4882a593Smuzhiyun  * IN THE SOFTWARE.
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
25*4882a593Smuzhiyun #include <dix-config.h>
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #include <X11/X.h>
29*4882a593Smuzhiyun #include <X11/Xproto.h>
30*4882a593Smuzhiyun #include <X11/extensions/windowsdristr.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include "dixstruct.h"
33*4882a593Smuzhiyun #include "extnsionst.h"
34*4882a593Smuzhiyun #include "scrnintstr.h"
35*4882a593Smuzhiyun #include "swaprep.h"
36*4882a593Smuzhiyun #include "protocol-versions.h"
37*4882a593Smuzhiyun #include "windowsdri.h"
38*4882a593Smuzhiyun #include "glx/dri_helpers.h"
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun static int WindowsDRIErrorBase = 0;
41*4882a593Smuzhiyun static unsigned char WindowsDRIReqCode = 0;
42*4882a593Smuzhiyun static int WindowsDRIEventBase = 0;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun static void
WindowsDRIResetProc(ExtensionEntry * extEntry)45*4882a593Smuzhiyun WindowsDRIResetProc(ExtensionEntry* extEntry)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun static int
ProcWindowsDRIQueryVersion(ClientPtr client)50*4882a593Smuzhiyun ProcWindowsDRIQueryVersion(ClientPtr client)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun     xWindowsDRIQueryVersionReply rep;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xWindowsDRIQueryVersionReq);
55*4882a593Smuzhiyun     rep.type = X_Reply;
56*4882a593Smuzhiyun     rep.length = 0;
57*4882a593Smuzhiyun     rep.sequenceNumber = client->sequence;
58*4882a593Smuzhiyun     rep.majorVersion = SERVER_WINDOWSDRI_MAJOR_VERSION;
59*4882a593Smuzhiyun     rep.minorVersion = SERVER_WINDOWSDRI_MINOR_VERSION;
60*4882a593Smuzhiyun     rep.patchVersion = SERVER_WINDOWSDRI_PATCH_VERSION;
61*4882a593Smuzhiyun     if (client->swapped) {
62*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
63*4882a593Smuzhiyun         swapl(&rep.length);
64*4882a593Smuzhiyun         swaps(&rep.majorVersion);
65*4882a593Smuzhiyun         swaps(&rep.minorVersion);
66*4882a593Smuzhiyun         swapl(&rep.patchVersion);
67*4882a593Smuzhiyun     }
68*4882a593Smuzhiyun     WriteToClient(client, sizeof(xWindowsDRIQueryVersionReply), &rep);
69*4882a593Smuzhiyun     return Success;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun static int
ProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)73*4882a593Smuzhiyun ProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun     xWindowsDRIQueryDirectRenderingCapableReply rep;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun     REQUEST(xWindowsDRIQueryDirectRenderingCapableReq);
78*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xWindowsDRIQueryDirectRenderingCapableReq);
79*4882a593Smuzhiyun     rep.type = X_Reply;
80*4882a593Smuzhiyun     rep.length = 0;
81*4882a593Smuzhiyun     rep.sequenceNumber = client->sequence;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun     if (!client->local)
84*4882a593Smuzhiyun         rep.isCapable = 0;
85*4882a593Smuzhiyun     else
86*4882a593Smuzhiyun         rep.isCapable = glxWinGetScreenAiglxIsActive(screenInfo.screens[stuff->screen]);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun     if (client->swapped) {
89*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
90*4882a593Smuzhiyun         swapl(&rep.length);
91*4882a593Smuzhiyun     }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     WriteToClient(client,
94*4882a593Smuzhiyun                   sizeof(xWindowsDRIQueryDirectRenderingCapableReply),
95*4882a593Smuzhiyun                   &rep);
96*4882a593Smuzhiyun     return Success;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun static int
ProcWindowsDRIQueryDrawable(ClientPtr client)100*4882a593Smuzhiyun ProcWindowsDRIQueryDrawable(ClientPtr client)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun     xWindowsDRIQueryDrawableReply rep;
103*4882a593Smuzhiyun     int rc;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     REQUEST(xWindowsDRIQueryDrawableReq);
106*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xWindowsDRIQueryDrawableReq);
107*4882a593Smuzhiyun     rep.type = X_Reply;
108*4882a593Smuzhiyun     rep.length = 0;
109*4882a593Smuzhiyun     rep.sequenceNumber = client->sequence;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     rc = glxWinQueryDrawable(client, stuff->drawable, &(rep.drawable_type), &(rep.handle));
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun     if (rc)
114*4882a593Smuzhiyun         return rc;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun     if (client->swapped) {
117*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
118*4882a593Smuzhiyun         swapl(&rep.length);
119*4882a593Smuzhiyun         swapl(&rep.handle);
120*4882a593Smuzhiyun         swapl(&rep.drawable_type);
121*4882a593Smuzhiyun     }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     WriteToClient(client, sizeof(xWindowsDRIQueryDrawableReply), &rep);
124*4882a593Smuzhiyun     return Success;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun static int
ProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)128*4882a593Smuzhiyun ProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun     xWindowsDRIFBConfigToPixelFormatReply rep;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun     REQUEST(xWindowsDRIFBConfigToPixelFormatReq);
133*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xWindowsDRIFBConfigToPixelFormatReq);
134*4882a593Smuzhiyun     rep.type = X_Reply;
135*4882a593Smuzhiyun     rep.length = 0;
136*4882a593Smuzhiyun     rep.sequenceNumber = client->sequence;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun     rep.pixelFormatIndex = glxWinFBConfigIDToPixelFormatIndex(stuff->screen, stuff->fbConfigID);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     if (client->swapped) {
141*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
142*4882a593Smuzhiyun         swapl(&rep.length);
143*4882a593Smuzhiyun         swapl(&rep.pixelFormatIndex);
144*4882a593Smuzhiyun     }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun     WriteToClient(client, sizeof(xWindowsDRIFBConfigToPixelFormatReply), &rep);
147*4882a593Smuzhiyun     return Success;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* dispatch */
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun static int
ProcWindowsDRIDispatch(ClientPtr client)153*4882a593Smuzhiyun ProcWindowsDRIDispatch(ClientPtr client)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun     REQUEST(xReq);
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun     switch (stuff->data) {
158*4882a593Smuzhiyun     case X_WindowsDRIQueryVersion:
159*4882a593Smuzhiyun         return ProcWindowsDRIQueryVersion(client);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun     case X_WindowsDRIQueryDirectRenderingCapable:
162*4882a593Smuzhiyun         return ProcWindowsDRIQueryDirectRenderingCapable(client);
163*4882a593Smuzhiyun     }
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun     if (!client->local)
166*4882a593Smuzhiyun         return WindowsDRIErrorBase + WindowsDRIClientNotLocal;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun     switch (stuff->data) {
169*4882a593Smuzhiyun     case X_WindowsDRIQueryDrawable:
170*4882a593Smuzhiyun         return ProcWindowsDRIQueryDrawable(client);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     case X_WindowsDRIFBConfigToPixelFormat:
173*4882a593Smuzhiyun         return ProcWindowsDRIFBConfigToPixelFormat(client);
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     default:
176*4882a593Smuzhiyun         return BadRequest;
177*4882a593Smuzhiyun     }
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun static void
SNotifyEvent(xWindowsDRINotifyEvent * from,xWindowsDRINotifyEvent * to)181*4882a593Smuzhiyun SNotifyEvent(xWindowsDRINotifyEvent *from,
182*4882a593Smuzhiyun              xWindowsDRINotifyEvent *to)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun     to->type = from->type;
185*4882a593Smuzhiyun     to->kind = from->kind;
186*4882a593Smuzhiyun     cpswaps(from->sequenceNumber, to->sequenceNumber);
187*4882a593Smuzhiyun     cpswapl(from->time, to->time);
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun static int
SProcWindowsDRIQueryVersion(ClientPtr client)191*4882a593Smuzhiyun SProcWindowsDRIQueryVersion(ClientPtr client)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun     REQUEST(xWindowsDRIQueryVersionReq);
194*4882a593Smuzhiyun     swaps(&stuff->length);
195*4882a593Smuzhiyun     return ProcWindowsDRIQueryVersion(client);
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun static int
SProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)199*4882a593Smuzhiyun SProcWindowsDRIQueryDirectRenderingCapable(ClientPtr client)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun     REQUEST(xWindowsDRIQueryDirectRenderingCapableReq);
202*4882a593Smuzhiyun     swaps(&stuff->length);
203*4882a593Smuzhiyun     swapl(&stuff->screen);
204*4882a593Smuzhiyun     return ProcWindowsDRIQueryDirectRenderingCapable(client);
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun static int
SProcWindowsDRIQueryDrawable(ClientPtr client)208*4882a593Smuzhiyun SProcWindowsDRIQueryDrawable(ClientPtr client)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun     REQUEST(xWindowsDRIQueryDrawableReq);
211*4882a593Smuzhiyun     swaps(&stuff->length);
212*4882a593Smuzhiyun     swapl(&stuff->screen);
213*4882a593Smuzhiyun     swapl(&stuff->drawable);
214*4882a593Smuzhiyun     return ProcWindowsDRIQueryDrawable(client);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun static int
SProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)218*4882a593Smuzhiyun SProcWindowsDRIFBConfigToPixelFormat(ClientPtr client)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun     REQUEST(xWindowsDRIFBConfigToPixelFormatReq);
221*4882a593Smuzhiyun     swaps(&stuff->length);
222*4882a593Smuzhiyun     swapl(&stuff->screen);
223*4882a593Smuzhiyun     swapl(&stuff->fbConfigID);
224*4882a593Smuzhiyun     return ProcWindowsDRIFBConfigToPixelFormat(client);
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun static int
SProcWindowsDRIDispatch(ClientPtr client)228*4882a593Smuzhiyun SProcWindowsDRIDispatch(ClientPtr client)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun     REQUEST(xReq);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun     switch (stuff->data) {
233*4882a593Smuzhiyun     case X_WindowsDRIQueryVersion:
234*4882a593Smuzhiyun         return SProcWindowsDRIQueryVersion(client);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun     case X_WindowsDRIQueryDirectRenderingCapable:
237*4882a593Smuzhiyun         return SProcWindowsDRIQueryDirectRenderingCapable(client);
238*4882a593Smuzhiyun     }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun     if (!client->local)
241*4882a593Smuzhiyun         return WindowsDRIErrorBase + WindowsDRIClientNotLocal;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun     switch (stuff->data) {
244*4882a593Smuzhiyun     case X_WindowsDRIQueryDrawable:
245*4882a593Smuzhiyun         return SProcWindowsDRIQueryDrawable(client);
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun     case X_WindowsDRIFBConfigToPixelFormat:
248*4882a593Smuzhiyun         return SProcWindowsDRIFBConfigToPixelFormat(client);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun     default:
251*4882a593Smuzhiyun         return BadRequest;
252*4882a593Smuzhiyun     }
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun void
WindowsDRIExtensionInit(void)256*4882a593Smuzhiyun WindowsDRIExtensionInit(void)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun     ExtensionEntry* extEntry;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun     if ((extEntry = AddExtension(WINDOWSDRINAME,
261*4882a593Smuzhiyun                                  WindowsDRINumberEvents,
262*4882a593Smuzhiyun                                  WindowsDRINumberErrors,
263*4882a593Smuzhiyun                                  ProcWindowsDRIDispatch,
264*4882a593Smuzhiyun                                  SProcWindowsDRIDispatch,
265*4882a593Smuzhiyun                                  WindowsDRIResetProc,
266*4882a593Smuzhiyun                                  StandardMinorOpcode))) {
267*4882a593Smuzhiyun         size_t i;
268*4882a593Smuzhiyun         WindowsDRIReqCode = (unsigned char)extEntry->base;
269*4882a593Smuzhiyun         WindowsDRIErrorBase = extEntry->errorBase;
270*4882a593Smuzhiyun         WindowsDRIEventBase = extEntry->eventBase;
271*4882a593Smuzhiyun         for (i = 0; i < WindowsDRINumberEvents; i++)
272*4882a593Smuzhiyun             EventSwapVector[WindowsDRIEventBase + i] = (EventSwapPtr)SNotifyEvent;
273*4882a593Smuzhiyun     }
274*4882a593Smuzhiyun }
275