Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/glx/apple/appledri.c
4560 views
1
/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.12 2001/08/27 17:40:57 dawes Exp $ */
2
/**************************************************************************
3
4
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
5
Copyright 2000 VA Linux Systems, Inc.
6
Copyright (c) 2002, 2008 Apple Computer, Inc.
7
All Rights Reserved.
8
9
Permission is hereby granted, free of charge, to any person obtaining a
10
copy of this software and associated documentation files (the
11
"Software"), to deal in the Software without restriction, including
12
without limitation the rights to use, copy, modify, merge, publish,
13
distribute, sub license, and/or sell copies of the Software, and to
14
permit persons to whom the Software is furnished to do so, subject to
15
the following conditions:
16
17
The above copyright notice and this permission notice (including the
18
next paragraph) shall be included in all copies or substantial portions
19
of the Software.
20
21
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
29
**************************************************************************/
30
31
/*
32
* Authors:
33
* Kevin E. Martin <[email protected]>
34
* Jens Owen <[email protected]>
35
* Rickard E. (Rik) Faith <[email protected]>
36
*
37
*/
38
39
/* THIS IS NOT AN X CONSORTIUM STANDARD */
40
41
#include <X11/Xlibint.h>
42
#include "appledristr.h"
43
#include <X11/extensions/Xext.h>
44
#include <X11/extensions/extutil.h>
45
#include <stdio.h>
46
47
static XExtensionInfo _appledri_info_data;
48
static XExtensionInfo *appledri_info = &_appledri_info_data;
49
static char *appledri_extension_name = APPLEDRINAME;
50
51
#define AppleDRICheckExtension(dpy,i,val) \
52
XextCheckExtension (dpy, i, appledri_extension_name, val)
53
54
/*****************************************************************************
55
* *
56
* private utility routines *
57
* *
58
*****************************************************************************/
59
60
static int close_display(Display * dpy, XExtCodes * extCodes);
61
static Bool wire_to_event(Display * dpy, XEvent * re, xEvent * event);
62
63
static /* const */ XExtensionHooks appledri_extension_hooks = {
64
NULL, /* create_gc */
65
NULL, /* copy_gc */
66
NULL, /* flush_gc */
67
NULL, /* free_gc */
68
NULL, /* create_font */
69
NULL, /* free_font */
70
close_display, /* close_display */
71
wire_to_event, /* wire_to_event */
72
NULL, /* event_to_wire */
73
NULL, /* error */
74
NULL, /* error_string */
75
};
76
77
static
78
XEXT_GENERATE_FIND_DISPLAY(find_display, appledri_info,
79
appledri_extension_name,
80
&appledri_extension_hooks,
81
AppleDRINumberEvents, NULL)
82
83
static XEXT_GENERATE_CLOSE_DISPLAY(close_display, appledri_info)
84
85
static void (*surface_notify_handler) ();
86
87
void *XAppleDRISetSurfaceNotifyHandler(void (*fun) ())
88
{
89
void *old = surface_notify_handler;
90
surface_notify_handler = fun;
91
return old;
92
}
93
94
static Bool
95
wire_to_event(Display *dpy, XEvent *re, xEvent *event)
96
{
97
XExtDisplayInfo *info = find_display(dpy);
98
xAppleDRINotifyEvent *sevent;
99
100
AppleDRICheckExtension(dpy, info, False);
101
102
switch ((event->u.u.type & 0x7f) - info->codes->first_event) {
103
case AppleDRISurfaceNotify:
104
sevent = (xAppleDRINotifyEvent *) event;
105
if (surface_notify_handler != NULL) {
106
(*surface_notify_handler) (dpy, (unsigned int) sevent->arg,
107
(int) sevent->kind);
108
}
109
return False;
110
}
111
return False;
112
}
113
114
/*****************************************************************************
115
* *
116
* public Apple-DRI Extension routines *
117
* *
118
*****************************************************************************/
119
120
#if 0
121
#include <stdio.h>
122
#define TRACE(msg) fprintf(stderr, "AppleDRI%s\n", msg);
123
#else
124
#define TRACE(msg)
125
#endif
126
127
128
Bool
129
XAppleDRIQueryExtension(dpy, event_basep, error_basep)
130
Display *dpy;
131
int *event_basep, *error_basep;
132
{
133
XExtDisplayInfo *info = find_display(dpy);
134
135
TRACE("QueryExtension...");
136
if (XextHasExtension(info)) {
137
*event_basep = info->codes->first_event;
138
*error_basep = info->codes->first_error;
139
TRACE("QueryExtension... return True");
140
return True;
141
}
142
else {
143
TRACE("QueryExtension... return False");
144
return False;
145
}
146
}
147
148
Bool
149
XAppleDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
150
Display *dpy;
151
int *majorVersion;
152
int *minorVersion;
153
int *patchVersion;
154
{
155
XExtDisplayInfo *info = find_display(dpy);
156
xAppleDRIQueryVersionReply rep;
157
xAppleDRIQueryVersionReq *req;
158
159
TRACE("QueryVersion...");
160
AppleDRICheckExtension(dpy, info, False);
161
162
LockDisplay(dpy);
163
GetReq(AppleDRIQueryVersion, req);
164
req->reqType = info->codes->major_opcode;
165
req->driReqType = X_AppleDRIQueryVersion;
166
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
167
UnlockDisplay(dpy);
168
SyncHandle();
169
TRACE("QueryVersion... return False");
170
return False;
171
}
172
*majorVersion = rep.majorVersion;
173
*minorVersion = rep.minorVersion;
174
*patchVersion = rep.patchVersion;
175
UnlockDisplay(dpy);
176
SyncHandle();
177
TRACE("QueryVersion... return True");
178
return True;
179
}
180
181
Bool
182
XAppleDRIQueryDirectRenderingCapable(dpy, screen, isCapable)
183
Display *dpy;
184
int screen;
185
Bool *isCapable;
186
{
187
XExtDisplayInfo *info = find_display(dpy);
188
xAppleDRIQueryDirectRenderingCapableReply rep;
189
xAppleDRIQueryDirectRenderingCapableReq *req;
190
191
TRACE("QueryDirectRenderingCapable...");
192
AppleDRICheckExtension(dpy, info, False);
193
194
LockDisplay(dpy);
195
GetReq(AppleDRIQueryDirectRenderingCapable, req);
196
req->reqType = info->codes->major_opcode;
197
req->driReqType = X_AppleDRIQueryDirectRenderingCapable;
198
req->screen = screen;
199
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
200
UnlockDisplay(dpy);
201
SyncHandle();
202
TRACE("QueryDirectRenderingCapable... return False");
203
return False;
204
}
205
*isCapable = rep.isCapable;
206
UnlockDisplay(dpy);
207
SyncHandle();
208
TRACE("QueryDirectRenderingCapable... return True");
209
return True;
210
}
211
212
Bool
213
XAppleDRIAuthConnection(dpy, screen, magic)
214
Display *dpy;
215
int screen;
216
unsigned int magic;
217
{
218
XExtDisplayInfo *info = find_display(dpy);
219
xAppleDRIAuthConnectionReq *req;
220
xAppleDRIAuthConnectionReply rep;
221
222
TRACE("AuthConnection...");
223
AppleDRICheckExtension(dpy, info, False);
224
225
LockDisplay(dpy);
226
GetReq(AppleDRIAuthConnection, req);
227
req->reqType = info->codes->major_opcode;
228
req->driReqType = X_AppleDRIAuthConnection;
229
req->screen = screen;
230
req->magic = magic;
231
rep.authenticated = 0;
232
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) {
233
UnlockDisplay(dpy);
234
SyncHandle();
235
TRACE("AuthConnection... return False");
236
return False;
237
}
238
UnlockDisplay(dpy);
239
SyncHandle();
240
TRACE("AuthConnection... return True");
241
return True;
242
}
243
244
Bool
245
XAppleDRICreateSurface(dpy, screen, drawable, client_id, key, uid)
246
Display *dpy;
247
int screen;
248
Drawable drawable;
249
unsigned int client_id;
250
unsigned int *key;
251
unsigned int *uid;
252
{
253
XExtDisplayInfo *info = find_display(dpy);
254
xAppleDRICreateSurfaceReply rep;
255
xAppleDRICreateSurfaceReq *req;
256
257
TRACE("CreateSurface...");
258
AppleDRICheckExtension(dpy, info, False);
259
260
LockDisplay(dpy);
261
GetReq(AppleDRICreateSurface, req);
262
req->reqType = info->codes->major_opcode;
263
req->driReqType = X_AppleDRICreateSurface;
264
req->screen = screen;
265
req->drawable = drawable;
266
req->client_id = client_id;
267
rep.key_0 = rep.key_1 = rep.uid = 0;
268
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.key_0) {
269
UnlockDisplay(dpy);
270
SyncHandle();
271
TRACE("CreateSurface... return False");
272
return False;
273
}
274
key[0] = rep.key_0;
275
key[1] = rep.key_1;
276
*uid = rep.uid;
277
UnlockDisplay(dpy);
278
SyncHandle();
279
TRACE("CreateSurface... return True");
280
return True;
281
}
282
283
Bool
284
XAppleDRIDestroySurface(dpy, screen, drawable)
285
Display *dpy;
286
int screen;
287
Drawable drawable;
288
{
289
XExtDisplayInfo *info = find_display(dpy);
290
xAppleDRIDestroySurfaceReq *req;
291
292
TRACE("DestroySurface...");
293
AppleDRICheckExtension(dpy, info, False);
294
295
LockDisplay(dpy);
296
GetReq(AppleDRIDestroySurface, req);
297
req->reqType = info->codes->major_opcode;
298
req->driReqType = X_AppleDRIDestroySurface;
299
req->screen = screen;
300
req->drawable = drawable;
301
UnlockDisplay(dpy);
302
SyncHandle();
303
TRACE("DestroySurface... return True");
304
return True;
305
}
306
307
Bool
308
XAppleDRICreateSharedBuffer(Display * dpy, int screen, Drawable drawable,
309
Bool doubleSwap, char *path, size_t pathlen,
310
int *width, int *height)
311
{
312
XExtDisplayInfo *info = find_display(dpy);
313
xAppleDRICreateSharedBufferReq *req;
314
xAppleDRICreateSharedBufferReply rep;
315
316
AppleDRICheckExtension(dpy, info, False);
317
318
LockDisplay(dpy);
319
GetReq(AppleDRICreateSharedBuffer, req);
320
req->reqType = info->codes->major_opcode;
321
req->driReqType = X_AppleDRICreateSharedBuffer;
322
req->screen = screen;
323
req->drawable = drawable;
324
req->doubleSwap = doubleSwap;
325
326
327
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
328
puts("REPLY ERROR");
329
330
UnlockDisplay(dpy);
331
SyncHandle();
332
return False;
333
}
334
335
/* printf("rep.stringLength %d\n", (int) rep.stringLength); */
336
337
if (rep.stringLength > 0 && rep.stringLength <= pathlen) {
338
_XReadPad(dpy, path, rep.stringLength);
339
340
/* printf("path: %s\n", path); */
341
342
*width = rep.width;
343
*height = rep.height;
344
345
UnlockDisplay(dpy);
346
SyncHandle();
347
return True;
348
}
349
350
UnlockDisplay(dpy);
351
SyncHandle();
352
353
return False;
354
}
355
356
Bool
357
XAppleDRISwapBuffers(Display * dpy, int screen, Drawable drawable)
358
{
359
XExtDisplayInfo *info = find_display(dpy);
360
xAppleDRISwapBuffersReq *req;
361
362
AppleDRICheckExtension(dpy, info, False);
363
364
LockDisplay(dpy);
365
GetReq(AppleDRISwapBuffers, req);
366
req->reqType = info->codes->major_opcode;
367
req->driReqType = X_AppleDRISwapBuffers;
368
req->screen = screen;
369
req->drawable = drawable;
370
UnlockDisplay(dpy);
371
SyncHandle();
372
373
return True;
374
}
375
376
Bool
377
XAppleDRICreatePixmap(Display * dpy, int screen, Drawable drawable,
378
int *width, int *height, int *pitch, int *bpp,
379
size_t * size, char *bufname, size_t bufnamesize)
380
{
381
XExtDisplayInfo *info = find_display(dpy);
382
xAppleDRICreatePixmapReq *req;
383
xAppleDRICreatePixmapReply rep;
384
385
AppleDRICheckExtension(dpy, info, False);
386
387
LockDisplay(dpy);
388
GetReq(AppleDRICreatePixmap, req);
389
req->reqType = info->codes->major_opcode;
390
req->driReqType = X_AppleDRICreatePixmap;
391
req->screen = screen;
392
req->drawable = drawable;
393
394
if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) {
395
UnlockDisplay(dpy);
396
SyncHandle();
397
return False;
398
}
399
400
/*
401
printf("rep.stringLength %d\n", (int) rep.stringLength);
402
*/
403
404
if (rep.stringLength > 0 && rep.stringLength <= bufnamesize) {
405
_XReadPad(dpy, bufname, rep.stringLength);
406
407
/* printf("path: %s\n", bufname); */
408
409
*width = rep.width;
410
*height = rep.height;
411
*pitch = rep.pitch;
412
*bpp = rep.bpp;
413
*size = rep.size;
414
415
UnlockDisplay(dpy);
416
SyncHandle();
417
return True;
418
}
419
else if (rep.stringLength > 0) {
420
_XEatData(dpy, rep.stringLength);
421
}
422
423
UnlockDisplay(dpy);
424
SyncHandle();
425
426
return True;
427
}
428
429
/*
430
* Call it a drawable, because we really don't know what it is
431
* until it reaches the server, and we should keep that in mind.
432
*/
433
Bool
434
XAppleDRIDestroyPixmap(Display * dpy, Pixmap drawable)
435
{
436
XExtDisplayInfo *info = find_display(dpy);
437
xAppleDRIDestroyPixmapReq *req;
438
439
AppleDRICheckExtension(dpy, info, False);
440
441
LockDisplay(dpy);
442
GetReq(AppleDRIDestroyPixmap, req);
443
req->reqType = info->codes->major_opcode;
444
req->driReqType = X_AppleDRIDestroyPixmap;
445
req->drawable = drawable;
446
UnlockDisplay(dpy);
447
SyncHandle();
448
449
return True;
450
}
451
452