xref: /aosp_15_r20/external/mesa3d/src/glx/windows/xwindowsdri.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 Jon Turney
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker /* THIS IS NOT AN X CONSORTIUM STANDARD */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include <X11/Xlibint.h>
27*61046927SAndroid Build Coastguard Worker #include <X11/extensions/Xext.h>
28*61046927SAndroid Build Coastguard Worker #include <X11/extensions/extutil.h>
29*61046927SAndroid Build Coastguard Worker #include "windowsdristr.h"
30*61046927SAndroid Build Coastguard Worker #include "xwindowsdri.h"
31*61046927SAndroid Build Coastguard Worker #include <stdio.h>
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker static XExtensionInfo _windowsdri_info_data;
34*61046927SAndroid Build Coastguard Worker static XExtensionInfo *windowsdri_info = &_windowsdri_info_data;
35*61046927SAndroid Build Coastguard Worker static char *windowsdri_extension_name = WINDOWSDRINAME;
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker #define WindowsDRICheckExtension(dpy,i,val) \
38*61046927SAndroid Build Coastguard Worker   XextCheckExtension (dpy, i, windowsdri_extension_name, val)
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker /*****************************************************************************
41*61046927SAndroid Build Coastguard Worker  *                                                                           *
42*61046927SAndroid Build Coastguard Worker  *                         private utility routines                          *
43*61046927SAndroid Build Coastguard Worker  *                                                                           *
44*61046927SAndroid Build Coastguard Worker  *****************************************************************************/
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker static int close_display(Display * dpy, XExtCodes * extCodes);
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker static /* const */ XExtensionHooks windowsdri_extension_hooks = {
49*61046927SAndroid Build Coastguard Worker    NULL,                        /* create_gc */
50*61046927SAndroid Build Coastguard Worker    NULL,                        /* copy_gc */
51*61046927SAndroid Build Coastguard Worker    NULL,                        /* flush_gc */
52*61046927SAndroid Build Coastguard Worker    NULL,                        /* free_gc */
53*61046927SAndroid Build Coastguard Worker    NULL,                        /* create_font */
54*61046927SAndroid Build Coastguard Worker    NULL,                        /* free_font */
55*61046927SAndroid Build Coastguard Worker    close_display,               /* close_display */
56*61046927SAndroid Build Coastguard Worker    NULL,                        /* wire_to_event */
57*61046927SAndroid Build Coastguard Worker    NULL,                        /* event_to_wire */
58*61046927SAndroid Build Coastguard Worker    NULL,                        /* error */
59*61046927SAndroid Build Coastguard Worker    NULL,                        /* error_string */
60*61046927SAndroid Build Coastguard Worker };
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker static
63*61046927SAndroid Build Coastguard Worker XEXT_GENERATE_FIND_DISPLAY(find_display, windowsdri_info,
64*61046927SAndroid Build Coastguard Worker                            windowsdri_extension_name,
65*61046927SAndroid Build Coastguard Worker                            &windowsdri_extension_hooks,
66*61046927SAndroid Build Coastguard Worker                            WindowsDRINumberEvents, NULL)
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker static
69*61046927SAndroid Build Coastguard Worker XEXT_GENERATE_CLOSE_DISPLAY(close_display, windowsdri_info)
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker /*****************************************************************************
72*61046927SAndroid Build Coastguard Worker  *                                                                           *
73*61046927SAndroid Build Coastguard Worker  *                 public Windows-DRI Extension routines                     *
74*61046927SAndroid Build Coastguard Worker  *                                                                           *
75*61046927SAndroid Build Coastguard Worker  *****************************************************************************/
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker #if 0
78*61046927SAndroid Build Coastguard Worker #include <stdio.h>
79*61046927SAndroid Build Coastguard Worker #define TRACE(msg, ...)  fprintf(stderr, "WindowsDRI" msg "\n", ##__VA_ARGS__);
80*61046927SAndroid Build Coastguard Worker #else
81*61046927SAndroid Build Coastguard Worker #define TRACE(msg, ...)
82*61046927SAndroid Build Coastguard Worker #endif
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker Bool
85*61046927SAndroid Build Coastguard Worker XWindowsDRIQueryExtension(dpy, event_basep, error_basep)
86*61046927SAndroid Build Coastguard Worker      Display *dpy;
87*61046927SAndroid Build Coastguard Worker      int *event_basep, *error_basep;
88*61046927SAndroid Build Coastguard Worker {
89*61046927SAndroid Build Coastguard Worker    XExtDisplayInfo *info = find_display(dpy);
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    TRACE("QueryExtension:");
92*61046927SAndroid Build Coastguard Worker    if (XextHasExtension(info)) {
93*61046927SAndroid Build Coastguard Worker       *event_basep = info->codes->first_event;
94*61046927SAndroid Build Coastguard Worker       *error_basep = info->codes->first_error;
95*61046927SAndroid Build Coastguard Worker       TRACE("QueryExtension: return True");
96*61046927SAndroid Build Coastguard Worker       return True;
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker    else {
99*61046927SAndroid Build Coastguard Worker       TRACE("QueryExtension: return False");
100*61046927SAndroid Build Coastguard Worker       return False;
101*61046927SAndroid Build Coastguard Worker    }
102*61046927SAndroid Build Coastguard Worker }
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker Bool
XWindowsDRIQueryVersion(dpy,majorVersion,minorVersion,patchVersion)105*61046927SAndroid Build Coastguard Worker XWindowsDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
106*61046927SAndroid Build Coastguard Worker      Display *dpy;
107*61046927SAndroid Build Coastguard Worker      int *majorVersion;
108*61046927SAndroid Build Coastguard Worker      int *minorVersion;
109*61046927SAndroid Build Coastguard Worker      int *patchVersion;
110*61046927SAndroid Build Coastguard Worker {
111*61046927SAndroid Build Coastguard Worker    XExtDisplayInfo *info = find_display(dpy);
112*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryVersionReply rep;
113*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryVersionReq *req;
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    TRACE("QueryVersion:");
116*61046927SAndroid Build Coastguard Worker    WindowsDRICheckExtension(dpy, info, False);
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    LockDisplay(dpy);
119*61046927SAndroid Build Coastguard Worker    GetReq(WindowsDRIQueryVersion, req);
120*61046927SAndroid Build Coastguard Worker    req->reqType = info->codes->major_opcode;
121*61046927SAndroid Build Coastguard Worker    req->driReqType = X_WindowsDRIQueryVersion;
122*61046927SAndroid Build Coastguard Worker    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
123*61046927SAndroid Build Coastguard Worker       UnlockDisplay(dpy);
124*61046927SAndroid Build Coastguard Worker       SyncHandle();
125*61046927SAndroid Build Coastguard Worker       TRACE("QueryVersion: return False");
126*61046927SAndroid Build Coastguard Worker       return False;
127*61046927SAndroid Build Coastguard Worker    }
128*61046927SAndroid Build Coastguard Worker    *majorVersion = rep.majorVersion;
129*61046927SAndroid Build Coastguard Worker    *minorVersion = rep.minorVersion;
130*61046927SAndroid Build Coastguard Worker    *patchVersion = rep.patchVersion;
131*61046927SAndroid Build Coastguard Worker    UnlockDisplay(dpy);
132*61046927SAndroid Build Coastguard Worker    SyncHandle();
133*61046927SAndroid Build Coastguard Worker    TRACE("QueryVersion: %d.%d.%d", *majorVersion, *minorVersion, *patchVersion);
134*61046927SAndroid Build Coastguard Worker    return True;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker Bool
XWindowsDRIQueryDirectRenderingCapable(dpy,screen,isCapable)138*61046927SAndroid Build Coastguard Worker XWindowsDRIQueryDirectRenderingCapable(dpy, screen, isCapable)
139*61046927SAndroid Build Coastguard Worker      Display *dpy;
140*61046927SAndroid Build Coastguard Worker      int screen;
141*61046927SAndroid Build Coastguard Worker      Bool *isCapable;
142*61046927SAndroid Build Coastguard Worker {
143*61046927SAndroid Build Coastguard Worker    XExtDisplayInfo *info = find_display(dpy);
144*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryDirectRenderingCapableReply rep;
145*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryDirectRenderingCapableReq *req;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    TRACE("QueryDirectRenderingCapable:");
148*61046927SAndroid Build Coastguard Worker    WindowsDRICheckExtension(dpy, info, False);
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker    LockDisplay(dpy);
151*61046927SAndroid Build Coastguard Worker    GetReq(WindowsDRIQueryDirectRenderingCapable, req);
152*61046927SAndroid Build Coastguard Worker    req->reqType = info->codes->major_opcode;
153*61046927SAndroid Build Coastguard Worker    req->driReqType = X_WindowsDRIQueryDirectRenderingCapable;
154*61046927SAndroid Build Coastguard Worker    req->screen = screen;
155*61046927SAndroid Build Coastguard Worker    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
156*61046927SAndroid Build Coastguard Worker       UnlockDisplay(dpy);
157*61046927SAndroid Build Coastguard Worker       SyncHandle();
158*61046927SAndroid Build Coastguard Worker       TRACE("QueryDirectRenderingCapable: return False");
159*61046927SAndroid Build Coastguard Worker       return False;
160*61046927SAndroid Build Coastguard Worker    }
161*61046927SAndroid Build Coastguard Worker    *isCapable = rep.isCapable;
162*61046927SAndroid Build Coastguard Worker    UnlockDisplay(dpy);
163*61046927SAndroid Build Coastguard Worker    SyncHandle();
164*61046927SAndroid Build Coastguard Worker    TRACE("QueryDirectRenderingCapable:return True");
165*61046927SAndroid Build Coastguard Worker    return True;
166*61046927SAndroid Build Coastguard Worker }
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker Bool
XWindowsDRIQueryDrawable(Display * dpy,int screen,Drawable drawable,unsigned int * type,void ** handle)169*61046927SAndroid Build Coastguard Worker XWindowsDRIQueryDrawable(Display *dpy, int screen, Drawable drawable,
170*61046927SAndroid Build Coastguard Worker                         unsigned int * type, void ** handle)
171*61046927SAndroid Build Coastguard Worker {
172*61046927SAndroid Build Coastguard Worker    XExtDisplayInfo *info = find_display(dpy);
173*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryDrawableReply rep;
174*61046927SAndroid Build Coastguard Worker    xWindowsDRIQueryDrawableReq *req;
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker    TRACE("QueryDrawable: XID %lx", drawable);
177*61046927SAndroid Build Coastguard Worker    WindowsDRICheckExtension(dpy, info, False);
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    LockDisplay(dpy);
180*61046927SAndroid Build Coastguard Worker    GetReq(WindowsDRIQueryDrawable, req);
181*61046927SAndroid Build Coastguard Worker    req->reqType = info->codes->major_opcode;
182*61046927SAndroid Build Coastguard Worker    req->driReqType = X_WindowsDRIQueryDrawable;
183*61046927SAndroid Build Coastguard Worker    req->screen = screen;
184*61046927SAndroid Build Coastguard Worker    req->drawable = drawable;
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
187*61046927SAndroid Build Coastguard Worker       UnlockDisplay(dpy);
188*61046927SAndroid Build Coastguard Worker       SyncHandle();
189*61046927SAndroid Build Coastguard Worker       TRACE("QueryDrawable: return False");
190*61046927SAndroid Build Coastguard Worker       return False;
191*61046927SAndroid Build Coastguard Worker    }
192*61046927SAndroid Build Coastguard Worker 
193*61046927SAndroid Build Coastguard Worker    *type = rep.drawable_type;
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker    // Note that despite being a derived type of void *, HANDLEs are defined to
196*61046927SAndroid Build Coastguard Worker    // be a sign-extended 32 bit value (so they can be passed to 32-bit
197*61046927SAndroid Build Coastguard Worker    // processes safely)
198*61046927SAndroid Build Coastguard Worker    *handle = (void *)(intptr_t)rep.handle;
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    UnlockDisplay(dpy);
201*61046927SAndroid Build Coastguard Worker    SyncHandle();
202*61046927SAndroid Build Coastguard Worker    TRACE("QueryDrawable: type %d, handle %p", *type, *handle);
203*61046927SAndroid Build Coastguard Worker    return True;
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker Bool
XWindowsDRIFBConfigToPixelFormat(Display * dpy,int screen,int fbConfigID,int * pxfi)207*61046927SAndroid Build Coastguard Worker XWindowsDRIFBConfigToPixelFormat(Display *dpy, int screen, int fbConfigID,
208*61046927SAndroid Build Coastguard Worker                                 int *pxfi)
209*61046927SAndroid Build Coastguard Worker {
210*61046927SAndroid Build Coastguard Worker    XExtDisplayInfo *info = find_display(dpy);
211*61046927SAndroid Build Coastguard Worker    xWindowsDRIFBConfigToPixelFormatReply rep;
212*61046927SAndroid Build Coastguard Worker    xWindowsDRIFBConfigToPixelFormatReq *req;
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker    TRACE("FBConfigToPixelFormat: fbConfigID 0x%x", fbConfigID);
215*61046927SAndroid Build Coastguard Worker    WindowsDRICheckExtension(dpy, info, False);
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker    LockDisplay(dpy);
218*61046927SAndroid Build Coastguard Worker    GetReq(WindowsDRIFBConfigToPixelFormat, req);
219*61046927SAndroid Build Coastguard Worker    req->reqType = info->codes->major_opcode;
220*61046927SAndroid Build Coastguard Worker    req->driReqType = X_WindowsDRIFBConfigToPixelFormat;
221*61046927SAndroid Build Coastguard Worker    req->screen = screen;
222*61046927SAndroid Build Coastguard Worker    req->fbConfigID = fbConfigID;
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker    if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
225*61046927SAndroid Build Coastguard Worker       UnlockDisplay(dpy);
226*61046927SAndroid Build Coastguard Worker       SyncHandle();
227*61046927SAndroid Build Coastguard Worker       TRACE("FBConfigToPixelFormat: return False");
228*61046927SAndroid Build Coastguard Worker       return False;
229*61046927SAndroid Build Coastguard Worker    }
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker    *pxfi = rep.pixelFormatIndex;
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker    UnlockDisplay(dpy);
234*61046927SAndroid Build Coastguard Worker    SyncHandle();
235*61046927SAndroid Build Coastguard Worker    TRACE("FBConfigToPixelFormat: pixelformatindex %d", *pxfi);
236*61046927SAndroid Build Coastguard Worker    return True;
237*61046927SAndroid Build Coastguard Worker }
238