Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 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 
34
 *   Jens Owen 
35
 *   Rickard E. (Rik) Faith 
36
 *
37
 */
38
 
39
/* THIS IS NOT AN X CONSORTIUM STANDARD */
40
 
41
#include 
42
#include "appledristr.h"
43
#include 
44
#include 
45
#include 
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 
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
}