/******************************Module*Header*******************************\ * Module Name: dl_listc.c (formerly soft\so_listc.c) * * Display list compilation routines. * * Created: 12-27-1995 * Author: Hock San Lee [hockl] * * Copyright (c) 1995 Microsoft Corporation \**************************************************************************/ /* ** Copyright 1991,1992, 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. ** ** $Revision: 1.15 $ ** $Date: 1993/10/23 00:34:54 $ */ #include "precomp.h" #pragma hdrstop /* Generic OpenGL Client using subbatching. */ #include "glsbmsg.h" #include "glsbmsgh.h" #include "glsrvspt.h" #include "subbatch.h" #include "batchinf.h" #include "image.h" // __glFillImage and __glImageSize definitions #include "listcomp.h" #include "lcfuncs.h" #include "dlist.h" #include "dlistopt.h" #include "glclt.h" /* ** The code in here makes a lot of assumptions about the size of the ** various user types (GLfloat, GLint, etcetra). */ void APIENTRY __gllc_Bitmap ( IN GLsizei width, IN GLsizei height, IN GLfloat xorig, IN GLfloat yorig, IN GLfloat xmove, IN GLfloat ymove, IN const GLubyte oldbits[] ) { __GLbitmap *bitmap; GLubyte *newbits; GLint imageSize; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if ((width < 0) || (height < 0)) { __gllc_InvalidValue(); return; } imageSize = height * ((width + 7) >> 3); imageSize = __GL_PAD(imageSize); bitmap = (__GLbitmap *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(imageSize + sizeof(__GLbitmap)), DLIST_GENERIC_OP(Bitmap)); if (bitmap == NULL) return; bitmap->width = width; bitmap->height = height; bitmap->xorig = xorig; bitmap->yorig = yorig; bitmap->xmove = xmove; bitmap->ymove = ymove; bitmap->imageSize = imageSize; newbits = (GLubyte *)bitmap + sizeof(__GLbitmap); __glFillImage(gc, width, height, GL_COLOR_INDEX, GL_BITMAP, oldbits, newbits); __glDlistAppendOp(gc, bitmap, __glle_Bitmap); } const GLubyte * FASTCALL __glle_Bitmap(__GLcontext *gc, const GLubyte *PC) { const __GLbitmap *bitmap; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! bitmap = (const __GLbitmap *) PC; GLCLIENT_BEGIN( Bitmap, BITMAP ) pMsg->width = bitmap->width ; pMsg->height = bitmap->height ; pMsg->xorig = bitmap->xorig ; pMsg->yorig = bitmap->yorig ; pMsg->xmove = bitmap->xmove ; pMsg->ymove = bitmap->ymove ; pMsg->bitmapOff = (ULONG_PTR) bitmap ; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLbitmap) + bitmap->imageSize; } void APIENTRY __gllc_PolygonStipple ( const GLubyte *mask ) { void *data; __GL_SETUP(); GLubyte *newbits; // Flush the command buffer before accessing server side gc states. glsbAttention(); newbits = (GLubyte *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(__glImageSize(32, 32, GL_COLOR_INDEX, GL_BITMAP)), DLIST_GENERIC_OP(PolygonStipple)); if (newbits == NULL) return; __glFillImage(gc, 32, 32, GL_COLOR_INDEX, GL_BITMAP, mask, newbits); __glDlistAppendOp(gc, newbits, __glle_PolygonStipple); } const GLubyte * FASTCALL __glle_PolygonStipple(__GLcontext *gc, const GLubyte *PC) { // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! GLCLIENT_BEGIN( PolygonStipple, POLYGONSTIPPLE ) pMsg->maskOff = (ULONG_PTR) PC ; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + __glImageSize(32, 32, GL_COLOR_INDEX, GL_BITMAP); } void __gllc_Map1_Internal ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint stride, IN GLint order, IN const void *points , GLboolean bDouble ) { __GLmap1 *map1data; GLint k; GLint cmdsize; __GLfloat *data; __GL_SETUP(); k=__glEvalComputeK(target); if (k < 0) { __gllc_InvalidEnum(); return; } if (order > gc->constants.maxEvalOrder || stride < k || order < 1 || u1 == u2) { __gllc_InvalidValue(); return; } cmdsize = sizeof(__GLmap1) + __glMap1_size(k, order) * sizeof(__GLfloat); map1data = (__GLmap1 *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(cmdsize), DLIST_GENERIC_OP(Map1)); if (map1data == NULL) return; map1data->target = target; map1data->u1 = u1; map1data->u2 = u2; map1data->order = order; data = (__GLfloat *) ((GLubyte *)map1data + sizeof(__GLmap1)); if (bDouble) __glFillMap1d(k, order, stride, (const GLdouble *) points, data); else __glFillMap1f(k, order, stride, (const GLfloat *) points, data); __glDlistAppendOp(gc, map1data, __glle_Map1); } void APIENTRY __gllc_Map1f ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint stride, IN GLint order, IN const GLfloat points[] ) { __gllc_Map1_Internal(target, u1, u2, stride, order, (const void *) points, GL_FALSE); } void APIENTRY __gllc_Map1d ( IN GLenum target, IN GLdouble u1, IN GLdouble u2, IN GLint stride, IN GLint order, IN const GLdouble points[] ) { __gllc_Map1_Internal(target, (GLfloat) u1, (GLfloat) u2, stride, order, (const void *) points, GL_TRUE); } const GLubyte * FASTCALL __glle_Map1(__GLcontext *gc, const GLubyte *PC) { const __GLmap1 *map1data; GLint k, dataSize; __GLevaluator1 *ev; __GLfloat *gc_data; POLYARRAY *pa; map1data = (const __GLmap1 *) PC; k = __glEvalComputeK(map1data->target); dataSize = __glMap1_size(k, map1data->order) * sizeof(__GLfloat); // Check if it is called inside a Begin-End block // If we are already in the begin/end bracket, return an error. pa = GLTEB_CLTPOLYARRAY(); if (pa->flags & POLYARRAY_IN_BEGIN) { GLSETERROR(GL_INVALID_OPERATION); return PC + sizeof(__GLmap1) + dataSize; } ev = __glSetUpMap1 (gc, map1data->target, map1data->order, map1data->u1, map1data->u2); if (ev != 0) { gc_data = gc->eval.eval1Data[__GL_EVAL1D_INDEX(map1data->target)]; memcpy (gc_data, (GLfloat *) (PC + sizeof(__GLmap1)), dataSize); } return PC + sizeof(__GLmap1) + dataSize; } void __gllc_Map2_Internal ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint ustride, IN GLint uorder, IN GLfloat v1, IN GLfloat v2, IN GLint vstride, IN GLint vorder, IN const void *points , GLboolean bDouble ) { __GLmap2 *map2data; GLint k; GLint cmdsize; __GLfloat *data; __GL_SETUP(); k=__glEvalComputeK(target); if (k < 0) { __gllc_InvalidEnum(); return; } if (vorder > gc->constants.maxEvalOrder || vstride < k || vorder < 1 || u1 == u2 || ustride < k || uorder > gc->constants.maxEvalOrder || uorder < 1 || v1 == v2) { __gllc_InvalidValue(); return; } cmdsize = sizeof(__GLmap2) + __glMap2_size(k, uorder, vorder) * sizeof(__GLfloat); map2data = (__GLmap2 *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(cmdsize), DLIST_GENERIC_OP(Map2)); if (map2data == NULL) return; map2data->target = target; map2data->u1 = u1; map2data->u2 = u2; map2data->uorder = uorder; map2data->v1 = v1; map2data->v2 = v2; map2data->vorder = vorder; data = (__GLfloat *) ((GLubyte *)map2data + sizeof(__GLmap2)); if (bDouble) __glFillMap2d(k, uorder, vorder, ustride, vstride, (const GLdouble *) points, data); else __glFillMap2f(k, uorder, vorder, ustride, vstride, (const GLfloat *) points, data); __glDlistAppendOp(gc, map2data, __glle_Map2); } void APIENTRY __gllc_Map2f ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint ustride, IN GLint uorder, IN GLfloat v1, IN GLfloat v2, IN GLint vstride, IN GLint vorder, IN const GLfloat points[] ) { __gllc_Map2_Internal(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, (const void *) points, GL_FALSE); } void APIENTRY __gllc_Map2d ( IN GLenum target, IN GLdouble u1, IN GLdouble u2, IN GLint ustride, IN GLint uorder, IN GLdouble v1, IN GLdouble v2, IN GLint vstride, IN GLint vorder, IN const GLdouble points[] ) { __gllc_Map2_Internal(target, (GLfloat) u1, (GLfloat) u2, ustride, uorder, (GLfloat) v1, (GLfloat) v2, vstride, vorder, (const void *) points, GL_TRUE); } const GLubyte * FASTCALL __glle_Map2(__GLcontext *gc, const GLubyte *PC) { const __GLmap2 *map2data; GLint k, dataSize; __GLevaluator2 *ev; __GLfloat *gc_data; POLYARRAY *pa; map2data = (const __GLmap2 *) PC; k = __glEvalComputeK (map2data->target); dataSize = __glMap2_size(k, map2data->uorder, map2data->vorder) * sizeof(__GLfloat); // Check if it is called inside a Begin-End block // If we are already in the begin/end bracket, return an error. pa = GLTEB_CLTPOLYARRAY(); if (pa->flags & POLYARRAY_IN_BEGIN) { GLSETERROR(GL_INVALID_OPERATION); return PC + sizeof(__GLmap2) + dataSize; } ev = __glSetUpMap2 (gc, map2data->target, map2data->uorder, map2data->vorder, map2data->u1, map2data->u2, map2data->v1, map2data->v2); if (ev != 0) { gc_data = gc->eval.eval2Data[__GL_EVAL2D_INDEX(map2data->target)]; memcpy (gc_data, (GLfloat *) (PC + sizeof(__GLmap2)), dataSize); } return PC + sizeof(__GLmap2) + dataSize; } void APIENTRY __gllc_DrawPixels ( IN GLsizei width, IN GLsizei height, IN GLenum format, IN GLenum type, IN const GLvoid *pixels ) { __GLdrawPixels *pixdata; GLint imageSize; GLboolean index; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if ((width < 0) || (height < 0)) { __gllc_InvalidValue(); return; } switch (format) { case GL_STENCIL_INDEX: case GL_COLOR_INDEX: index = GL_TRUE; break; case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: case GL_DEPTH_COMPONENT: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif index = GL_FALSE; break; default: __gllc_InvalidEnum(); return; } switch (type) { case GL_BITMAP: if (!index) { __gllc_InvalidEnum(); return; } break; case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return; } imageSize = __glImageSize(width, height, format, type); imageSize = __GL_PAD(imageSize); pixdata = (__GLdrawPixels *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLdrawPixels) + imageSize), DLIST_GENERIC_OP(DrawPixels)); if (pixdata == NULL) return; pixdata->width = width; pixdata->height = height; pixdata->format = format; pixdata->type = type; __glFillImage(gc, width, height, format, type, pixels, (GLubyte *)pixdata + sizeof(__GLdrawPixels)); __glDlistAppendOp(gc, pixdata, __glle_DrawPixels); } const GLubyte * FASTCALL __glle_DrawPixels(__GLcontext *gc, const GLubyte *PC) { const __GLdrawPixels *pixdata; GLint imageSize; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! pixdata = (const __GLdrawPixels *) PC; imageSize = __glImageSize(pixdata->width, pixdata->height, pixdata->format, pixdata->type); GLCLIENT_BEGIN( DrawPixels, DRAWPIXELS ) pMsg->width = pixdata->width ; pMsg->height = pixdata->height ; pMsg->format = pixdata->format ; pMsg->type = pixdata->type ; pMsg->pixelsOff = (ULONG_PTR) (pixdata+1) ; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLdrawPixels) + __GL_PAD(imageSize); } void APIENTRY __gllc_TexImage1D ( IN GLenum target, IN GLint level, IN GLint components, IN GLsizei width, IN GLint border, IN GLenum format, IN GLenum type, IN const GLvoid *pixels ) { __GLtexImage1D *texdata; GLint imageSize; GLboolean index; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if (border < 0 || border > 1) { __gllc_InvalidValue(); return; } if (width < 0) { __gllc_InvalidValue(); return; } switch (format) { case GL_COLOR_INDEX: index = GL_TRUE; break; case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif index = GL_FALSE; break; default: __gllc_InvalidEnum(); return; } switch (type) { case GL_BITMAP: if (!index) { __gllc_InvalidEnum(); return; } break; case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return; } if (target == GL_PROXY_TEXTURE_1D) { glcltTexImage1D(target, level, components, width, border, format, type, pixels); return; } else if (target != GL_TEXTURE_1D) { __gllc_InvalidEnum(); return; } else if (pixels == NULL) { imageSize = 0; } else { imageSize = __glImageSize(width, 1, format, type); } imageSize = __GL_PAD(imageSize); texdata = (__GLtexImage1D *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexImage1D)+imageSize), DLIST_GENERIC_OP(TexImage1D)); if (texdata == NULL) return; texdata->target = target; texdata->level = level; texdata->components = components; texdata->width = width; texdata->border = border; texdata->format = format; texdata->type = type; texdata->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, width, 1, format, type, pixels, (GLubyte *)texdata + sizeof(__GLtexImage1D)); } __glDlistAppendOp(gc, texdata, __glle_TexImage1D); } void APIENTRY __gllc_TexImage2D ( IN GLenum target, IN GLint level, IN GLint components, IN GLsizei width, IN GLsizei height, IN GLint border, IN GLenum format, IN GLenum type, IN const GLvoid *pixels ) { __GLtexImage2D *texdata; GLint imageSize; GLboolean index; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if (border < 0 || border > 1) { __gllc_InvalidValue(); return; } if ((width < 0) || (height < 0)) { __gllc_InvalidValue(); return; } switch (format) { case GL_COLOR_INDEX: index = GL_TRUE; break; case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif index = GL_FALSE; break; default: __gllc_InvalidEnum(); return; } switch (type) { case GL_BITMAP: if (!index) { __gllc_InvalidEnum(); return; } break; case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return; } if (target == GL_PROXY_TEXTURE_2D) { glcltTexImage2D(target, level, components, width, height, border, format, type, pixels); return; } else if (target != GL_TEXTURE_2D) { __gllc_InvalidEnum(); return; } else if (pixels == NULL) { imageSize = 0; } else { imageSize = __glImageSize(width, height, format, type); } imageSize = __GL_PAD(imageSize); texdata = (__GLtexImage2D *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexImage2D) + imageSize), DLIST_GENERIC_OP(TexImage2D)); if (texdata == NULL) return; texdata->target = target; texdata->level = level; texdata->components = components; texdata->width = width; texdata->height = height; texdata->border = border; texdata->format = format; texdata->type = type; texdata->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, width, height, format, type, pixels, (GLubyte *) (GLubyte *)texdata + sizeof(__GLtexImage2D)); } __glDlistAppendOp(gc, texdata, __glle_TexImage2D); } const GLubyte * FASTCALL __glle_TexImage1D(__GLcontext *gc, const GLubyte *PC) { const __GLtexImage1D *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLtexImage1D *) PC; GLCLIENT_BEGIN( TexImage1D, TEXIMAGE1D ) pMsg->target = data->target ; pMsg->level = data->level ; pMsg->components = data->components ; pMsg->width = data->width ; pMsg->border = data->border ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->pixelsOff = data->imageSize > 0 ? (ULONG_PTR) (data+1) : 0; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLtexImage1D) + data->imageSize; } const GLubyte * FASTCALL __glle_TexImage2D(__GLcontext *gc, const GLubyte *PC) { const __GLtexImage2D *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLtexImage2D *) PC; GLCLIENT_BEGIN( TexImage2D, TEXIMAGE2D ) pMsg->target = data->target ; pMsg->level = data->level ; pMsg->components = data->components ; pMsg->width = data->width ; pMsg->height = data->height ; pMsg->border = data->border ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->pixelsOff = data->imageSize > 0 ? (ULONG_PTR) (data+1) : 0; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLtexImage2D) + data->imageSize; } void APIENTRY __gllc_TexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { __GLtexSubImage1D *texdata; GLint imageSize; GLboolean index; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if (width < 0) { __gllc_InvalidValue(); return; } switch (format) { case GL_COLOR_INDEX: index = GL_TRUE; break; case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif index = GL_FALSE; break; default: __gllc_InvalidEnum(); return; } switch (type) { case GL_BITMAP: if (!index) { __gllc_InvalidEnum(); return; } break; case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return; } imageSize = __glImageSize(width, 1, format, type); imageSize = __GL_PAD(imageSize); texdata = (__GLtexSubImage1D *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexSubImage1D) + imageSize), DLIST_GENERIC_OP(TexSubImage1D)); if (texdata == NULL) return; texdata->target = target; texdata->level = level; texdata->xoffset = xoffset; texdata->width = width; texdata->format = format; texdata->type = type; texdata->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, width, 1, format, type, pixels, (GLubyte *)texdata + sizeof(__GLtexSubImage1D)); } __glDlistAppendOp(gc, texdata, __glle_TexSubImage1D); } void APIENTRY __gllc_TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) { __GLtexSubImage2D *texdata; GLint imageSize; GLboolean index; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); if ((width < 0) || (height < 0)) { __gllc_InvalidValue(); return; } switch (format) { case GL_COLOR_INDEX: index = GL_TRUE; break; case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif index = GL_FALSE; break; default: __gllc_InvalidEnum(); return; } switch (type) { case GL_BITMAP: if (!index) { __gllc_InvalidEnum(); return; } break; case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return; } imageSize = __glImageSize(width, height, format, type); imageSize = __GL_PAD(imageSize); texdata = (__GLtexSubImage2D *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLtexSubImage2D) + imageSize), DLIST_GENERIC_OP(TexSubImage2D)); if (texdata == NULL) return; texdata->target = target; texdata->level = level; texdata->xoffset = xoffset; texdata->yoffset = yoffset; texdata->width = width; texdata->height = height; texdata->format = format; texdata->type = type; texdata->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, width, height, format, type, pixels, (GLubyte *) texdata + sizeof(__GLtexSubImage2D)); } __glDlistAppendOp(gc, texdata, __glle_TexSubImage2D); } const GLubyte * FASTCALL __glle_TexSubImage1D(__GLcontext *gc, const GLubyte *PC) { const __GLtexSubImage1D *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLtexSubImage1D *) PC; GLCLIENT_BEGIN( TexSubImage1D, TEXSUBIMAGE1D ) pMsg->target = data->target ; pMsg->level = data->level ; pMsg->xoffset = data->xoffset ; pMsg->width = data->width ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->pixelsOff = (ULONG_PTR) (data+1) ; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLtexSubImage1D) + data->imageSize; } const GLubyte * FASTCALL __glle_TexSubImage2D(__GLcontext *gc, const GLubyte *PC) { const __GLtexSubImage2D *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLtexSubImage2D *) PC; GLCLIENT_BEGIN( TexSubImage2D, TEXSUBIMAGE2D ) pMsg->target = data->target ; pMsg->level = data->level ; pMsg->xoffset = data->xoffset ; pMsg->yoffset = data->yoffset ; pMsg->width = data->width ; pMsg->height = data->height ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->pixelsOff = (ULONG_PTR) (data+1) ; pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLtexSubImage2D) + data->imageSize; } GLint __gllc_CheckColorTableArgs(GLenum target, GLsizei count, GLenum format, GLenum type) { GLint imageSize; switch (type) { case GL_BYTE: case GL_UNSIGNED_BYTE: case GL_SHORT: case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: case GL_FLOAT: break; default: __gllc_InvalidEnum(); return -1; } switch (format) { case GL_RED: case GL_GREEN: case GL_BLUE: case GL_ALPHA: case GL_RGB: case GL_RGBA: #ifdef GL_EXT_bgra case GL_BGRA_EXT: case GL_BGR_EXT: #endif break; default: __gllc_InvalidEnum(); return -1; } if (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D && target != GL_PROXY_TEXTURE_1D && target != GL_PROXY_TEXTURE_2D) { __gllc_InvalidEnum(); return -1; } else { imageSize = __glImageSize(count, 1, format, type); } imageSize = __GL_PAD(imageSize); return imageSize; } void APIENTRY __gllc_ColorTableEXT ( IN GLenum target, IN GLenum internalFormat, IN GLsizei width, IN GLenum format, IN GLenum type, IN const GLvoid *data ) { __GLcolorTableEXT *record; GLint imageSize; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); imageSize = __gllc_CheckColorTableArgs(target, width, format, type); if (imageSize < 0) { return; } switch(internalFormat) { case GL_RGB: case 3: case GL_R3_G3_B2: case GL_RGB4: case GL_RGB5: case GL_RGB8: case GL_RGB10: case GL_RGB12: case GL_RGB16: #ifdef GL_EXT_bgra case GL_BGR_EXT: #endif break; case GL_RGBA: case 4: case GL_RGBA2: case GL_RGBA4: case GL_RGBA8: case GL_RGB5_A1: case GL_RGBA12: case GL_RGBA16: case GL_RGB10_A2: #ifdef GL_EXT_bgra case GL_BGRA_EXT: #endif break; default: __gllc_InvalidEnum(); return; } record = (__GLcolorTableEXT *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLcolorTableEXT)+imageSize), DLIST_GENERIC_OP(ColorTableEXT)); if (record == NULL) return; record->target = target; record->internalFormat = internalFormat; record->width = width; record->format = format; record->type = type; record->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, width, 1, format, type, data, (GLubyte *)record + sizeof(__GLcolorTableEXT)); } __glDlistAppendOp(gc, record, __glle_ColorTableEXT); } const GLubyte * FASTCALL __glle_ColorTableEXT(__GLcontext *gc, const GLubyte *PC) { const __GLcolorTableEXT *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLcolorTableEXT *) PC; GLCLIENT_BEGIN( ColorTableEXT, COLORTABLEEXT ) pMsg->target = data->target ; pMsg->internalFormat = data->internalFormat; pMsg->width = data->width ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->data = (const GLvoid *) (data+1); pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLcolorTableEXT) + data->imageSize; } void APIENTRY __gllc_ColorSubTableEXT ( IN GLenum target, IN GLsizei start, IN GLsizei count, IN GLenum format, IN GLenum type, IN const GLvoid *data ) { __GLcolorSubTableEXT *record; GLint imageSize; __GL_SETUP(); // Flush the command buffer before accessing server side gc states. glsbAttention(); imageSize = __gllc_CheckColorTableArgs(target, count, format, type); if (imageSize < 0) { return; } record = (__GLcolorSubTableEXT *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(__GLcolorSubTableEXT)+imageSize), DLIST_GENERIC_OP(ColorSubTableEXT)); if (record == NULL) return; record->target = target; record->start = start; record->count = count; record->format = format; record->type = type; record->imageSize = imageSize; if (imageSize > 0) { __glFillImage(gc, count, 1, format, type, data, (GLubyte *)record + sizeof(__GLcolorSubTableEXT)); } __glDlistAppendOp(gc, record, __glle_ColorSubTableEXT); } const GLubyte * FASTCALL __glle_ColorSubTableEXT(__GLcontext *gc, const GLubyte *PC) { const __GLcolorSubTableEXT *data; // Call the server side display list execute function. // Batch the pointer here but we need to flush the command buffer before // the memory is moved or modified! data = (const __GLcolorSubTableEXT *) PC; GLCLIENT_BEGIN( ColorSubTableEXT, COLORSUBTABLEEXT ) pMsg->target = data->target ; pMsg->start = data->start ; pMsg->count = data->count ; pMsg->format = data->format ; pMsg->type = data->type ; pMsg->data = (const GLvoid *) (data+1); pMsg->_IsDlist = GL_TRUE ; GLCLIENT_END return PC + sizeof(__GLcolorSubTableEXT) + data->imageSize; } #ifdef GL_WIN_multiple_textures void APIENTRY __gllc_CurrentTextureIndexWIN (GLuint index) { struct __gllc_CurrentTextureIndexWIN_Rec *data; __GL_SETUP(); data = (struct __gllc_CurrentTextureIndexWIN_Rec *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_CurrentTextureIndexWIN_Rec)), DLIST_GENERIC_OP(CurrentTextureIndexWIN)); if (data == NULL) return; data->index = index; __glDlistAppendOp(gc, data, __glle_CurrentTextureIndexWIN); } void APIENTRY __gllc_BindNthTextureWIN (GLuint index, GLenum target, GLuint texture) { struct __gllc_BindNthTextureWIN_Rec *data; __GL_SETUP(); data = (struct __gllc_BindNthTextureWIN_Rec *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_BindNthTextureWIN_Rec)), DLIST_GENERIC_OP(BindNthTextureWIN)); if (data == NULL) return; data->index = index; data->target = target; data->texture = texture; __glDlistAppendOp(gc, data, __glle_BindNthTextureWIN); } void APIENTRY __gllc_NthTexCombineFuncWIN (GLuint index, GLenum leftColorFactor, GLenum colorOp, GLenum rightColorFactor, GLenum leftAlphaFactor, GLenum alphaOp, GLenum rightAlphaFactor) { struct __gllc_NthTexCombineFuncWIN_Rec *data; __GL_SETUP(); data = (struct __gllc_NthTexCombineFuncWIN_Rec *) __glDlistAddOpUnaligned(gc, DLIST_SIZE(sizeof(struct __gllc_NthTexCombineFuncWIN_Rec)), DLIST_GENERIC_OP(NthTexCombineFuncWIN)); if (data == NULL) return; data->index = index; data->leftColorFactor = leftColorFactor; data->colorOp = colorOp; data->rightColorFactor = rightColorFactor; data->leftAlphaFactor = leftAlphaFactor; data->alphaOp = alphaOp; data->rightAlphaFactor = rightAlphaFactor; __glDlistAppendOp(gc, data, __glle_NthTexCombineFuncWIN); } #endif // GL_WIN_multiple_textures