/******************************Module*Header*******************************\ * Module Name: glcltgsh.c * * OpenGL client side generic functions. * * Created: 11-7-1993 * Author: Hock San Lee [hockl] * * 08-Nov-1993 Added functions Pixel, Evaluators, GetString, * Feedback and Selection functions * Pierre Tardif, ptar@sgi.com * * Copyright (c) 1993 Microsoft Corporation \**************************************************************************/ /* Generic OpenGL Client using subbatching. Hand coded functions */ #include "precomp.h" #pragma hdrstop #include "types.h" #include "glsbmsg.h" #include "glsbmsgh.h" #include "glsrvspt.h" #include "subbatch.h" #include "batchinf.h" #include "glsbcltu.h" #include "glclt.h" #include "compsize.h" #include "glsize.h" #include "context.h" #include "global.h" #include "lighting.h" void APIENTRY glcltFogf ( IN GLenum pname, IN GLfloat param ) { // FOG_ASSERT if (!RANGE(pname,GL_FOG_INDEX,GL_FOG_MODE)) { GLSETERROR(GL_INVALID_ENUM); return; } glcltFogfv(pname, ¶m); } void APIENTRY glcltFogfv ( IN GLenum pname, IN const GLfloat params[] ) { // FOG_ASSERT if (!RANGE(pname,GL_FOG_INDEX,GL_FOG_COLOR)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( Fogfv, FOGFV ) pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_FOG_COLOR) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltFogi ( IN GLenum pname, IN GLint param ) { GLfloat fParam; // FOG_ASSERT if (!RANGE(pname,GL_FOG_INDEX,GL_FOG_MODE)) { GLSETERROR(GL_INVALID_ENUM); return; } fParam = (GLfloat) param; glcltFogfv(pname, &fParam); } void APIENTRY glcltFogiv ( IN GLenum pname, IN const GLint params[] ) { GLfloat fParams[4]; switch (pname) { case GL_FOG_INDEX: case GL_FOG_DENSITY: case GL_FOG_START: case GL_FOG_END: case GL_FOG_MODE: fParams[0] = (GLfloat) params[0]; break; case GL_FOG_COLOR: fParams[0] = __GL_I_TO_FLOAT(params[0]); fParams[1] = __GL_I_TO_FLOAT(params[1]); fParams[2] = __GL_I_TO_FLOAT(params[2]); fParams[3] = __GL_I_TO_FLOAT(params[3]); break; } glcltFogfv(pname, fParams); } void APIENTRY glcltLightf ( IN GLenum light, IN GLenum pname, IN GLfloat param ) { // LIGHT_SOURCE_ASSERT if (!RANGE(pname,GL_SPOT_EXPONENT,GL_QUADRATIC_ATTENUATION)) { GLSETERROR(GL_INVALID_ENUM); return; } glcltLightfv(light, pname, ¶m); } void APIENTRY glcltLightfv ( IN GLenum light, IN GLenum pname, IN const GLfloat params[] ) { // LIGHT_SOURCE_ASSERT if (!RANGE(pname,GL_AMBIENT,GL_QUADRATIC_ATTENUATION)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( Lightfv, LIGHTFV ) pMsg->light = light; pMsg->pname = pname; switch (pname) { case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: case GL_POSITION: pMsg->params[3] = params[3]; case GL_SPOT_DIRECTION: pMsg->params[2] = params[2]; pMsg->params[1] = params[1]; default: pMsg->params[0] = params[0]; } GLCLIENT_END return; } void APIENTRY glcltLighti ( IN GLenum light, IN GLenum pname, IN GLint param ) { GLfloat fParam; // LIGHT_SOURCE_ASSERT if (!RANGE(pname,GL_SPOT_EXPONENT,GL_QUADRATIC_ATTENUATION)) { GLSETERROR(GL_INVALID_ENUM); return; } fParam = (GLfloat) param; glcltLightfv(light, pname, &fParam); } void APIENTRY glcltLightiv ( IN GLenum light, IN GLenum pname, IN const GLint params[] ) { GLfloat fParams[4]; switch (pname) { case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: fParams[0] = __GL_I_TO_FLOAT(params[0]); fParams[1] = __GL_I_TO_FLOAT(params[1]); fParams[2] = __GL_I_TO_FLOAT(params[2]); fParams[3] = __GL_I_TO_FLOAT(params[3]); break; case GL_POSITION: fParams[3] = (GLfloat) params[3]; case GL_SPOT_DIRECTION: fParams[2] = (GLfloat) params[2]; fParams[1] = (GLfloat) params[1]; case GL_SPOT_EXPONENT: case GL_SPOT_CUTOFF: case GL_CONSTANT_ATTENUATION: case GL_LINEAR_ATTENUATION: case GL_QUADRATIC_ATTENUATION: fParams[0] = (GLfloat) params[0]; break; } glcltLightfv(light, pname, fParams); } void APIENTRY glcltLightModelf ( IN GLenum pname, IN GLfloat param ) { // LIGHT_MODEL_ASSERT if (!RANGE(pname,GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE)) { GLSETERROR(GL_INVALID_ENUM); return; } glcltLightModelfv(pname, ¶m); } void APIENTRY glcltLightModelfv ( IN GLenum pname, IN const GLfloat params[] ) { // LIGHT_MODEL_ASSERT if (!RANGE(pname,GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_AMBIENT)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( LightModelfv, LIGHTMODELFV ) pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_LIGHT_MODEL_AMBIENT) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltLightModeli ( IN GLenum pname, IN GLint param ) { GLfloat fParam; // LIGHT_MODEL_ASSERT if (!RANGE(pname,GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE)) { GLSETERROR(GL_INVALID_ENUM); return; } fParam = (GLfloat) param; glcltLightModelfv(pname, &fParam); } void APIENTRY glcltLightModeliv ( IN GLenum pname, IN const GLint params[] ) { GLfloat fParams[4]; switch (pname) { case GL_LIGHT_MODEL_AMBIENT: fParams[0] = __GL_I_TO_FLOAT(params[0]); fParams[1] = __GL_I_TO_FLOAT(params[1]); fParams[2] = __GL_I_TO_FLOAT(params[2]); fParams[3] = __GL_I_TO_FLOAT(params[3]); break; case GL_LIGHT_MODEL_LOCAL_VIEWER: case GL_LIGHT_MODEL_TWO_SIDE: fParams[0] = (GLfloat) params[0]; break; } glcltLightModelfv(pname, fParams); } void APIENTRY glcltTexParameterf ( IN GLenum target, IN GLenum pname, IN GLfloat param ) { // TEX_PARAMETER_ASSERT if (!RANGE(pname,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_T) && pname != GL_TEXTURE_PRIORITY) { GLSETERROR(GL_INVALID_ENUM); return; } glcltTexParameterfv(target, pname, ¶m); } void APIENTRY glcltTexParameterfv ( IN GLenum target, IN GLenum pname, IN const GLfloat params[] ) { switch (pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_BORDER_COLOR: case GL_TEXTURE_PRIORITY: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( TexParameterfv, TEXPARAMETERFV ) pMsg->target = target; pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_TEXTURE_BORDER_COLOR) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltTexParameteri ( IN GLenum target, IN GLenum pname, IN GLint param ) { // TEX_PARAMETER_ASSERT if (!RANGE(pname,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_T) && pname != GL_TEXTURE_PRIORITY) { GLSETERROR(GL_INVALID_ENUM); return; } glcltTexParameteriv(target, pname, ¶m); } void APIENTRY glcltTexParameteriv ( IN GLenum target, IN GLenum pname, IN const GLint params[] ) { switch (pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_BORDER_COLOR: case GL_TEXTURE_PRIORITY: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( TexParameteriv, TEXPARAMETERIV ) pMsg->target = target; pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_TEXTURE_BORDER_COLOR) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltTexEnvf ( IN GLenum target, IN GLenum pname, IN GLfloat param ) { if (pname != GL_TEXTURE_ENV_MODE) { GLSETERROR(GL_INVALID_ENUM); return; } glcltTexEnvfv(target, pname, ¶m); } void APIENTRY glcltTexEnvfv ( IN GLenum target, IN GLenum pname, IN const GLfloat params[] ) { if (pname != GL_TEXTURE_ENV_MODE && pname != GL_TEXTURE_ENV_COLOR) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( TexEnvfv, TEXENVFV ) pMsg->target = target; pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_TEXTURE_ENV_COLOR) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltTexEnvi ( IN GLenum target, IN GLenum pname, IN GLint param ) { if (pname != GL_TEXTURE_ENV_MODE) { GLSETERROR(GL_INVALID_ENUM); return; } glcltTexEnviv(target, pname, ¶m); } void APIENTRY glcltTexEnviv ( IN GLenum target, IN GLenum pname, IN const GLint params[] ) { if (pname != GL_TEXTURE_ENV_MODE && pname != GL_TEXTURE_ENV_COLOR) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( TexEnviv, TEXENVIV ) pMsg->target = target; pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname == GL_TEXTURE_ENV_COLOR) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltTexGend ( IN GLenum coord, IN GLenum pname, IN GLdouble param ) { GLfloat fParam; if (pname != GL_TEXTURE_GEN_MODE) { GLSETERROR(GL_INVALID_ENUM); return; } fParam = (GLfloat) param; glcltTexGenfv(coord, pname, &fParam); } void APIENTRY glcltTexGendv ( IN GLenum coord, IN GLenum pname, IN const GLdouble params[] ) { GLfloat fParams[4]; switch (pname) { case GL_OBJECT_PLANE: case GL_EYE_PLANE: fParams[3] = (GLfloat) params[3]; fParams[2] = (GLfloat) params[2]; fParams[1] = (GLfloat) params[1]; // fall through case GL_TEXTURE_GEN_MODE: fParams[0] = (GLfloat) params[0]; break; } glcltTexGenfv(coord, pname, fParams); } void APIENTRY glcltTexGenf ( IN GLenum coord, IN GLenum pname, IN GLfloat param ) { if (pname != GL_TEXTURE_GEN_MODE) { GLSETERROR(GL_INVALID_ENUM); return; } glcltTexGenfv(coord, pname, ¶m); } void APIENTRY glcltTexGenfv ( IN GLenum coord, IN GLenum pname, IN const GLfloat params[] ) { // TEX_GEN_ASSERT if (!RANGE(pname,GL_TEXTURE_GEN_MODE,GL_EYE_PLANE)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( TexGenfv, TEXGENFV ) pMsg->coord = coord; pMsg->pname = pname; pMsg->params[0] = params[0]; if (pname != GL_TEXTURE_GEN_MODE) { pMsg->params[1] = params[1]; pMsg->params[2] = params[2]; pMsg->params[3] = params[3]; } GLCLIENT_END return; } void APIENTRY glcltTexGeni ( IN GLenum coord, IN GLenum pname, IN GLint param ) { GLfloat fParam; if (pname != GL_TEXTURE_GEN_MODE) { GLSETERROR(GL_INVALID_ENUM); return; } fParam = (GLfloat) param; glcltTexGenfv(coord, pname, &fParam); } void APIENTRY glcltTexGeniv ( IN GLenum coord, IN GLenum pname, IN const GLint params[] ) { GLfloat fParams[4]; switch (pname) { case GL_OBJECT_PLANE: case GL_EYE_PLANE: fParams[3] = (GLfloat) params[3]; fParams[2] = (GLfloat) params[2]; fParams[1] = (GLfloat) params[1]; // fall through case GL_TEXTURE_GEN_MODE: fParams[0] = (GLfloat) params[0]; break; } glcltTexGenfv(coord, pname, fParams); } void APIENTRY glcltGetBooleanv ( IN GLenum pname, OUT GLboolean params[] ) { #ifndef _CLIENTSIDE_ int cArgs; cArgs = __glGet_size(pname); if (cArgs == 0) { GLSETERROR(GL_INVALID_ENUM); return; } ASSERTOPENGL(cArgs <= 16, "bad get size"); GLCLIENT_BEGIN( GetBooleanv, GETBOOLEANV ) pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetBooleanv, GETBOOLEANV ) pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetDoublev ( IN GLenum pname, OUT GLdouble params[] ) { #ifndef _CLIENTSIDE_ int cArgs; cArgs = __glGet_size(pname); if (cArgs == 0) { GLSETERROR(GL_INVALID_ENUM); return; } ASSERTOPENGL(cArgs <= 16, "bad get size"); GLCLIENT_BEGIN( GetDoublev, GETDOUBLEV ) pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetDoublev, GETDOUBLEV ) pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetFloatv ( IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ int cArgs; cArgs = __glGet_size(pname); if (cArgs == 0) { GLSETERROR(GL_INVALID_ENUM); return; } ASSERTOPENGL(cArgs <= 16, "bad get size"); GLCLIENT_BEGIN( GetFloatv, GETFLOATV ) pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetFloatv, GETFLOATV ) pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetIntegerv ( IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ int cArgs; cArgs = __glGet_size(pname); if (cArgs == 0) { GLSETERROR(GL_INVALID_ENUM); return; } ASSERTOPENGL(cArgs <= 16, "bad get size"); GLCLIENT_BEGIN( GetIntegerv, GETINTEGERV ) pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetIntegerv, GETINTEGERV ) pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetLightfv ( IN GLenum light, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ // LIGHT_SOURCE_ASSERT if (!RANGE(pname,GL_AMBIENT,GL_QUADRATIC_ATTENUATION)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetLightfv, GETLIGHTFV ) pMsg->light = light; pMsg->pname = pname; glsbAttention(); switch (pname) { case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: case GL_POSITION: params[3] = pMsg->params[3]; case GL_SPOT_DIRECTION: params[2] = pMsg->params[2]; params[1] = pMsg->params[1]; default: params[0] = pMsg->params[0]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetLightfv, GETLIGHTFV ) pMsg->light = light; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetLightiv ( IN GLenum light, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ // LIGHT_SOURCE_ASSERT if (!RANGE(pname,GL_AMBIENT,GL_QUADRATIC_ATTENUATION)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetLightiv, GETLIGHTIV ) pMsg->light = light; pMsg->pname = pname; glsbAttention(); switch (pname) { case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: case GL_POSITION: params[3] = pMsg->params[3]; case GL_SPOT_DIRECTION: params[2] = pMsg->params[2]; params[1] = pMsg->params[1]; default: params[0] = pMsg->params[0]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetLightiv, GETLIGHTIV ) pMsg->light = light; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetMaterialfv ( IN GLenum face, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ int cArgs; switch (pname) { case GL_SHININESS: cArgs = 1; break; case GL_EMISSION: case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: cArgs = 4; break; case GL_COLOR_INDEXES: cArgs = 3; break; case GL_AMBIENT_AND_DIFFUSE: default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetMaterialfv, GETMATERIALFV ) pMsg->face = face; pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetMaterialfv, GETMATERIALFV ) pMsg->face = face; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetMaterialiv ( IN GLenum face, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ int cArgs; switch (pname) { case GL_SHININESS: cArgs = 1; break; case GL_EMISSION: case GL_AMBIENT: case GL_DIFFUSE: case GL_SPECULAR: cArgs = 4; break; case GL_COLOR_INDEXES: cArgs = 3; break; case GL_AMBIENT_AND_DIFFUSE: default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetMaterialiv, GETMATERIALIV ) pMsg->face = face; pMsg->pname = pname; glsbAttention(); while (--cArgs >= 0) params[cArgs] = pMsg->params[cArgs]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetMaterialiv, GETMATERIALIV ) pMsg->face = face; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexEnvfv ( IN GLenum target, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ if (pname != GL_TEXTURE_ENV_MODE && pname != GL_TEXTURE_ENV_COLOR) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexEnvfv, GETTEXENVFV ) pMsg->target = target; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname == GL_TEXTURE_ENV_COLOR) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexEnvfv, GETTEXENVFV ) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexEnviv ( IN GLenum target, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ if (pname != GL_TEXTURE_ENV_MODE && pname != GL_TEXTURE_ENV_COLOR) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexEnviv, GETTEXENVIV ) pMsg->target = target; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname == GL_TEXTURE_ENV_COLOR) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexEnviv, GETTEXENVIV ) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexGendv ( IN GLenum coord, IN GLenum pname, OUT GLdouble params[] ) { #ifndef _CLIENTSIDE_ // TEX_GEN_ASSERT if (!RANGE(pname,GL_TEXTURE_GEN_MODE,GL_EYE_PLANE)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexGendv, GETTEXGENDV ) pMsg->coord = coord; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname != GL_TEXTURE_GEN_MODE) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexGendv, GETTEXGENDV ) pMsg->coord = coord; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexGenfv ( IN GLenum coord, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ // TEX_GEN_ASSERT if (!RANGE(pname,GL_TEXTURE_GEN_MODE,GL_EYE_PLANE)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexGenfv, GETTEXGENFV ) pMsg->coord = coord; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname != GL_TEXTURE_GEN_MODE) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexGenfv, GETTEXGENFV ) pMsg->coord = coord; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexGeniv ( IN GLenum coord, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ // TEX_GEN_ASSERT if (!RANGE(pname,GL_TEXTURE_GEN_MODE,GL_EYE_PLANE)) { GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexGeniv, GETTEXGENIV ) pMsg->coord = coord; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname != GL_TEXTURE_GEN_MODE) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexGeniv, GETTEXGENIV ) pMsg->coord = coord; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexParameterfv ( IN GLenum target, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ switch (pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_BORDER_COLOR: case GL_TEXTURE_PRIORITY: case GL_TEXTURE_RESIDENT: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexParameterfv, GETTEXPARAMETERFV ) pMsg->target = target; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname == GL_TEXTURE_BORDER_COLOR) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexParameterfv, GETTEXPARAMETERFV ) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexParameteriv ( IN GLenum target, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ switch (pname) { case GL_TEXTURE_WRAP_S: case GL_TEXTURE_WRAP_T: case GL_TEXTURE_MIN_FILTER: case GL_TEXTURE_MAG_FILTER: case GL_TEXTURE_BORDER_COLOR: case GL_TEXTURE_PRIORITY: case GL_TEXTURE_RESIDENT: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexParameteriv, GETTEXPARAMETERIV ) pMsg->target = target; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; if (pname == GL_TEXTURE_BORDER_COLOR) { params[1] = pMsg->params[1]; params[2] = pMsg->params[2]; params[3] = pMsg->params[3]; } GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexParameteriv, GETTEXPARAMETERIV ) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexLevelParameterfv ( IN GLenum target, IN GLint level, IN GLenum pname, OUT GLfloat params[] ) { #ifndef _CLIENTSIDE_ switch (pname) { case GL_TEXTURE_WIDTH: case GL_TEXTURE_HEIGHT: case GL_TEXTURE_COMPONENTS: case GL_TEXTURE_BORDER: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexLevelParameterfv, GETTEXLEVELPARAMETERFV ) pMsg->target = target; pMsg->level = level; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexLevelParameterfv, GETTEXLEVELPARAMETERFV ) pMsg->target = target; pMsg->level = level; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } void APIENTRY glcltGetTexLevelParameteriv ( IN GLenum target, IN GLint level, IN GLenum pname, OUT GLint params[] ) { #ifndef _CLIENTSIDE_ switch (pname) { case GL_TEXTURE_WIDTH: case GL_TEXTURE_HEIGHT: case GL_TEXTURE_COMPONENTS: case GL_TEXTURE_BORDER: break; default: GLSETERROR(GL_INVALID_ENUM); return; } GLCLIENT_BEGIN( GetTexLevelParameteriv, GETTEXLEVELPARAMETERIV ) pMsg->target = target; pMsg->level = level; pMsg->pname = pname; glsbAttention(); params[0] = pMsg->params[0]; GLCLIENT_END return; #else GLCLIENT_BEGIN( GetTexLevelParameteriv, GETTEXLEVELPARAMETERIV ) pMsg->target = target; pMsg->level = level; pMsg->pname = pname; pMsg->params = params; glsbAttention(); GLCLIENT_END return; #endif } /******* Select and Feedback functions ******************************/ /* * Note: * * The size of the data is not required on the client side. * Since calculating the size of the data requires * knowledge of the visual type (RGBA/ColorIndex) it is * appropriate to let the server calculate it. */ void APIENTRY glcltFeedbackBuffer( IN GLsizei size, IN GLenum type, OUT GLfloat buffer[] ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_FEEDBACKBUFFER *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* This is the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(GLMSG_FEEDBACKBUFFER)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(GLMSG_FEEDBACKBUFFER)); } /* This is where we will store our message */ pMsg = (GLMSG_FEEDBACKBUFFER *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvFeedbackBuffer); /* Assign the members in the message */ pMsg->size = size; pMsg->type = type; pMsg->bufferOff = (ULONG_PTR)buffer; pMsgBatchInfo->NextOffset = NextOffset; return; #else GLCLIENT_BEGIN_LARGE_SET( FeedbackBuffer, FEEDBACKBUFFER, buffer, size, bufferOff ) pMsg->size = size; pMsg->type = type; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltSelectBuffer( IN GLsizei size, OUT GLuint buffer[] ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_SELECTBUFFER *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* This is the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(GLMSG_SELECTBUFFER)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(GLMSG_SELECTBUFFER)); } /* This is where we will store our message */ pMsg = (GLMSG_SELECTBUFFER *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvSelectBuffer); /* Assign the members in the message */ pMsg->size = size; pMsg->bufferOff = (ULONG_PTR)buffer; pMsgBatchInfo->NextOffset = NextOffset; return; #else GLCLIENT_BEGIN_LARGE_SET( SelectBuffer, SELECTBUFFER, buffer, size, bufferOff ) pMsg->size = size; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } GLint APIENTRY glcltRenderMode( IN GLenum mode ) { GLCLIENT_BEGIN( RenderMode, RENDERMODE ) pMsg->mode = mode ; GLTEB_RETURNVALUE() = 0; // assume error glsbAttention(); return( (GLint)GLTEB_RETURNVALUE() ); GLCLIENT_END } const GLubyte * APIENTRY glcltGetString( IN GLenum name ) { switch (name) { case GL_VENDOR: return("Microsoft Corporation"); case GL_RENDERER: return("GDI Generic"); case GL_VERSION: // Version numbers // WinNT 3.5: 1.0 // WinNT 3.51: 1.01 // Win95 beta: 1.015 // Win95: 1.02 // WinNT 4.0: 1.1.0 return("1.1.0"); case GL_EXTENSIONS: #ifdef GL_WIN_swap_hint return "GL_WIN_swap_hint" #endif #ifdef GL_EXT_bgra " GL_EXT_bgra" #endif #ifdef GL_EXT_paletted_texture " GL_EXT_paletted_texture" #endif #ifdef GL_WIN_phong_shading " GL_WIN_phong_shading" #endif #ifdef GL_EXT_flat_paletted_lighting " GL_EXT_flat_paletted_lighting" #endif #ifdef GL_WIN_specular_fog " GL_WIN_specular_fog" #endif //GL_WIN_specular_fog #ifdef GL_WIN_multiple_textures " GL_WIN_multiple_textures" #endif ; } GLSETERROR(GL_INVALID_ENUM); return((const GLubyte *)0); } /*********** Evaluator functions ************************************/ // Look in eval.c /*********** Pixel Functions ****************************************/ void APIENTRY glcltReadPixels ( IN GLint x, IN GLint y, IN GLsizei width, IN GLsizei height, IN GLenum format, IN GLenum type, OUT GLvoid *pixels ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_READPIXELS *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_READPIXELS *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvReadPixels); /* Assign the members in the message as required */ pMsg->x = x ; pMsg->y = y ; pMsg->width = width ; pMsg->height = height ; pMsg->format = format ; pMsg->type = type ; pMsg->pixelsOff = (ULONG_PTR)pixels ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_GET( ReadPixels, READPIXELS, pixels, width*height, pixelsOff ) pMsg->x = x ; pMsg->y = y ; pMsg->width = width ; pMsg->height = height ; pMsg->format = format ; pMsg->type = type ; GLCLIENT_END_LARGE_GET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltGetTexImage ( IN GLenum target, IN GLint level, IN GLenum format, IN GLenum type, OUT GLvoid *pixels ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_GETTEXIMAGE *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_GETTEXIMAGE *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvGetTexImage); /* Assign the members in the message as required */ pMsg->target = target ; pMsg->level = level ; pMsg->format = format ; pMsg->type = type ; pMsg->pixelsOff = (ULONG_PTR)pixels ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_GET( GetTexImage, GETTEXIMAGE, pixels, -1, pixelsOff ) pMsg->target = target ; pMsg->level = level ; pMsg->format = format ; pMsg->type = type ; GLCLIENT_END_LARGE_GET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltDrawPixels ( IN GLsizei width, IN GLsizei height, IN GLenum format, IN GLenum type, IN const GLvoid *pixels ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_DRAWPIXELS *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_DRAWPIXELS *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvDrawPixels); /* Assign the members in the message as required */ pMsg->width = width ; pMsg->height = height ; pMsg->format = format ; pMsg->type = type ; pMsg->pixelsOff = (ULONG_PTR)pixels ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_SET( DrawPixels, DRAWPIXELS, pixels, width*height, pixelsOff ) pMsg->width = width ; pMsg->height = height ; pMsg->format = format ; pMsg->type = type ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltBitmap ( IN GLsizei width, IN GLsizei height, IN GLfloat xorig, IN GLfloat yorig, IN GLfloat xmove, IN GLfloat ymove, IN const GLubyte bitmap[] ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_BITMAP *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_BITMAP *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvBitmap); /* Assign the members in the message as required */ pMsg->width = width ; pMsg->height = height ; pMsg->xorig = xorig ; pMsg->yorig = yorig ; pMsg->xmove = xmove ; pMsg->ymove = ymove ; pMsg->bitmapOff = (ULONG)bitmap ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_SET( Bitmap, BITMAP, bitmap, width*height, bitmapOff ) pMsg->width = width ; pMsg->height = height ; pMsg->xorig = xorig ; pMsg->yorig = yorig ; pMsg->xmove = xmove ; pMsg->ymove = ymove ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltPolygonStipple ( const GLubyte *mask ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_POLYGONSTIPPLE *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_POLYGONSTIPPLE *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvPolygonStipple); /* Assign the members in the message as required */ pMsg->maskOff = (ULONG)mask; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_SET( PolygonStipple, POLYGONSTIPPLE, mask, -1, maskOff ) pMsg->_IsDlist = GL_FALSE; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltGetPolygonStipple ( GLubyte mask[] ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_GETPOLYGONSTIPPLE *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_GETPOLYGONSTIPPLE *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvGetPolygonStipple); /* Assign the members in the message as required */ pMsg->maskOff = (ULONG)mask; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_GET( GetPolygonStipple, GETPOLYGONSTIPPLE, mask, -1, maskOff ) GLCLIENT_END_LARGE_GET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltTexImage1D ( 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 ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_TEXIMAGE1D *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_TEXIMAGE1D *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvTexImage1D); /* Assign the members in the message as required */ pMsg->target = target ; pMsg->level = level ; pMsg->components = components ; pMsg->width = width ; pMsg->border = border ; pMsg->format = format ; pMsg->type = type ; pMsg->pixelsOff = (ULONG_PTR)pixels ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_SET( TexImage1D, TEXIMAGE1D, pixels, width, pixelsOff ) pMsg->target = target ; pMsg->level = level ; pMsg->components = components ; pMsg->width = width ; pMsg->border = border ; pMsg->format = format ; pMsg->type = type ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } void APIENTRY glcltTexImage2D ( 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 ) { #ifndef _CLIENTSIDE_ GLMSGBATCHINFO *pMsgBatchInfo; GLMSG_TEXIMAGE2D *pMsg; ULONG NextOffset; /* Set a pointer to the batch information structure */ pMsgBatchInfo = GLTEB_SHAREDMEMORYSECTION(); /* Tentative offset, where we may want to place our data */ /* This is also the first available byte after the message */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); if ( NextOffset > pMsgBatchInfo->MaximumOffset ) { /* No room for the message, flush the batch */ glsbAttention(); /* Reset NextOffset */ NextOffset = pMsgBatchInfo->NextOffset + GLMSG_ALIGN(sizeof(*pMsg)); } /* This is where we will store our message */ pMsg = (GLMSG_TEXIMAGE2D *)( ((BYTE *)pMsgBatchInfo) + pMsgBatchInfo->NextOffset); /* Set the ProcOffset for this function */ pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvTexImage2D); /* Assign the members in the message as required */ pMsg->target = target ; pMsg->level = level ; pMsg->components = components ; pMsg->width = width ; pMsg->height = height ; pMsg->border = border ; pMsg->format = format ; pMsg->type = type ; pMsg->pixelsOff = (ULONG_PTR)pixels ; /* Get the batch ready for the next message */ pMsgBatchInfo->NextOffset = NextOffset; glsbAttention(); return; #else GLCLIENT_BEGIN_LARGE_SET( TexImage2D, TEXIMAGE2D, pixels, width*height, pixelsOff ) pMsg->target = target ; pMsg->level = level ; pMsg->components = components ; pMsg->width = width ; pMsg->height = height ; pMsg->border = border ; pMsg->format = format ; pMsg->type = type ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; #endif // _CLIENTSIDE_ } GLboolean APIENTRY glcltAreTexturesResident(GLsizei n, const GLuint *textures, GLboolean *residences) { GLCLIENT_BEGIN(AreTexturesResident, ARETEXTURESRESIDENT) pMsg->n = n; pMsg->textures = textures; pMsg->residences = residences; GLTEB_RETURNVALUE() = 0; glsbAttention(); return (GLboolean)GLTEB_RETURNVALUE(); GLCLIENT_END } void APIENTRY glcltBindTexture(GLenum target, GLuint texture) { GLCLIENT_BEGIN(BindTexture, BINDTEXTURE) pMsg->target = target; pMsg->texture = texture; return; GLCLIENT_END } void APIENTRY glcltCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { GLCLIENT_BEGIN(CopyTexImage1D, COPYTEXIMAGE1D) pMsg->target = target; pMsg->level = level; pMsg->internalformat = internalformat; pMsg->x = x; pMsg->y = y; pMsg->width = width; pMsg->border = border; return; GLCLIENT_END } void APIENTRY glcltCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { GLCLIENT_BEGIN(CopyTexImage2D, COPYTEXIMAGE2D) pMsg->target = target; pMsg->level = level; pMsg->internalformat = internalformat; pMsg->x = x; pMsg->y = y; pMsg->width = width; pMsg->height = height; pMsg->border = border; return; GLCLIENT_END } void APIENTRY glcltCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { GLCLIENT_BEGIN(CopyTexSubImage1D, COPYTEXSUBIMAGE1D) pMsg->target = target; pMsg->level = level; pMsg->xoffset = xoffset; pMsg->x = x; pMsg->y = y; pMsg->width = width; return; GLCLIENT_END } void APIENTRY glcltCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { GLCLIENT_BEGIN(CopyTexSubImage2D, COPYTEXSUBIMAGE2D) pMsg->target = target; pMsg->level = level; pMsg->xoffset = xoffset; pMsg->yoffset = yoffset; pMsg->x = x; pMsg->y = y; pMsg->width = width; pMsg->height = height; return; GLCLIENT_END } void APIENTRY glcltDeleteTextures(GLsizei n, const GLuint *textures) { GLCLIENT_BEGIN(DeleteTextures, DELETETEXTURES) pMsg->n = n; pMsg->textures = textures; // Flush pointer glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltGenTextures(GLsizei n, GLuint *textures) { GLCLIENT_BEGIN(GenTextures, GENTEXTURES) pMsg->n = n; pMsg->textures = textures; glsbAttention(); return; GLCLIENT_END } GLboolean APIENTRY glcltIsTexture(GLuint texture) { GLCLIENT_BEGIN(IsTexture, ISTEXTURE) pMsg->texture = texture; GLTEB_RETURNVALUE() = 0; glsbAttention(); return (GLboolean)GLTEB_RETURNVALUE(); GLCLIENT_END } void APIENTRY glcltPrioritizeTextures(GLsizei n, const GLuint *textures, const GLclampf *priorities) { GLCLIENT_BEGIN(PrioritizeTextures, PRIORITIZETEXTURES) pMsg->n = n; pMsg->textures = textures; pMsg->priorities = priorities; // Flush pointer glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) { GLCLIENT_BEGIN_LARGE_SET(TexSubImage1D, TEXSUBIMAGE1D, pixels, width, pixelsOff ) pMsg->target = target ; pMsg->level = level ; pMsg->xoffset = xoffset ; pMsg->width = width ; pMsg->format = format ; pMsg->type = type ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; } void APIENTRY glcltTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) { GLCLIENT_BEGIN_LARGE_SET(TexSubImage2D, TEXSUBIMAGE2D, pixels, width*height, pixelsOff ) pMsg->target = target ; pMsg->level = level ; pMsg->xoffset = xoffset ; pMsg->yoffset = yoffset ; pMsg->width = width ; pMsg->height = height ; pMsg->format = format ; pMsg->type = type ; pMsg->_IsDlist = GL_FALSE ; GLCLIENT_END_LARGE_SET return; } void APIENTRY glcltColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data) { GLCLIENT_BEGIN(ColorTableEXT, COLORTABLEEXT) pMsg->target = target; pMsg->internalFormat = internalFormat; pMsg->width = width; pMsg->format = format; pMsg->type = type; pMsg->data = data; pMsg->_IsDlist = GL_FALSE; // Flush pointer glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data) { GLCLIENT_BEGIN(ColorSubTableEXT, COLORSUBTABLEEXT) pMsg->target = target; pMsg->start = start; pMsg->count = count; pMsg->format = format; pMsg->type = type; pMsg->data = data; pMsg->_IsDlist = GL_FALSE; // Flush pointer glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltGetColorTableEXT(GLenum target, GLenum format, GLenum type, GLvoid *data) { GLCLIENT_BEGIN(GetColorTableEXT, GETCOLORTABLEEXT) pMsg->target = target; pMsg->format = format; pMsg->type = type; pMsg->data = data; glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltGetColorTableParameterivEXT( GLenum target, GLenum pname, GLint *params) { GLCLIENT_BEGIN(GetColorTableParameterivEXT, GETCOLORTABLEPARAMETERIVEXT) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltGetColorTableParameterfvEXT( GLenum target, GLenum pname, GLfloat *params) { GLCLIENT_BEGIN(GetColorTableParameterfvEXT, GETCOLORTABLEPARAMETERFVEXT) pMsg->target = target; pMsg->pname = pname; pMsg->params = params; glsbAttention(); return; GLCLIENT_END } void APIENTRY glcltPolygonOffset(GLfloat factor, GLfloat units) { GLCLIENT_BEGIN(PolygonOffset, POLYGONOFFSET) pMsg->factor = factor; pMsg->units = units; return; GLCLIENT_END } void APIENTRY glcltPushClientAttrib (IN GLbitfield mask) { __GLclientAttribute **spp; __GLclientAttribute *sp; __GL_SETUP(); // Not allowed in begin/end. if (gc->paTeb->flags & POLYARRAY_IN_BEGIN) { GLSETERROR(GL_INVALID_OPERATION); return; } // The pixel store states are currently kept in the server, flush the // command buffer to keep client and server in ssync. if (mask & GL_CLIENT_PIXEL_STORE_BIT) glsbAttention(); spp = gc->clientAttributes.stackPointer; if (spp < &gc->clientAttributes.stack[gc->constants.maxClientAttribStackDepth]) { if (!(sp = *spp)) { sp = (__GLclientAttribute*) GCALLOCZ(gc, sizeof(__GLclientAttribute)); if (NULL == sp) return; *spp = sp; } sp->mask = mask; gc->clientAttributes.stackPointer = spp + 1; if (mask & GL_CLIENT_PIXEL_STORE_BIT) { sp->pixelPackModes = gc->state.pixel.packModes; sp->pixelUnpackModes = gc->state.pixel.unpackModes; } if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) { sp->vertexArray = gc->vertexArray; } } else { GLSETERROR(GL_STACK_OVERFLOW); } } GLuint FASTCALL __glInternalPopClientAttrib(__GLcontext *gc, GLboolean bSync, GLboolean destroy) { __GLclientAttribute **spp; __GLclientAttribute *sp; GLbitfield mask; GLuint dirtyMask = 0; spp = gc->clientAttributes.stackPointer; if (spp > &gc->clientAttributes.stack[0]) { --spp; sp = *spp; ASSERTOPENGL(sp != 0, "corrupted client stack"); mask = sp->mask; gc->clientAttributes.stackPointer = spp; // If this function is called by client side, flush the command buffer // to keep client and server pixel store states in ssync. // If it is called by the server side __glDestroyContext() function, // do not flush the command buffer! if ((mask & GL_CLIENT_PIXEL_STORE_BIT) && bSync) glsbAttention(); if (mask & GL_CLIENT_PIXEL_STORE_BIT) { gc->state.pixel.packModes = sp->pixelPackModes; gc->state.pixel.unpackModes = sp->pixelUnpackModes; dirtyMask |= __GL_DIRTY_PIXEL; } if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) { gc->vertexArray = sp->vertexArray; } /* ** Clear out mask so that any memory frees done above won't get ** re-done when the context is destroyed */ sp->mask = 0; } else { GLSETERROR(GL_STACK_UNDERFLOW); } return dirtyMask; } void APIENTRY glcltPopClientAttrib (void) { GLuint dirtyMask; __GL_SETUP(); // Not allowed in begin/end. if (gc->paTeb->flags & POLYARRAY_IN_BEGIN) { GLSETERROR(GL_INVALID_OPERATION); return; } dirtyMask = __glInternalPopClientAttrib(gc, GL_TRUE, GL_FALSE); if (dirtyMask) { // __GL_DELAY_VALIDATE_MASK(gc, dirtyMask); gc->beginMode = __GL_NEED_VALIDATE; gc->dirtyMask |= dirtyMask; } } #ifdef GL_EXT_flat_paletted_lighting void APIPRIVATE __glim_ColorTableParameterivEXT(GLenum target, GLenum pname, const GLint *params); void APIENTRY glColorTableParameterivEXT(GLenum target, GLenum pname, const GLint *params) { glsbAttention(); __glim_ColorTableParameterivEXT(target, pname, params); } void APIPRIVATE __glim_ColorTableParameterfvEXT(GLenum target, GLenum pname, const GLfloat *params); void APIENTRY glColorTableParameterfvEXT(GLenum target, GLenum pname, const GLfloat *params) { glsbAttention(); __glim_ColorTableParameterfvEXT(target, pname, params); } #endif // GL_EXT_flat_paletted_lighting #ifdef GL_WIN_multiple_textures void APIENTRY glcltCurrentTextureIndexWIN (GLuint index) { GLCLIENT_BEGIN(CurrentTextureIndexWIN, CURRENTTEXTUREINDEXWIN) pMsg->index = index; return; GLCLIENT_END } void APIENTRY glcltBindNthTextureWIN (GLuint index, GLenum target, GLuint texture) { GLCLIENT_BEGIN(BindNthTextureWIN, BINDNTHTEXTUREWIN) pMsg->index = index; pMsg->target = target; pMsg->texture = texture; return; GLCLIENT_END } void APIENTRY glcltNthTexCombineFuncWIN (GLuint index, GLenum leftColorFactor, GLenum colorOp, GLenum rightColorFactor, GLenum leftAlphaFactor, GLenum alphaOp, GLenum rightAlphaFactor) { GLCLIENT_BEGIN(NthTexCombineFuncWIN, NTHTEXCOMBINEFUNCWIN) pMsg->index = index; pMsg->leftColorFactor = leftColorFactor; pMsg->colorOp = colorOp; pMsg->rightColorFactor = rightColorFactor; pMsg->leftAlphaFactor = leftAlphaFactor; pMsg->alphaOp = alphaOp; pMsg->rightAlphaFactor = rightAlphaFactor; return; GLCLIENT_END } #endif // GL_WIN_multiple_textures