diff options
Diffstat (limited to 'nx-X11/lib/GL/apple/dri_dispatch.c')
-rw-r--r-- | nx-X11/lib/GL/apple/dri_dispatch.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/nx-X11/lib/GL/apple/dri_dispatch.c b/nx-X11/lib/GL/apple/dri_dispatch.c new file mode 100644 index 000000000..8e5c4ddfd --- /dev/null +++ b/nx-X11/lib/GL/apple/dri_dispatch.c @@ -0,0 +1,153 @@ +/* dri_dispatch.c + $Id: dri_dispatch.c,v 1.5 2005/07/03 07:00:55 daniels Exp $ + + Copyright (c) 2002 Apple Computer, Inc. All rights reserved. + Copyright (c) Torrey T. Lyons. All rights reserved. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation files + (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE THE ABOVE LISTED COPYRIGHT + HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above + copyright holders shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization. */ +/* $XFree86: xc/lib/GL/apple/dri_dispatch.c,v 1.4 2004/04/21 04:59:40 torrey Exp $ */ + +#include <OpenGL/OpenGL.h> +#include <OpenGL/CGLContext.h> + +/* We use Apple's GL headers, but as of Panther its glext.h + did not define the following. */ +#ifndef GL_ARB_vertex_buffer_object +#include <stddef.h> +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +#endif + +#define GLAPIENTRYP * +#include "glapi.h" +#include "glapitable.h" +#include "glxclient.h" + +#include <Xlibint.h> +#include <stdio.h> + +#ifdef __GNUC__ +# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +#else +# define GCC_VERSION 0 +#endif + +#if GCC_VERSION < 3000 +# define __builtin_expect(a, b) a +#endif + +static int indirect_noop (void) +{ + return 0; +} + +/* Macro used for gl functions that exist in OpenGL.framework. We'll + use the existing stub for the initial dispatch, but need this + function to handle indirect contexts. */ +#define DEFUN_LOCAL_1(ret, return, gn, proto, args) \ +static ret indirect__ ## gn proto \ +{ \ + struct _glapi_table *disp; \ + \ + disp = _glapi_Dispatch; \ + if (__builtin_expect (disp == NULL, 0)) \ + disp = _glapi_get_dispatch (); \ + \ + return (*disp->gn) args; \ +} + +/* Macro used for gl functions that don't exist in OpenGL.framework. + We drop them on the floor in direct rendering mode, but pass them + over the wire normally for indirect contexts. */ +#define DEFUN_EXTERN_1(ret, return, gn, proto, args) \ +ret gl ## gn proto \ +{ \ + __GLXcontext *gc; \ + struct _glapi_table *disp; \ + \ + gc = __glXGetCurrentContext (); \ + if (!gc->isDirect) { \ + disp = _glapi_Dispatch; \ + if (__builtin_expect (disp == NULL, 0)) \ + disp = _glapi_get_dispatch (); \ + \ + return (*disp->gn) args; \ + } else { \ + int a = 0; return (ret) a; \ + } \ +} + +/* Macro for functions that already exist, but with a different name. */ +#define DEFUN_ALIAS_1(ret, return, gn, on, proto, args) \ +ret gl ## gn proto \ +{ \ + return gl ## on args; \ +} + +#define DEFUN_LOCAL(r, gn, p, a) \ + DEFUN_LOCAL_1 (r, return, gn, p, a) +#define DEFUN_LOCAL_VOID(gn, p, a) \ + DEFUN_LOCAL_1 (void, , gn, p, a) + +#define DEFUN_EXTERN(r, gn, p, a) \ + DEFUN_EXTERN_1 (r, return, gn, p, a) +#define DEFUN_EXTERN_VOID(gn, p, a) \ + DEFUN_EXTERN_1 (void, , gn, p, a) + +#define DEFUN_ALIAS(r, gn, on, p, a) \ + DEFUN_ALIAS_1 (r, return, gn, on, p, a) +#define DEFUN_ALIAS_VOID(gn, on, p, a) \ + DEFUN_ALIAS_1 (void, , gn, on, p, a) + +#include "dri_dispatch.h" + +__private_extern__ const CGLContextObj +XAppleDRIGetIndirectContext (void) +{ + static CGLContextObj ctx; + void **t; + int i; + + if (ctx != NULL) + return ctx; + + /* initialize gl */ + CGLSetOption (kCGLGOResetLibrary, 0); + + /* Create an empty "context" for dispatching purposes. Add some slop + in case the dispatch table grows in future updates. */ + ctx = Xcalloc (1, sizeof (struct _CGLContextObject) + 1024); + + /* fill it with no-op vectors */ + t = (void **) &ctx->disp; + for (i = 0; i < (int) (sizeof (ctx->disp) / sizeof (t[0])); i++) + t[i] = &indirect_noop; + + /* then install the functions we actually support */ + INDIRECT_DISPATCH_INIT (((void **) (&ctx->disp)), indirect__); + + return ctx; +} |