/* ** Copyright 1995-2095, Silicon Graphics, Inc. ** All Rights Reserved. ** ** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; ** the contents of this file may not be disclosed to third parties, copied or ** duplicated in any form, in whole or in part, without the prior written ** permission of Silicon Graphics, Inc. ** ** RESTRICTED RIGHTS LEGEND: ** Use, duplication or disclosure by the Government is subject to restrictions ** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data ** and Computer Software clause at DFARS 252.227-7013, and/or in similar or ** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - ** rights reserved under the Copyright Laws of the United States. */ /****************************************************************************** AIX ******************************************************************************/ #if __GLS_PLATFORM_AIX #pragma alloca #define __GL_LIB_NAME "libGL.a" #define __GLS_FAKE_THREAD_LOCAL_STORAGE 1 #define __GLS_GL_DISPATCH 1 #define __GLS_MAX_ALLOCA_BYTES 65536 #define __GLS_PLATFORM "AIX" #if !__GLS_FAKE_FINITE_FUNC extern int finite(double); #define __GLS_FINITE(inDouble) finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_TRUNCATE_FUNC #include #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #endif /* __GLS_PLATFORM_AIX */ /****************************************************************************** DECUNIX ******************************************************************************/ #if __GLS_PLATFORM_DECUNIX #include #include #define __GL_LIB_NAME "libGL.so" #define __GLS_GL_DISPATCH 1 #define __GLS_GL_DISPATCH_DSO 1 #define __GLS_INT64 1 #define __GLS_MAX_ALLOCA_BYTES 65536 #define __GLS_OUT_FORMAT_INT64 "%ld" #define __GLS_OUT_FORMAT_INT64HEX "0x%.16lx" #define __GLS_OUT_FORMAT_INT64U "%lu" #define __GLS_PLATFORM "Digital UNIX" #define __GLS_SPRINTF_INT64 1 #define __GLS_STR_TO_INT64 strtol #define __GLS_STR_TO_INT64U strtoul #if !__GLS_FAKE_FINITE_FUNC #include #define __GLS_FINITE(inDouble) finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_THREAD_LOCAL_STORAGE #include extern pthread_key_t __gls_contextTLS; extern __GLScontext* __glsGetContext(void); #define __GLS_CONTEXT __glsGetContext() #define __GLS_PUT_CONTEXT(inContext) \ pthread_setspecific(__gls_contextTLS, (pthread_addr_t)inContext) extern pthread_key_t __gls_errorTLS; extern GLSenum __glsGetError(void); #define __GLS_ERROR __glsGetError() #define __GLS_PUT_ERROR(inError) \ pthread_setspecific(__gls_errorTLS, (pthread_addr_t)inError) #endif /* !__GLS_FAKE_THREAD_LOCAL_STORAGE */ #if !__GLS_FAKE_TRUNCATE_FUNC #include #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #define __GLS_ERRNO _Geterrno() #define __GLS_PUT_ERRNO(inError) _Seterrno(inError) #endif /* __GLS_PLATFORM_DECUNIX */ /****************************************************************************** HPUX ******************************************************************************/ #if __GLS_PLATFORM_HPUX #define __GL_LIB_NAME "libGL.sl" #define __GLS_FAKE_MUTEX 1 #define __GLS_FAKE_THREAD_LOCAL_STORAGE 1 #define __GLS_GL_DISPATCH 1 #define __GLS_INT64 1 #define __GLS_PLATFORM "HP-UX" #if !__GLS_FAKE_FINITE_FUNC extern int finite(double); #define __GLS_FINITE(inDouble) finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_TRUNCATE_FUNC #include #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #endif /* __GLS_PLATFORM_HPUX */ /****************************************************************************** IRIX ******************************************************************************/ #if __GLS_PLATFORM_IRIX #include #define __GL_LIB_NAME "libGL.so" #define __GLS_INT64 1 #define __GLS_MAX_ALLOCA_BYTES 65536 #define __GLS_OUT_FORMAT_INT64 "%lld" #define __GLS_OUT_FORMAT_INT64HEX "0x%.16llx" #define __GLS_OUT_FORMAT_INT64U "%llu" #define __GLS_PLATFORM "IRIX" #define __GLS_SPRINTF_INT64 1 #define __GLS_STR_TO_INT64 strtoll #define __GLS_STR_TO_INT64U strtoull extern GLlong strtoll(const char *, char **, int); extern GLulong strtoull(const char *, char **, int); #if !__GLS_FAKE_FINITE_FUNC #include #define __GLS_FINITE(inDouble) finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_THREAD_LOCAL_STORAGE #include "os.h" #define __GLS_CONTEXT \ (PAGE_ONE->glsContext) #define __GLS_PUT_CONTEXT(inContext) \ __GLS_CONTEXT = inContext #define __GLS_ERROR \ (PAGE_ONE->glsError) #define __GLS_PUT_ERROR(inError) \ __GLS_ERROR = inError #endif /* !__GLS_FAKE_THREAD_LOCAL_STORAGE */ #if !__GLS_FAKE_TRUNCATE_FUNC #include extern int fileno(FILE *inChannel); extern int ftruncate(int, off_t); #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), (off_t)inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ extern GLint oserror(void); #define __GLS_ERRNO oserror() extern GLint setoserror(GLint inError); #define __GLS_PUT_ERRNO(inError) setoserror(inError) #endif /* __GLS_PLATFORM_IRIX */ /****************************************************************************** LINUX ******************************************************************************/ #if __GLS_PLATFORM_LINUX #include #define __GL_LIB_NAME "libGL.so" #define __GLS_GL_DISPATCH 1 #define __GLS_GL_DISPATCH_DSO 1 #define __GLS_INT64 1 #define __GLS_OUT_FORMAT_INT64 "%qd" #define __GLS_OUT_FORMAT_INT64HEX "0x%.16qx" #define __GLS_OUT_FORMAT_INT64U "%qu" #define __GLS_MAX_ALLOCA_BYTES 65536 #define __GLS_PLATFORM "Linux" #define __GLS_POSIX_THREADS 0 #define __GLS_SPRINTF_INT64 1 #define __GLS_STR_TO_INT64 strtoq #define __GLS_STR_TO_INT64U strtouq extern GLlong strtoq(const char *, char **, int); extern GLulong strtouq(const char *, char **, int); #if !__GLS_FAKE_FINITE_FUNC #include #define __GLS_FINITE(inDouble) __finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_TRUNCATE_FUNC extern int fileno(FILE *inChannel); extern int ftruncate(int, size_t); #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #if !__GLS_POSIX_THREADS #define __GLS_FAKE_MUTEX 1 #define __GLS_FAKE_THREAD_LOCAL_STORAGE 1 #endif /* !__GLS_POSIX_THREADS */ #endif /* __GLS_PLATFORM_LINUX */ /****************************************************************************** SOLARIS ******************************************************************************/ #if __GLS_PLATFORM_SOLARIS #include #define __GL_LIB_NAME "libGL.so" #define __GLS_GL_DISPATCH 1 #define __GLS_GL_DISPATCH_DSO 1 #define __GLS_INT64 1 #define __GLS_INT64_TO_STR lltostr #define __GLS_INT64U_TO_STR ulltostr #define __GLS_PLATFORM "Solaris" #define __GLS_STR_TO_INT64 strtoll #define __GLS_STR_TO_INT64U strtoull extern char *lltostr(GLlong, char *); extern char *ulltostr(GLulong, char *); extern GLlong strtoll(const char *, char **, int); extern GLulong strtoull(const char *, char **, int); #if !__GLS_FAKE_FINITE_FUNC extern int finite(double); #define __GLS_FINITE(inDouble) finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_THREAD_LOCAL_STORAGE #include extern thread_key_t __gls_contextTLS; extern __GLScontext* __glsGetContext(void); #define __GLS_CONTEXT __glsGetContext() #define __GLS_PUT_CONTEXT(inContext) \ thr_setspecific(__gls_contextTLS, inContext) extern thread_key_t __gls_errorTLS; extern GLSenum __glsGetError(void); #define __GLS_ERROR __glsGetError() #define __GLS_PUT_ERROR(inError) \ thr_setspecific(__gls_errorTLS, (void *)inError) #endif /* !__GLS_FAKE_THREAD_LOCAL_STORAGE */ #if !__GLS_FAKE_TRUNCATE_FUNC #include #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ ftruncate(fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #endif /* __GLS_PLATFORM_SOLARIS */ /****************************************************************************** WIN32 ******************************************************************************/ #if __GLS_PLATFORM_WIN32 #pragma warning(disable:4769) #include #include #include #define __GL_LIB_NAME "opengl32.dll" #define __GLS_GL_DISPATCH 1 #define __GLS_INT64 1 #define __GLS_MAX_ALLOCA_BYTES 65536 #define __GLS_OUT_FORMAT_INT64 "%I64d" #define __GLS_OUT_FORMAT_INT64HEX "0x%.16I64x" #define __GLS_OUT_FORMAT_INT64U "%I64u" #define __GLS_PLATFORM "Win32" #define __GLS_SINGLE_NULL_COMMAND_FUNC 0 #define __GLS_SPRINTF_INT64 1 #define __GLS_STR_TO_INT64 __gls_strtoi64 #define __GLS_STR_TO_INT64U __gls_strtoui64 #define __GLS_DEC_ALLOC_BIN(inParam, inType, inByteCount) \ if (inByteCount <= __GLS_MAX_ALLOCA_BYTES) __try { \ inParam = (inType *)_alloca(inByteCount); \ } __except(EXCEPTION_CONTINUE_EXECUTION) {} \ if (!inParam) { \ inParam = (inType *)__glsMalloc(inByteCount); \ inParam##_malloc = GL_TRUE; \ } #define __GLS_DEC_ALLOC_TEXT(inoutReader, inParam, inType, inByteCount) \ if (inByteCount <= __GLS_MAX_ALLOCA_BYTES) __try { \ inParam = (inType *)_alloca(inByteCount); \ } __except(EXCEPTION_CONTINUE_EXECUTION) {} \ if (!inParam) { \ inParam = (inType *)__glsReader_allocCallBuf( \ inoutReader, inByteCount \ ); \ inParam##_malloc = GL_TRUE; \ } extern GLlong __gls_strtoi64(const char *, char **, int); extern GLulong __gls_strtoui64(const char *, char **, int); #if !__GLS_FAKE_FINITE_FUNC #include #define __GLS_FINITE(inDouble) _finite(inDouble) #endif /* !__GLS_FAKE_FINITE_FUNC */ #if !__GLS_FAKE_THREAD_LOCAL_STORAGE extern GLint __gls_contextTLS; #define __GLS_CONTEXT \ ((__GLScontext *)TlsGetValue(__gls_contextTLS)) #define __GLS_PUT_CONTEXT(inContext) \ TlsSetValue(__gls_contextTLS, inContext) extern GLint __gls_errorTLS; #define __GLS_ERROR \ ((GLSenum)((ULONG_PTR)TlsGetValue(__gls_errorTLS))) #define __GLS_PUT_ERROR(inError) \ TlsSetValue(__gls_errorTLS, (GLvoid *)inError) #endif /* !__GLS_FAKE_THREAD_LOCAL_STORAGE */ #if !__GLS_FAKE_TRUNCATE_FUNC #include #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) \ _chsize(_fileno(inChannel), inByteCount) #endif /* !__GLS_FAKE_TRUNCATE_FUNC */ #endif /* __GLS_PLATFORM_WIN32 */ /****************************************************************************** Default definitions ******************************************************************************/ #if !defined(__GLS_CHECKSUM_BUF_BYTES) #define __GLS_CHECKSUM_BUF_BYTES 4096 #endif /* !defined(__GLS_CHECKSUM_BUF_BYTES) */ #if !defined(__GLS_CONTEXT_STREAM_BLOCK_BYTES) #define __GLS_CONTEXT_STREAM_BLOCK_BYTES 65536 #endif /* !defined(__GLS_CONTEXT_STREAM_BLOCK_BYTES) */ #if !defined(__GLS_READER_BUF_BYTES) #define __GLS_READER_BUF_BYTES 16384 #endif /* !defined(__GLS_READER_BUF_BYTES) */ #if !defined(__GLS_PLATFORM) #define __GLS_PLATFORM "Unknown" #endif /* !defined(__GLS_PLATFORM) */ #if !defined(__GLS_RELEASE) #define __GLS_RELEASE "Unknown" #endif /* !defined(__GLS_RELEASE) */ #if !defined(__GLS_SINGLE_NULL_COMMAND_FUNC) #define __GLS_SINGLE_NULL_COMMAND_FUNC 1 #endif /* !defined(__GLS_SINGLE_NULL_COMMAND_FUNC) */ #if !defined(__GLS_VENDOR) #define __GLS_VENDOR "ARB" #endif /* !defined(__GLS_VENDOR) */ #if !defined(__GLS_WRITER_EXTERN_BUF_BYTES) #define __GLS_WRITER_EXTERN_BUF_BYTES 16384 #endif /* !defined(__GLS_WRIER_EXTERN_BUF_BYTES) */ #if !defined(__GLS_WRITER_EXTERN_BUF_SLOP) #define __GLS_WRITER_EXTERN_BUF_SLOP 256 #endif /* !defined(__GLS_WRITER_EXTERN_BUF_SLOP) */ #if !defined(__GLS_ERRNO) #define __GLS_ERRNO errno #endif /* !defined(__GLS_ERRNO) */ #if !defined(__GLS_PUT_ERRNO) #define __GLS_PUT_ERRNO(inError) errno = inError #endif /* !defined(__GLS_PUT_ERRNO) */ /****************************************************************************** Required platform-specific functions ******************************************************************************/ extern void __glsBeginCriticalSection(void); extern void __glsEndCriticalSection(void); extern void __glsUpdateDispatchTables(void); #ifndef __GLS_PLATFORM_WIN32 // DrewB extern void __glsBeginCaptureExec(GLSopcode inOpcode); extern void __glsEndCaptureExec(GLSopcode inOpcode); #define __GLS_BEGIN_CAPTURE_EXEC(ctx, op) __glsBeginCaptureExec(op) #define __GLS_END_CAPTURE_EXEC(ctx, op) __glsEndCaptureExec(op) #else extern void __glsBeginCaptureExec(__GLScontext *ctx, GLSopcode inOpcode); extern void __glsEndCaptureExec(__GLScontext *ctx, GLSopcode inOpcode); #define __GLS_BEGIN_CAPTURE_EXEC(ctx, op) __glsBeginCaptureExec(ctx, op) #define __GLS_END_CAPTURE_EXEC(ctx, op) __glsEndCaptureExec(ctx, op) #endif /****************************************************************************** Alloca ******************************************************************************/ #if defined(__GLS_MAX_ALLOCA_BYTES) #define __GLS_DEC_ALLOC_DECLARE(inParam) \ GLboolean inParam##_malloc = GL_FALSE; #if !defined(__GLS_DEC_ALLOC_BIN) #define __GLS_DEC_ALLOC_BIN(inParam, inType, inByteCount) \ if (inByteCount <= __GLS_MAX_ALLOCA_BYTES) { \ inParam = (inType *)alloca(inByteCount); \ } \ if (!inParam) { \ inParam = (inType *)__glsMalloc(inByteCount); \ inParam##_malloc = GL_TRUE; \ } #endif /* !defined(__GLS_DEC_ALLOC_BIN) */ #if !defined(__GLS_DEC_ALLOC_TEXT) #define __GLS_DEC_ALLOC_TEXT( \ inoutReader, inParam, inType, inByteCount \ ) \ if (inByteCount <= __GLS_MAX_ALLOCA_BYTES) { \ inParam = (inType *)alloca(inByteCount); \ } \ if (!inParam) { \ inParam = (inType *)__glsReader_allocCallBuf( \ inoutReader, inByteCount \ ); \ inParam##_malloc = GL_TRUE; \ } #endif /* !defined(__GLS_DEC_ALLOC_TEXT) */ #define __GLS_DEC_FREE(inParam) \ if (inParam##_malloc) free(inParam) #else /* !defined(__GLS_MAX_ALLOCA_BYTES) */ #define __GLS_DEC_ALLOC_DECLARE(inParam) #define __GLS_DEC_ALLOC_BIN(inParam, inType, inByteCount) \ inParam = (inType *)__glsMalloc(inByteCount) #define __GLS_DEC_ALLOC_TEXT(inoutReader, inParam, inType, inByteCount) \ inParam = (inType *)__glsReader_allocCallBuf(inoutReader, inByteCount) #define __GLS_DEC_FREE(inParam) \ free(inParam) #endif /* defined(__GLS_MAX_ALLOCA_BYTES) */ /****************************************************************************** POSIX threads ******************************************************************************/ #if __GLS_POSIX_THREADS #if !__GLS_FAKE_THREAD_LOCAL_STORAGE #include extern pthread_key_t __gls_contextTLS; extern __GLScontext* __glsGetContext(void); #define __GLS_CONTEXT __glsGetContext() #define __GLS_PUT_CONTEXT(inContext) \ pthread_setspecific(__gls_contextTLS, inContext) extern pthread_key_t __gls_errorTLS; extern GLSenum __glsGetError(void); #define __GLS_ERROR __glsGetError() #define __GLS_PUT_ERROR(inError) \ pthread_setspecific(__gls_errorTLS, (GLvoid *)inError) #endif /* !__GLS_FAKE_THREAD_LOCAL_STORAGE */ #endif /* __GLS_POSIX_THREADS */ /****************************************************************************** Fake finite function ******************************************************************************/ #if __GLS_FAKE_FINITE_FUNC #define __GLS_FINITE(inDouble) GL_TRUE #endif /* __GLS_FAKE_FINITE_FUNC */ /****************************************************************************** Fake thread-local storage ******************************************************************************/ #if __GLS_FAKE_THREAD_LOCAL_STORAGE extern __GLScontext *__gls_context; #define __GLS_CONTEXT \ __gls_context #define __GLS_PUT_CONTEXT(inContext) \ __gls_context = inContext extern GLSenum __gls_error; #define __GLS_ERROR \ __gls_error #define __GLS_PUT_ERROR(inError) \ __gls_error = inError #endif /* __GLS_FAKE_THREAD_LOCAL_STORAGE */ /****************************************************************************** Fake truncate function ******************************************************************************/ #if __GLS_FAKE_TRUNCATE_FUNC #define __GLS_TRUNCATE_EXTERN(inChannel, inByteCount) -1 #endif /* __GLS_FAKE_TRUNCATE_FUNC */ /*****************************************************************************/