glxapi.c revision ad6fd8ed4daa9a1e4167476bdcd0b65195a8045a
1/* $Id: glxapi.c,v 1.6 1999/11/23 19:54:27 brianp Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version:  3.1
6 *
7 * Copyright (C) 1999  Brian Paul   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 "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28
29
30
31/*
32 * GLX API functions which either call fake or real GLX implementations
33 *
34 * To enable real GLX encoding the REALGLX preprocessor symbol should be
35 * defined on the command line.
36 */
37
38
39
40#ifdef HAVE_CONFIG_H
41#include "conf.h"
42#endif
43
44#include <X11/Xlib.h>
45#include <X11/Xutil.h>
46#include "GL/glx.h"
47#include "fakeglx.h"
48#include "realglx.h"
49
50
51#ifdef REALGLX
52static Display *CurrentDisplay = NULL;
53#endif
54
55
56/*
57 * This functions determines whether a call to a glX*() function should
58 * be routed to the "fake" (Mesa) or "real" (GLX-encoder) functions.
59 * Input:  dpy - the X display.
60 * Return:   GL_TRUE if the given display supports the real GLX extension,
61 *           GL_FALSE otherwise.
62 */
63static GLboolean display_has_glx( Display *dpy )
64{
65   /* TODO: we should use a lookup table to avoid calling XQueryExtension
66    * every time.
67    */
68   int ignore;
69   if (XQueryExtension( dpy, "GLX", &ignore, &ignore, &ignore )) {
70      return GL_TRUE;
71   }
72   else {
73      return GL_FALSE;
74   }
75}
76
77
78
79XVisualInfo *glXChooseVisual( Display *dpy, int screen, int *list )
80{
81#ifdef REALGLX
82   if (display_has_glx(dpy))
83      return Real_glXChooseVisual( dpy, screen, list );
84   else
85#endif
86      return Fake_glXChooseVisual( dpy, screen, list );
87}
88
89
90
91int glXGetConfig( Display *dpy, XVisualInfo *visinfo, int attrib, int *value )
92{
93#ifdef REALGLX
94   if (display_has_glx(dpy))
95      return Real_glXGetConfig( dpy, visinfo, attrib, value );
96   else
97#endif
98      return Fake_glXGetConfig( dpy, visinfo, attrib, value );
99}
100
101
102
103GLXContext glXCreateContext( Display *dpy, XVisualInfo *visinfo,
104			     GLXContext shareList, Bool direct )
105{
106#ifdef REALGLX
107   if (display_has_glx(dpy))
108      return Real_glXCreateContext( dpy, visinfo, shareList, direct );
109   else
110#endif
111      return Fake_glXCreateContext( dpy, visinfo, shareList, direct );
112}
113
114
115
116void glXDestroyContext( Display *dpy, GLXContext ctx )
117{
118#ifdef REALGLX
119   if (display_has_glx(dpy))
120      Real_glXDestroyContext( dpy, ctx );
121   else
122#endif
123      Fake_glXDestroyContext( dpy, ctx );
124}
125
126
127
128void glXCopyContext( Display *dpy, GLXContext src, GLXContext dst,
129		     GLuint mask )
130{
131#ifdef REALGLX
132   if (display_has_glx(dpy))
133      Real_glXCopyContext( dpy, src, dst, mask );
134   else
135#endif
136      Fake_glXCopyContext( dpy, src, dst, mask );
137}
138
139
140
141Bool glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx )
142{
143#ifdef REALGLX
144   if (display_has_glx(dpy)) {
145      if (Real_glXMakeCurrent( dpy, drawable, ctx )) {
146         CurrentDisplay = dpy;
147         return True;
148      }
149      else {
150         return False;
151      }
152   }
153   else {
154      if (Fake_glXMakeCurrent( dpy, drawable, ctx )) {
155         CurrentDisplay = dpy;
156         return True;
157      }
158      else {
159         return False;
160      }
161   }
162#else
163   return Fake_glXMakeCurrent( dpy, drawable, ctx );
164#endif
165}
166
167
168
169GLXContext glXGetCurrentContext( void )
170{
171#ifdef REALGLX
172   if (display_has_glx(CurrentDisplay))
173      return Real_glXGetCurrentContext();
174   else
175#endif
176      return Fake_glXGetCurrentContext();
177}
178
179
180
181GLXDrawable glXGetCurrentDrawable( void )
182{
183#ifdef REALGLX
184   if (display_has_glx(CurrentDisplay))
185      return Real_glXGetCurrentDrawable();
186   else
187#endif
188      return Fake_glXGetCurrentDrawable();
189}
190
191
192
193GLXPixmap glXCreateGLXPixmap( Display *dpy, XVisualInfo *visinfo,
194                              Pixmap pixmap )
195{
196#ifdef REALGLX
197   if (display_has_glx(dpy))
198      return Real_glXCreateGLXPixmap( dpy, visinfo, pixmap );
199   else
200#endif
201      return Fake_glXCreateGLXPixmap( dpy, visinfo, pixmap );
202}
203
204
205void glXDestroyGLXPixmap( Display *dpy, GLXPixmap pixmap )
206{
207#ifdef REALGLX
208   if (display_has_glx(dpy))
209      Real_glXDestroyGLXPixmap( dpy, pixmap );
210   else
211#endif
212      Fake_glXDestroyGLXPixmap( dpy, pixmap );
213}
214
215
216
217Bool glXQueryExtension( Display *dpy, int *errorb, int *event )
218{
219#ifdef REALGLX
220   if (display_has_glx(dpy))
221      return Real_glXQueryExtension( dpy, errorb, event );
222   else
223#endif
224      return Fake_glXQueryExtension( dpy, errorb, event );
225}
226
227
228
229Bool glXIsDirect( Display *dpy, GLXContext ctx )
230{
231#ifdef REALGLX
232   if (display_has_glx(dpy))
233      return Real_glXIsDirect( dpy, ctx );
234   else
235#endif
236      return Fake_glXIsDirect( dpy, ctx );
237}
238
239
240
241void glXSwapBuffers( Display *dpy, GLXDrawable drawable )
242{
243#ifdef REALGLX
244   if (display_has_glx(dpy))
245      Real_glXSwapBuffers( dpy, drawable );
246   else
247#endif
248      Fake_glXSwapBuffers( dpy, drawable );
249}
250
251
252
253void glXCopySubBufferMESA( Display *dpy, GLXDrawable drawable,
254                           int x, int y, int width, int height )
255{
256#ifdef REALGLX
257   /* can't implement! */
258   return;
259#endif
260   Fake_glXCopySubBufferMESA( dpy, drawable, x, y, width, height );
261}
262
263
264
265Bool glXQueryVersion( Display *dpy, int *maj, int *min )
266{
267#ifdef REALGLX
268   if (display_has_glx(dpy))
269      return Real_glXQueryVersion( dpy, maj, min );
270   else
271#endif
272      return Fake_glXQueryVersion( dpy, maj, min );
273}
274
275
276
277void glXUseXFont( Font font, int first, int count, int listBase )
278{
279#ifdef REALGLX
280   if (display_has_glx(CurrentDisplay))
281      Real_glXUseXFont( font, first, count, listBase );
282   else
283#endif
284      Fake_glXUseXFont( font, first, count, listBase );
285}
286
287
288void glXWaitGL( void )
289{
290#ifdef REALGLX
291   if (display_has_glx(CurrentDisplay))
292      Real_glXWaitGL();
293   else
294#endif
295      Fake_glXWaitGL();
296}
297
298
299
300void glXWaitX( void )
301{
302#ifdef REALGLX
303   if (display_has_glx(CurrentDisplay))
304      Real_glXWaitX();
305   else
306#endif
307      Fake_glXWaitX();
308}
309
310
311
312/* GLX 1.1 and later */
313const char *glXQueryExtensionsString( Display *dpy, int screen )
314{
315#ifdef REALGLX
316   if (display_has_glx(dpy))
317      return Real_glXQueryExtensionsString( dpy, screen );
318   else
319#endif
320      return Fake_glXQueryExtensionsString( dpy, screen );
321}
322
323
324
325/* GLX 1.1 and later */
326const char *glXQueryServerString( Display *dpy, int screen, int name )
327{
328#ifdef REALGLX
329   if (display_has_glx(dpy))
330      return Real_glXQueryServerString( dpy, screen, name );
331   else
332#endif
333      return Fake_glXQueryServerString( dpy, screen, name );
334}
335
336
337
338/* GLX 1.1 and later */
339const char *glXGetClientString( Display *dpy, int name )
340{
341#ifdef REALGLX
342   if (display_has_glx(dpy))
343      return Real_glXGetClientString( dpy, name );
344   else
345#endif
346      return Fake_glXGetClientString( dpy, name );
347}
348
349
350
351/* GLX 1.2 and later */
352Display *glXGetCurrentDisplay( void )
353{
354#ifdef REALGLX
355   if (display_has_glx(dpy))
356      return Real_glXGetCurrentDisplay();
357   else
358#endif
359      return Fake_glXGetCurrentDisplay();
360}
361
362
363
364/*
365 * GLX 1.3 and later
366 * XXX these are just no-op stubs for now.
367 */
368GLXFBConfig glXChooseFBConfig( Display *dpy, int screen,
369                               const int *attribList, int *nitems )
370{
371   (void) dpy;
372   (void) screen;
373   (void) attribList;
374   (void) nitems;
375   return 0;
376}
377
378
379int glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
380                          int attribute, int *value )
381{
382   (void) dpy;
383   (void) config;
384   (void) attribute;
385   (void) value;
386   return 0;
387}
388
389
390XVisualInfo *glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config )
391{
392   (void) dpy;
393   (void) config;
394   return 0;
395}
396
397
398GLXWindow glXCreateWindow( Display *dpy, GLXFBConfig config, Window win,
399                           const int *attribList )
400{
401   (void) dpy;
402   (void) config;
403   (void) win;
404   (void) attribList;
405   return 0;
406}
407
408
409void glXDestroyWindow( Display *dpy, GLXWindow window )
410{
411   (void) dpy;
412   (void) window;
413   return;
414}
415
416
417GLXPixmap glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
418                           const int *attribList )
419{
420   (void) dpy;
421   (void) config;
422   (void) pixmap;
423   (void) attribList;
424   return 0;
425}
426
427
428void glXDestroyPixmap( Display *dpy, GLXPixmap pixmap )
429{
430   (void) dpy;
431   (void) pixmap;
432   return;
433}
434
435
436GLXPbuffer glXCreatePbuffer( Display *dpy, GLXFBConfig config,
437                             const int *attribList )
438{
439   (void) dpy;
440   (void) config;
441   (void) attribList;
442   return 0;
443}
444
445
446void glXDestroyPbuffer( Display *dpy, GLXPbuffer pbuf )
447{
448   (void) dpy;
449   (void) pbuf;
450}
451
452
453void glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
454                       unsigned int *value )
455{
456   (void) dpy;
457   (void) draw;
458   (void) attribute;
459   (void) value;
460}
461
462
463GLXContext glXCreateNewContext( Display *dpy, GLXFBConfig config,
464                                int renderType, GLXContext shareList,
465                                Bool direct )
466{
467   (void) dpy;
468   (void) config;
469   (void) renderType;
470   (void) shareList;
471   (void) direct;
472   return 0;
473}
474
475
476Bool glXMakeContextCurrent( Display *dpy, GLXDrawable draw, GLXDrawable read,
477                            GLXContext ctx )
478{
479   (void) dpy;
480   (void) draw;
481   (void) read;
482   (void) ctx;
483   return 0;
484}
485
486
487GLXDrawable glXGetCurrentReadDrawable( void )
488{
489   return 0;
490}
491
492
493int glXQueryContext( Display *dpy, GLXContext ctx, int attribute, int *value )
494{
495   (void) dpy;
496   (void) ctx;
497   (void) attribute;
498   (void) value;
499   return 0;
500}
501
502
503void glXSelectEvent( Display *dpy, GLXDrawable drawable, unsigned long mask )
504{
505   (void) dpy;
506   (void) drawable;
507   (void) mask;
508}
509
510
511void glXGetSelectedEvent( Display *dpy, GLXDrawable drawable,
512                          unsigned long *mask )
513{
514   (void) dpy;
515   (void) drawable;
516   (void) mask;
517}
518
519
520
521
522#ifdef GLX_MESA_release_buffers
523Bool glXReleaseBuffersMESA( Display *dpy, Window w )
524{
525#ifdef REALGLX
526   if (display_has_glx(dpy))
527      return GL_FALSE;
528   else
529#endif
530      return Fake_glXReleaseBuffersMESA( dpy, w );
531}
532#endif
533
534
535#ifdef GLX_MESA_pixmap_colormap
536GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visinfo,
537                                  Pixmap pixmap, Colormap cmap )
538{
539#ifdef REALGLX
540   if (display_has_glx(dpy))
541      return 0;
542   else
543#endif
544      return Fake_glXCreateGLXPixmapMESA( dpy, visinfo, pixmap, cmap );
545}
546#endif
547
548
549
550#ifdef GLX_SGI_video_sync
551
552/*
553 * This function doesn't really do anything.  But, at least one
554 * application uses the function so this stub is useful.
555 */
556int glXGetVideoSyncSGI(unsigned int *count)
557{
558   static unsigned int counter = 0;
559   *count = counter++;
560   return 0;
561}
562
563
564/*
565 * Again, this is really just a stub function.
566 */
567int glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count)
568{
569   static unsigned int counter = 0;
570   while (counter % divisor != remainder)
571      counter++;
572   *count = counter;
573   return 0;
574}
575
576#endif
577
578
579
580#ifdef GLX_MESA_set_3dfx_mode
581GLboolean glXSet3DfxModeMESA( GLint mode )
582{
583#ifdef REALGLX
584   return GL_FALSE;
585#else
586   return Fake_glXSet3DfxModeMESA( mode );
587#endif
588}
589#endif
590
591
592
593#if 0  /* spec for this not finalized yet */
594void (*glXGetProcAddressEXT( const GLubyte *procName ))()
595{
596#ifdef REALGLX
597   return NULL;
598#else
599   return Fake_glXGetProcAddress( procName );
600#endif
601}
602#endif
603