/* ** 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. */ #include "glslib.h" #include #include /****************************************************************************** Helpers ******************************************************************************/ #define __GLS_PUT_BIN(inType, inSize) \ __GLS_PUT_BIN_VAL(inType, inSize) \ __GLS_PUT_BIN_VEC(inType, inSize) \ __GLS_PUT_BIN_VECSTRIDE(inType, inSize) #define __GLS_PUT_BIN_ENUM(inType, inEnum) \ __GLS_PUT_BIN_ENUM_VAL(inType, inEnum) \ __GLS_PUT_BIN_ENUM_VEC(inType, inEnum) #define __GLS_PUT_BIN_SWAP(inType, inSize) \ __GLS_PUT_BIN(inType, inSize) \ __GLS_PUT_BIN_SWAP_VAL(inType, inSize) \ __GLS_PUT_BIN_SWAP_VEC(inType, inSize) \ __GLS_PUT_BIN_SWAP_VECSTRIDE(inType, inSize) #define __GLS_PUT_BIN_ENUM_VAL(inType, inEnum) \ static void __glsWriter_put##inType##Or##inEnum##_bin( \ __GLSwriter *inoutWriter, inEnum inParam, inType inVal \ ) { \ inoutWriter->put##inType(inoutWriter, inVal); \ } #define __GLS_PUT_BIN_ENUM_VEC(inType, inEnum) \ static void __glsWriter_put##inType##Or##inEnum##v_bin( \ __GLSwriter *inoutWriter, \ inEnum inParam, \ GLuint inCount, \ const inType *inVec \ ) { \ inoutWriter->put##inType##v(inoutWriter, inCount, inVec); \ } #define __GLS_PUT_BIN_SWAP_VAL(inType, inSize) \ static void __glsWriter_put##inType##_bin_swap( \ __GLSwriter *inoutWriter, inType inVal \ ) { \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += inSize; \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ *(inType *)bufPtr = inVal; \ __glsSwap##inSize(bufPtr); \ } #define __GLS_PUT_BIN_SWAP_VEC(inType, inSize) \ static void __glsWriter_put##inType##v_bin_swap( \ __GLSwriter *inoutWriter, GLuint inCount, const inType *inVec \ ) { \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += inSize * inCount; \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ while (inCount-- > 0) { \ *(inType *)bufPtr = *inVec++; \ __glsSwap##inSize(bufPtr); \ bufPtr += inSize; \ } \ } #define __GLS_PUT_BIN_SWAP_VECSTRIDE(inType, inSize) \ static void __glsWriter_put##inType##vs_bin_swap( \ __GLSwriter *inoutWriter, \ GLboolean inItemSwap, \ GLint inStride1DataItems, \ GLint inStride1PadBytes, \ GLint inStride1Count, \ GLint inStride2PadBytes, \ GLint inStride2Count, \ const inType *inVec \ ) { \ GLint i, j; \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += ( \ inSize * inStride1DataItems * inStride1Count * inStride2Count \ ); \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ if (inItemSwap) while (inStride2Count-- > 0) { \ for ( \ i = 0 ; \ i < inStride1Count ; \ ++i, \ inVec = \ (const inType *)((const GLubyte *)inVec + inStride1PadBytes) \ ) { \ for (j = 0 ; j < inStride1DataItems ; ++j, bufPtr += inSize) { \ *(inType *)bufPtr = *inVec++; \ } \ } \ inVec = (const inType *)((const GLubyte *)inVec + inStride2PadBytes); \ } else while (inStride2Count-- > 0) { \ for ( \ i = 0 ; \ i < inStride1Count ; \ ++i, \ inVec = \ (const inType *)((const GLubyte *)inVec + inStride1PadBytes) \ ) { \ for (j = 0 ; j < inStride1DataItems ; ++j, bufPtr += inSize) { \ *(inType *)bufPtr = *inVec++; \ __glsSwap##inSize(bufPtr); \ } \ } \ inVec = (const inType *)((const GLubyte *)inVec + inStride2PadBytes); \ } \ } #define __GLS_PUT_BIN_VAL(inType, inSize) \ static void __glsWriter_put##inType##_bin( \ __GLSwriter *inoutWriter, inType inVal \ ) { \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += inSize; \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ *(inType *)bufPtr = inVal; \ } #define __GLS_PUT_BIN_VEC(inType, inSize) \ static void __glsWriter_put##inType##v_bin( \ __GLSwriter *inoutWriter, GLuint inCount, const inType *inVec \ ) { \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += inSize * inCount; \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ while (inCount-- > 0) { \ *(inType *)bufPtr = *inVec++; \ bufPtr += inSize; \ } \ } #define __GLS_PUT_BIN_VECSTRIDE(inType, inSize) \ static void __glsWriter_put##inType##vs_bin( \ __GLSwriter *inoutWriter, \ GLboolean inItemSwap, \ GLint inStride1DataItems, \ GLint inStride1PadBytes, \ GLint inStride1Count, \ GLint inStride2PadBytes, \ GLint inStride2Count, \ const inType *inVec \ ) { \ GLint i, j; \ GLubyte *bufPtr = inoutWriter->bufPtr; \ inoutWriter->bufPtr += ( \ inSize * inStride1DataItems * inStride1Count * inStride2Count \ ); \ if (inoutWriter->bufPtr > inoutWriter->commandTail) return; \ if (inItemSwap) while (inStride2Count-- > 0) { \ for ( \ i = 0 ; \ i < inStride1Count ; \ ++i, \ inVec = \ (const inType *)((const GLubyte *)inVec + inStride1PadBytes) \ ) { \ for (j = 0 ; j < inStride1DataItems ; ++j, bufPtr += inSize) { \ *(inType *)bufPtr = *inVec++; \ __glsSwap##inSize(bufPtr); \ } \ } \ inVec = (const inType *)((const GLubyte *)inVec + inStride2PadBytes); \ } else while (inStride2Count-- > 0) { \ for ( \ i = 0 ; \ i < inStride1Count ; \ ++i, \ inVec = \ (const inType *)((const GLubyte *)inVec + inStride1PadBytes) \ ) { \ for (j = 0 ; j < inStride1DataItems ; ++j, bufPtr += inSize) { \ *(inType *)bufPtr = *inVec++; \ } \ } \ inVec = (const inType *)((const GLubyte *)inVec + inStride2PadBytes); \ } \ } /****************************************************************************** Writers ******************************************************************************/ static GLboolean __glsWriter_alloc_bin( __GLSwriter *inoutWriter, size_t inWordCount ) { if (!__glsWriter_flush(inoutWriter)) return GL_FALSE; if (inoutWriter->bufPtr + inWordCount * 4 <= inoutWriter->bufTail) { return GL_TRUE; } free(inoutWriter->externBuf); if (inoutWriter->wordCount & 1) ++inWordCount; if ( inoutWriter->externBuf = inoutWriter->externBufHead = __glsMalloc( inWordCount * 4 ) ) { if (inoutWriter->wordCount & 1) inoutWriter->externBufHead += 4; inoutWriter->bufPtr = inoutWriter->externBufHead; inoutWriter->bufTail = inoutWriter->externBuf + inWordCount * 4; return GL_TRUE; } else { inoutWriter->bufPtr = GLS_NONE; inoutWriter->bufTail = GLS_NONE; inoutWriter->error = GL_TRUE; return GL_FALSE; } } static GLboolean __glsWriter_alloc_context( __GLSwriter *inoutWriter, size_t inWordCount ) { __GLScontextStream *const stream = inoutWriter->contextStream; __GLScontextStreamBlock *const block = __glsContextStream_lastBlock( stream ); const size_t fillBytes = (size_t)((ULONG_PTR)(inoutWriter->bufPtr - block->buf)); const GLfloat fillFrac = ( (GLfloat)(fillBytes + __GLS_JUMP_ALLOC) / (GLfloat)(block->bufTail - block->buf) ); const size_t reqBytes = (inWordCount + 1) * 4 + __GLS_JUMP_ALLOC; __glsWriter_flush(inoutWriter); block->writeTail = inoutWriter->bufPtr; if (fillFrac < __GLS_FULL_CONTEXT_STREAM_BLOCK) { GLubyte *const buf = __glsMalloc(fillBytes + reqBytes); if (buf) { size_t i = fillBytes; __GLS_LIST_ITER(__GLScontextStreamBlock) iter; while (i-- > 0) buf[i] = block->buf[i]; free(block->buf); block->buf = buf; block->bufTail = buf + fillBytes + reqBytes; block->writeTail = buf + fillBytes; inoutWriter->bufPtr = block->writeTail; inoutWriter->bufTail = block->bufTail - __GLS_JUMP_ALLOC; iter.elem = block; __GLS_LIST_PREV(&stream->blockList, &iter); if (iter.elem) { __glsContextStreamBlock_removeJump(iter.elem); __glsContextStreamBlock_addJump(iter.elem, buf); } return GL_TRUE; } else { inoutWriter->error = GL_TRUE; return GL_FALSE; } } else { __GLScontextStreamBlock *const newBlock = ( __glsContextStream_appendBlock( stream, __GLS_MAX(__GLS_CONTEXT_STREAM_BLOCK_BYTES, reqBytes) ) ); if (newBlock) { if (inoutWriter->wordCount & 1) { __glsContextStreamBlock_addPad(newBlock); } inoutWriter->bufPtr = newBlock->writeTail; __glsContextStreamBlock_addJump(block, inoutWriter->bufPtr); inoutWriter->bufTail = newBlock->bufTail - __GLS_JUMP_ALLOC; return GL_TRUE; } else { inoutWriter->error = GL_TRUE; return GL_FALSE; } } } static GLboolean __glsWriter_beginCommand_bin( __GLSwriter *inoutWriter, GLSopcode inOpcode, size_t inByteCount ) { size_t wordCount = (inByteCount + 3) >> 2; GLboolean longForm; GLSopcode opcode; if (inoutWriter->error) return GL_FALSE; if (inoutWriter->type == GLS_CONTEXT) { opcode = __glsMapOpcode(inOpcode); } else { opcode = inOpcode; } longForm = (GLboolean)( opcode == GLS_OP_glsBeginGLS || opcode == GLS_OP_glsEndGLS || opcode >= 65536 || wordCount >= 65535 ); wordCount += longForm ? 3 : 1; if (wordCount > UINT_MAX) { glsError(inOpcode, GLS_ENCODE_ERROR); return GL_FALSE; } if ( inoutWriter->bufPtr + wordCount * 4 > inoutWriter->bufTail && !inoutWriter->alloc(inoutWriter, wordCount) ) { return GL_FALSE; } inoutWriter->commandOpcode = inOpcode; inoutWriter->commandHead = inoutWriter->bufPtr; inoutWriter->commandTail = inoutWriter->bufPtr + wordCount * 4; inoutWriter->prevCommand = ( (__GLSbinCommandHead_large *)inoutWriter->bufPtr ); if (longForm) { inoutWriter->putGLushort(inoutWriter, GLS_NONE); inoutWriter->putGLushort(inoutWriter, 0); inoutWriter->putGLuint(inoutWriter, opcode); inoutWriter->putGLuint(inoutWriter, (GLuint)wordCount); } else { inoutWriter->putGLushort(inoutWriter, (GLushort)opcode); inoutWriter->putGLushort(inoutWriter, (GLushort)wordCount); } inoutWriter->wordCount += wordCount; return GL_TRUE; } static void __glsWriter_endCommand_bin(__GLSwriter *inoutWriter) { ptrdiff_t mod4 = ((ptrdiff_t)(inoutWriter->bufPtr - (GLubyte *)0)) & 3; if (mod4) while (mod4++ < 4) *inoutWriter->bufPtr++ = 0; if (inoutWriter->bufPtr != inoutWriter->commandTail) { inoutWriter->bufPtr = inoutWriter->commandHead; fprintf( stderr, "GLS encoder error on command %s\n", __glsOpcodeString[__glsMapOpcode(inoutWriter->commandOpcode)] ); exit(EXIT_FAILURE); } } static void __glsWriter_nextList_bin(__GLSwriter *inoutWriter) { } static GLboolean __glsWriter_padWordCount_bin( __GLSwriter *inoutWriter, GLboolean inCountMod2 ) { if (inoutWriter->error) return GL_FALSE; if ((inoutWriter->wordCount & 1) == inCountMod2) return GL_TRUE; if (inoutWriter->bufPtr + 4 > inoutWriter->bufTail) { if (!inoutWriter->alloc(inoutWriter, 1)) return GL_FALSE; } if ( inoutWriter->prevCommand && inoutWriter->prevCommand->opSmall && inoutWriter->prevCommand->countSmall != USHRT_MAX ) { ++inoutWriter->prevCommand->countSmall; inoutWriter->commandTail += 4; inoutWriter->putGLuint(inoutWriter, 0); ++inoutWriter->wordCount; return GL_TRUE; } else if ( inoutWriter->prevCommand && inoutWriter->prevCommand->opLarge != GLS_OP_glsBeginGLS && inoutWriter->prevCommand->countLarge != ULONG_MAX ) { ++inoutWriter->prevCommand->countLarge; inoutWriter->commandTail += 4; inoutWriter->putGLuint(inoutWriter, 0); ++inoutWriter->wordCount; return GL_TRUE; } else { if (inoutWriter->beginCommand(inoutWriter, GLS_OP_glsPad, 0)) { inoutWriter->endCommand(inoutWriter); return GL_TRUE; } else { return GL_FALSE; } } } static GLboolean __glsWriter_padWordCount_bin_swap( __GLSwriter *inoutWriter, GLboolean inCountMod2 ) { if (inoutWriter->error) return GL_FALSE; if ((inoutWriter->wordCount & 1) == inCountMod2) return GL_TRUE; if (inoutWriter->bufPtr + 4 > inoutWriter->bufTail) { if (!inoutWriter->alloc(inoutWriter, 1)) return GL_FALSE; } if ( inoutWriter->prevCommand && inoutWriter->prevCommand->opSmall && inoutWriter->prevCommand->countSmall != USHRT_MAX ) { __glsSwap2(&inoutWriter->prevCommand->countSmall); ++inoutWriter->prevCommand->countSmall; __glsSwap2(&inoutWriter->prevCommand->countSmall); inoutWriter->commandTail += 4; inoutWriter->putGLuint(inoutWriter, 0); ++inoutWriter->wordCount; return GL_TRUE; } else if ( inoutWriter->prevCommand && ( __glsSwapi((GLint)inoutWriter->prevCommand->opLarge) != GLS_OP_glsBeginGLS ) && inoutWriter->prevCommand->countLarge != ULONG_MAX ) { __glsSwap4(&inoutWriter->prevCommand->countLarge); ++inoutWriter->prevCommand->countLarge; __glsSwap4(&inoutWriter->prevCommand->countLarge); inoutWriter->commandTail += 4; inoutWriter->putGLuint(inoutWriter, 0); ++inoutWriter->wordCount; return GL_TRUE; } else { if (inoutWriter->beginCommand(inoutWriter, GLS_OP_glsPad, 0)) { inoutWriter->endCommand(inoutWriter); return GL_TRUE; } else { return GL_FALSE; } } } static void __glsWriter_putGLbitvs_bin( __GLSwriter *inoutWriter, GLboolean inItemSwap, GLint inItemLeftShift, GLint inStrideDataItems, GLint inStridePadItems, GLint inStrideCount, const GLubyte *inVec ) { GLubyte *bufPtr = inoutWriter->bufPtr; GLint i; const GLint highShift = inItemLeftShift; const GLint lowShift = 8 - inItemLeftShift; GLubyte lastMask = 0xffu; if (inStrideDataItems & 7) lastMask <<= 8 - (inStrideDataItems & 7); inStrideDataItems = (inStrideDataItems + 7) >> 3; inStridePadItems >>= 3; inoutWriter->bufPtr += inStrideDataItems * inStrideCount; if (inoutWriter->bufPtr > inoutWriter->commandTail) return; if (!inItemSwap && !inItemLeftShift) while (inStrideCount-- > 0) { i = inStrideDataItems; while (i-- > 1) *bufPtr++ = *inVec++; if (!i) *bufPtr++ = (GLubyte)(*inVec++ & lastMask); inVec += inStridePadItems; } else if (!inItemLeftShift) while (inStrideCount-- > 0) { i = inStrideDataItems; while (i-- > 1) *bufPtr++ = __glsBitReverse[*inVec++]; if (!i) *bufPtr++ = (GLubyte)(__glsBitReverse[*inVec++] & lastMask); inVec += inStridePadItems; } else if (!inItemSwap) while (inStrideCount-- > 0) { i = inStrideDataItems; while (i-- > 1) { *bufPtr++ = (GLubyte)(*inVec++ << highShift | *inVec >> lowShift); } if (!i) *bufPtr++ = (GLubyte)((*inVec++ & lastMask) << highShift); inVec += inStridePadItems; } else while (inStrideCount-- > 0) { i = inStrideDataItems; while (i-- > 1) *bufPtr++ = (GLubyte)( __glsBitReverse[*inVec++] << highShift | __glsBitReverse[*inVec] >> lowShift ); if (!i) { *bufPtr++ = (GLubyte)( (__glsBitReverse[*inVec++] & lastMask) << highShift ); } inVec += inStridePadItems; } } __GLS_PUT_BIN(GLbyte, 1) __GLS_PUT_BIN(GLubyte, 1) __GLS_PUT_BIN_ENUM(GLint, GLenum) __GLS_PUT_BIN_ENUM(GLfloat, GLenum) __GLS_PUT_BIN_ENUM(GLdouble, GLenum) __GLS_PUT_BIN_ENUM_VAL(GLint, GLSenum) __GLS_PUT_BIN_SWAP(GLshort, 2) __GLS_PUT_BIN_SWAP(GLushort, 2) __GLS_PUT_BIN_SWAP(GLint, 4) __GLS_PUT_BIN_SWAP(GLuint, 4) __GLS_PUT_BIN_SWAP(GLfloat, 4) __GLS_PUT_BIN_SWAP(GLdouble, 8) __GLS_PUT_BIN_SWAP_VAL(GLlong, 8) __GLS_PUT_BIN_SWAP_VAL(GLulong, 8) __GLS_PUT_BIN_SWAP_VEC(GLlong, 8) __GLS_PUT_BIN_SWAP_VEC(GLulong, 8) __GLS_PUT_BIN_VAL(GLlong, 8) __GLS_PUT_BIN_VAL(GLulong, 8) __GLS_PUT_BIN_VEC(GLlong, 8) __GLS_PUT_BIN_VEC(GLulong, 8) static void __glsWriter_putGLdoublem_bin( __GLSwriter *inoutWriter, const GLdouble *inMat ) { __glsWriter_putGLdoublev_bin(inoutWriter, 16, inMat); } static void __glsWriter_putGLdoublem_bin_swap( __GLSwriter *inoutWriter, const GLdouble *inMat ) { __glsWriter_putGLdoublev_bin_swap(inoutWriter, 16, inMat); } static void __glsWriter_putGLfloatm_bin( __GLSwriter *inoutWriter, const GLfloat *inMat ) { __glsWriter_putGLfloatv_bin(inoutWriter, 16, inMat); } static void __glsWriter_putGLfloatm_bin_swap( __GLSwriter *inoutWriter, const GLfloat *inMat ) { __glsWriter_putGLfloatv_bin_swap(inoutWriter, 16, inMat); } static void __glsWriter_putGLoutArg_bin( __GLSwriter *inoutWriter, GLuint inIndex, const GLvoid *inVal ) { __GLScontext *const ctx = __GLS_CONTEXT; __glsWriter_putGLulong_bin( inoutWriter, ( ctx->callNesting && !ctx->commandFuncs[__glsMapOpcode(inoutWriter->commandOpcode)] ) ? ctx->outArgs.vals[inIndex] : __glsPtrToULong(inVal) ); } static void __glsWriter_putGLoutArg_bin_swap( __GLSwriter *inoutWriter, GLuint inIndex, const GLvoid *inVal ) { __GLScontext *const ctx = __GLS_CONTEXT; __glsWriter_putGLulong_bin_swap( inoutWriter, ( ctx->callNesting && !ctx->commandFuncs[__glsMapOpcode(inoutWriter->commandOpcode)] ) ? ctx->outArgs.vals[inIndex] : __glsPtrToULong(inVal) ); } /****************************************************************************** Dispatch setup ******************************************************************************/ #define __GLS_INIT_PUT_BIN(inDst, inSrc) \ __GLS_INIT_PUT_BIN_VAL(inDst, inSrc); \ __GLS_INIT_PUT_BIN_VEC(inDst, inSrc); \ __GLS_INIT_PUT_BIN_VECSTRIDE(inDst, inSrc); #define __GLS_INIT_PUT_BIN_SWAP(inDst, inSrc) \ __GLS_INIT_PUT_BIN_SWAP_VAL(inDst, inSrc); \ __GLS_INIT_PUT_BIN_SWAP_VEC(inDst, inSrc); \ __GLS_INIT_PUT_BIN_SWAP_VECSTRIDE(inDst, inSrc); #define __GLS_INIT_PUT_BIN_SWAP_MAT(inDst, inSrc) \ inoutWriter->put##inDst##m = ( \ swap ? \ __glsWriter_put##inSrc##m_bin_swap : __glsWriter_put##inSrc##m_bin \ ); #define __GLS_INIT_PUT_BIN_SWAP_VAL(inDst, inSrc) \ inoutWriter->put##inDst = ( \ swap ? \ __glsWriter_put##inSrc##_bin_swap : __glsWriter_put##inSrc##_bin \ ); #define __GLS_INIT_PUT_BIN_SWAP_VEC(inDst, inSrc) \ inoutWriter->put##inDst##v = ( \ swap ? \ __glsWriter_put##inSrc##v_bin_swap : __glsWriter_put##inSrc##v_bin \ ); #define __GLS_INIT_PUT_BIN_SWAP_VECSTRIDE(inDst, inSrc) \ inoutWriter->put##inDst##vs = ( \ swap ? \ __glsWriter_put##inSrc##vs_bin_swap : __glsWriter_put##inSrc##vs_bin \ ); #define __GLS_INIT_PUT_BIN_VAL(inDst, inSrc) \ inoutWriter->put##inDst = __glsWriter_put##inSrc##_bin; #define __GLS_INIT_PUT_BIN_VEC(inDst, inSrc) \ inoutWriter->put##inDst##v = __glsWriter_put##inSrc##v_bin; #define __GLS_INIT_PUT_BIN_VECSTRIDE(inDst, inSrc) \ inoutWriter->put##inDst##vs = __glsWriter_put##inSrc##vs_bin; void __glsWriter_initDispatch_bin( __GLSwriter *inoutWriter, GLSenum inStreamType ) { const GLboolean swap = (GLboolean)(inStreamType == __GLS_BINARY_SWAP1); if (inStreamType == GLS_CONTEXT) { inoutWriter->alloc = __glsWriter_alloc_context; } else { inoutWriter->alloc = __glsWriter_alloc_bin; } inoutWriter->beginCommand = __glsWriter_beginCommand_bin; inoutWriter->endCommand = __glsWriter_endCommand_bin; inoutWriter->nextList = __glsWriter_nextList_bin; inoutWriter->padWordCount = ( swap ? __glsWriter_padWordCount_bin_swap : __glsWriter_padWordCount_bin ); __GLS_INIT_PUT_BIN(GLbyte, GLbyte); __GLS_INIT_PUT_BIN(GLubyte, GLubyte); __GLS_INIT_PUT_BIN_SWAP(GLdouble, GLdouble); __GLS_INIT_PUT_BIN_SWAP(GLfloat, GLfloat); __GLS_INIT_PUT_BIN_SWAP(GLint, GLint); __GLS_INIT_PUT_BIN_SWAP(GLshort, GLshort); __GLS_INIT_PUT_BIN_SWAP(GLuint, GLuint); __GLS_INIT_PUT_BIN_SWAP(GLushort, GLushort); __GLS_INIT_PUT_BIN_SWAP_MAT(GLdouble, GLdouble); __GLS_INIT_PUT_BIN_SWAP_MAT(GLfloat, GLfloat); __GLS_INIT_PUT_BIN_SWAP_VAL(GLSenum, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLSimageFlags, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLSopcode, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLattribMask, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLblendingFactor, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLclearBufferMask, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLdrawBufferMode, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLenum, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLlong, GLlong); __GLS_INIT_PUT_BIN_SWAP_VAL(GLoutArg, GLoutArg); __GLS_INIT_PUT_BIN_SWAP_VAL(GLstencilOp, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLtextureComponentCount, GLint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLuinthex, GLuint); __GLS_INIT_PUT_BIN_SWAP_VAL(GLulong, GLulong); __GLS_INIT_PUT_BIN_SWAP_VAL(GLulonghex, GLulong); __GLS_INIT_PUT_BIN_SWAP_VAL(GLushorthex, GLushort); __GLS_INIT_PUT_BIN_SWAP_VEC(GLlong, GLlong); __GLS_INIT_PUT_BIN_SWAP_VEC(GLulong, GLulong); __GLS_INIT_PUT_BIN_VAL(GLboolean, GLubyte); __GLS_INIT_PUT_BIN_VAL(GLdoubleOrGLenum, GLdoubleOrGLenum); __GLS_INIT_PUT_BIN_VAL(GLfloatOrGLenum, GLfloatOrGLenum); __GLS_INIT_PUT_BIN_VAL(GLintOrGLSenum, GLintOrGLSenum); __GLS_INIT_PUT_BIN_VAL(GLintOrGLenum, GLintOrGLenum); __GLS_INIT_PUT_BIN_VEC(GLboolean, GLubyte); __GLS_INIT_PUT_BIN_VEC(GLchar, GLubyte); __GLS_INIT_PUT_BIN_VEC(GLdoubleOrGLenum, GLdoubleOrGLenum); __GLS_INIT_PUT_BIN_VEC(GLfloatOrGLenum, GLfloatOrGLenum); __GLS_INIT_PUT_BIN_VEC(GLintOrGLenum, GLintOrGLenum); __GLS_INIT_PUT_BIN_VECSTRIDE(GLbit, GLbit); __GLS_INIT_PUT_BIN_VECSTRIDE(GLboolean, GLubyte); }