3001 lines
76 KiB
C
3001 lines
76 KiB
C
/******************************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)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)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 NT_DEADCODE_VERTEXARRAY
|
|
" GL_EXT_vertex_array"
|
|
#endif
|
|
#ifdef GL_EXT_bgra
|
|
" GL_EXT_bgra"
|
|
#endif
|
|
#ifdef GL_EXT_paletted_texture
|
|
" GL_EXT_paletted_texture"
|
|
#endif
|
|
;
|
|
}
|
|
GLSETERROR(GL_INVALID_ENUM);
|
|
return((const GLubyte *)0);
|
|
}
|
|
|
|
/*********** Evaluator functions ************************************/
|
|
|
|
void APIENTRY
|
|
glcltMap1d ( IN GLenum target, IN GLdouble u1, IN GLdouble u2, IN GLint stride, IN GLint order, IN const GLdouble points[] )
|
|
{
|
|
#ifndef _CLIENTSIDE_
|
|
// VARIABLE_IN
|
|
// CAN_BATCH
|
|
|
|
GLMSGBATCHINFO *pMsgBatchInfo;
|
|
GLMSG_MAP1D *pMsg;
|
|
ULONG LargeOffset, DataOffset, AlignedSize;
|
|
|
|
GLint ItemSize; /* Size of element in floats or doubles */
|
|
GLint ItemSizeByte; /* Size of element in bytes */
|
|
GLint ByteStride; /* Stride in BYTES */
|
|
|
|
/* 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 */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP1D));
|
|
|
|
if ( DataOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/* No room for the message, flush the batch */
|
|
|
|
glsbAttention();
|
|
|
|
/* Reset DataOffset */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP1D));
|
|
}
|
|
|
|
/* This is where we will store our message */
|
|
|
|
pMsg = (GLMSG_MAP1D *)( ((BYTE *)pMsgBatchInfo) +
|
|
pMsgBatchInfo->NextOffset);
|
|
|
|
/* Set the ProcOffset for this function */
|
|
|
|
pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvMap1d);
|
|
|
|
/* Calculate the size of an item */
|
|
|
|
ItemSize = __glCltMap1_size(target);
|
|
|
|
/*
|
|
* Assign the members in the message as required
|
|
* Don't assign the stride since it maybe changed by
|
|
* the packaging code.
|
|
*/
|
|
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->order = order ;
|
|
|
|
/*
|
|
* If points is NULL of the the stride is less than k,
|
|
* set the size to zero. This will prevent data from
|
|
* getting copied.
|
|
*/
|
|
|
|
if ( ( NULL == points ) ||
|
|
( !ItemSize ) ||
|
|
( 0 >= stride ) ||
|
|
( stride < ItemSize )
|
|
)
|
|
{
|
|
/* XXXX Can this cause problems? */
|
|
pMsg->DataSize = 0;
|
|
}
|
|
else
|
|
{
|
|
/* Get the size of the data */
|
|
|
|
ItemSizeByte = ItemSize * sizeof(points[0]);
|
|
ByteStride = stride * sizeof(points[0]);
|
|
pMsg->DataSize = ItemSizeByte * order;
|
|
}
|
|
|
|
AlignedSize = GLMSG_ALIGN(pMsg->DataSize);
|
|
LargeOffset = DataOffset + AlignedSize;
|
|
|
|
if ( LargeOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/*
|
|
* No room for the data, Let the server read it
|
|
* The server has to know the size of the data
|
|
* including padding since it has to read the
|
|
* whole thing.
|
|
*/
|
|
|
|
/* Fix the size again */
|
|
|
|
pMsg->DataSize = ItemSizeByte * ByteStride;
|
|
|
|
pMsg->stride = stride;
|
|
pMsg->pointsOff = (ULONG)points;
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP1D));
|
|
pMsgBatchInfo->NextOffset = DataOffset;
|
|
glsbAttention();
|
|
}
|
|
else
|
|
{
|
|
BYTE *Dest;
|
|
BYTE *Src;
|
|
|
|
/* Let the server know that the data is at the end of the message */
|
|
|
|
pMsg->pointsOff = (ULONG)0;
|
|
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP1D))
|
|
+ AlignedSize;
|
|
pMsgBatchInfo->NextOffset = LargeOffset;
|
|
|
|
pMsg->stride = ItemSize;
|
|
|
|
Dest = (BYTE *)((ULONG)(pMsgBatchInfo) + DataOffset);
|
|
|
|
if ( pMsg->DataSize )
|
|
{
|
|
/* See if the data is contiguous */
|
|
|
|
if ( ItemSizeByte == ByteStride )
|
|
{
|
|
GLMSG_MEMCPY( Dest, points, pMsg->DataSize );
|
|
}
|
|
else
|
|
{
|
|
GLint i;
|
|
|
|
/* Otherwise do a fancier memcpy */
|
|
|
|
Src = (BYTE *)(&points[0]);
|
|
|
|
for( i = order ; i ; i-- )
|
|
{
|
|
GLMSG_MEMCPY( Dest, Src, ItemSizeByte );
|
|
|
|
Dest += ItemSizeByte;
|
|
Src += ByteStride;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
#else
|
|
GLCLIENT_BEGIN_LARGE_SET( Map1d, MAP1D, points, order, pointsOff )
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->stride = stride ;
|
|
pMsg->order = order ;
|
|
GLCLIENT_END_LARGE_SET
|
|
return;
|
|
#endif // _CLIENTSIDE_
|
|
}
|
|
|
|
void APIENTRY
|
|
glcltMap1f ( IN GLenum target, IN GLfloat u1, IN GLfloat u2, IN GLint stride, IN GLint order, IN const GLfloat points[] )
|
|
{
|
|
#ifndef _CLIENTSIDE_
|
|
GLMSGBATCHINFO *pMsgBatchInfo;
|
|
GLMSG_MAP1F *pMsg;
|
|
ULONG LargeOffset, DataOffset, AlignedSize;
|
|
|
|
GLint ItemSize; /* Size of element in floats or doubles */
|
|
GLint ItemSizeByte; /* Size of element in bytes */
|
|
GLint ByteStride; /* Stride in BYTES */
|
|
|
|
/* 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 */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP1F));
|
|
|
|
if ( DataOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/* No room for the message, flush the batch */
|
|
|
|
glsbAttention();
|
|
|
|
/* Reset DataOffset */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP1F));
|
|
}
|
|
|
|
/* This is where we will store our message */
|
|
|
|
pMsg = (GLMSG_MAP1F *)( ((BYTE *)pMsgBatchInfo) +
|
|
pMsgBatchInfo->NextOffset);
|
|
|
|
/* Set the ProcOffset for this function */
|
|
|
|
pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvMap1f);
|
|
|
|
/* Calculate the size of an item */
|
|
|
|
ItemSize = __glCltMap1_size(target);
|
|
|
|
/*
|
|
* Assign the members in the message as required
|
|
* Don't assign the stride since it maybe changed by
|
|
* the packaging code.
|
|
*/
|
|
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->order = order ;
|
|
|
|
/*
|
|
* If points is NULL of the the stride is less than k,
|
|
* set the size to zero. This will prevent data from
|
|
* getting copied.
|
|
*/
|
|
|
|
if ( ( NULL == points ) ||
|
|
( !ItemSize ) ||
|
|
( 0 >= stride ) ||
|
|
( stride < ItemSize )
|
|
)
|
|
{
|
|
/* XXXX Can this cause problems? */
|
|
pMsg->DataSize = 0;
|
|
}
|
|
else
|
|
{
|
|
/* Get the size of the data */
|
|
|
|
ItemSizeByte = ItemSize * sizeof(points[0]);
|
|
ByteStride = stride * sizeof(points[0]);
|
|
pMsg->DataSize = ItemSizeByte * order;
|
|
}
|
|
|
|
AlignedSize = GLMSG_ALIGN(pMsg->DataSize);
|
|
LargeOffset = DataOffset + AlignedSize;
|
|
|
|
if ( LargeOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/*
|
|
* No room for the data, Let the server read it
|
|
* The server has to know the size of the data
|
|
* including padding since it has to read the
|
|
* whole thing.
|
|
*/
|
|
|
|
/* Fix the size again */
|
|
|
|
pMsg->DataSize = ItemSizeByte * ByteStride;
|
|
|
|
pMsg->stride = stride;
|
|
pMsg->pointsOff = (ULONG)points;
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP1F));
|
|
pMsgBatchInfo->NextOffset = DataOffset;
|
|
glsbAttention();
|
|
}
|
|
else
|
|
{
|
|
BYTE *Dest;
|
|
BYTE *Src;
|
|
|
|
/* Let the server know that the data is at the end of the message */
|
|
|
|
pMsg->pointsOff = (ULONG)0;
|
|
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP1F))
|
|
+ AlignedSize;
|
|
pMsgBatchInfo->NextOffset = LargeOffset;
|
|
|
|
pMsg->stride = ItemSize;
|
|
|
|
Dest = (BYTE *)((ULONG)(pMsgBatchInfo) + DataOffset);
|
|
|
|
if ( pMsg->DataSize )
|
|
{
|
|
/* See if the data is contiguous */
|
|
|
|
if ( ItemSizeByte == ByteStride )
|
|
{
|
|
GLMSG_MEMCPY( Dest, points, pMsg->DataSize );
|
|
}
|
|
else
|
|
{
|
|
GLint i;
|
|
|
|
/* Otherwise do a fancier memcpy */
|
|
|
|
Src = (BYTE *)(&points[0]);
|
|
|
|
for( i = order ; i ; i-- )
|
|
{
|
|
GLMSG_MEMCPY( Dest, Src, ItemSizeByte );
|
|
|
|
Dest += ItemSizeByte;
|
|
Src += ByteStride;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
#else
|
|
GLCLIENT_BEGIN_LARGE_SET( Map1f, MAP1F, points, order, pointsOff )
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->stride = stride ;
|
|
pMsg->order = order ;
|
|
GLCLIENT_END_LARGE_SET
|
|
return;
|
|
#endif // _CLIENTSIDE_
|
|
}
|
|
|
|
|
|
void APIENTRY
|
|
glcltMap2d ( 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[] )
|
|
{
|
|
#ifndef _CLIENTSIDE_
|
|
GLMSGBATCHINFO *pMsgBatchInfo;
|
|
GLMSG_MAP2D *pMsg;
|
|
ULONG LargeOffset, DataOffset, AlignedSize, DataSize;
|
|
|
|
GLint ItemSize; /* Size of element in floats or doubles */
|
|
GLint ItemSizeByte; /* Size of element in bytes */
|
|
GLint ByteStrideU; /* Stride in BYTES */
|
|
GLint ByteStrideV; /* Stride in BYTES */
|
|
|
|
/* 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 */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP2D));
|
|
|
|
if ( DataOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/* No room for the message, flush the batch */
|
|
|
|
glsbAttention();
|
|
|
|
/* Reset DataOffset */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP2D));
|
|
}
|
|
|
|
/* This is where we will store our message */
|
|
|
|
pMsg = (GLMSG_MAP2D *)( ((BYTE *)pMsgBatchInfo) +
|
|
pMsgBatchInfo->NextOffset);
|
|
|
|
/* Set the ProcOffset for this function */
|
|
|
|
pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvMap2d);
|
|
|
|
/*
|
|
* Assign the members in the message as required
|
|
* Don't assign the stride since it maybe negative and
|
|
* will be made positive if the data is copied at the end
|
|
* of the message
|
|
*/
|
|
|
|
/* Assign the members in the message as required */
|
|
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->uorder = uorder ;
|
|
pMsg->v1 = v1 ;
|
|
pMsg->v2 = v2 ;
|
|
pMsg->vorder = vorder ;
|
|
|
|
/* get the size of an item (number of floats or doubles) */
|
|
|
|
ItemSize = __glCltMap2_size(target);
|
|
|
|
/* If points is NULL set the Size to zero */
|
|
|
|
/*
|
|
* Do some more error checking:
|
|
*
|
|
* ustride < k ; error
|
|
* vstride < k ; error
|
|
*/
|
|
|
|
if ( ( NULL == points ) ||
|
|
( !ItemSize ) ||
|
|
( 0 >= ustride ) ||
|
|
( 0 >= vstride ) ||
|
|
( ustride < ItemSize ) ||
|
|
( vstride < ItemSize )
|
|
)
|
|
{
|
|
/* XXXX Can this cause problems? */
|
|
pMsg->DataSize = 0;
|
|
DataSize = 0;
|
|
|
|
/* Save the stride */
|
|
|
|
pMsg->ustride = ustride;
|
|
pMsg->vstride = vstride;
|
|
}
|
|
else
|
|
{
|
|
/* Get the size of the data */
|
|
|
|
ItemSizeByte = ItemSize * sizeof(points[0]);
|
|
DataSize = uorder * vorder * ItemSizeByte;
|
|
ByteStrideU = ustride * sizeof(points[0]);
|
|
ByteStrideV = vstride * sizeof(points[0]);
|
|
}
|
|
|
|
AlignedSize = GLMSG_ALIGN(DataSize);
|
|
LargeOffset = DataOffset + AlignedSize;
|
|
|
|
if ( LargeOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/*
|
|
* No room for the data, Let the server read it
|
|
*/
|
|
|
|
/*
|
|
* figure out the size of the data including padding
|
|
*/
|
|
|
|
if ( ByteStrideU < ByteStrideV )
|
|
{
|
|
pMsg->DataSize = ByteStrideV * vorder;
|
|
}
|
|
else
|
|
{
|
|
pMsg->DataSize = ByteStrideU * uorder;
|
|
}
|
|
|
|
pMsg->ustride = ustride;
|
|
pMsg->vstride = vstride;
|
|
pMsg->pointsOff = (ULONG)points;
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP2D));
|
|
pMsgBatchInfo->NextOffset = DataOffset;
|
|
glsbAttention();
|
|
}
|
|
else
|
|
{
|
|
BYTE *Dest;
|
|
BYTE *Src;
|
|
BYTE *Save;
|
|
|
|
/* Size of the data */
|
|
|
|
pMsg->DataSize = DataSize;
|
|
|
|
/* Let the server know that the data is at the end of the message */
|
|
|
|
pMsg->pointsOff = (ULONG)0;
|
|
|
|
/* Set the size of the message */
|
|
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP2D)) + AlignedSize;
|
|
|
|
pMsgBatchInfo->NextOffset = LargeOffset;
|
|
|
|
Dest = (BYTE *)((ULONG)(pMsgBatchInfo) + DataOffset);
|
|
|
|
if ( DataSize )
|
|
{
|
|
GLint u, v;
|
|
|
|
/* Change the stride */
|
|
|
|
pMsg->ustride = ItemSize;
|
|
pMsg->vstride = ItemSize * uorder;
|
|
|
|
Save = (BYTE *)(&points[0]);
|
|
|
|
for( v = vorder ; v ; v--, Dest )
|
|
{
|
|
Src = Save;
|
|
|
|
for ( u = uorder ; u ; u--, Src += ByteStrideU )
|
|
{
|
|
GLMSG_MEMCPY( Dest, Src, ItemSizeByte );
|
|
|
|
Dest += ItemSizeByte;
|
|
}
|
|
|
|
Save += ByteStrideV;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
#else
|
|
GLCLIENT_BEGIN_LARGE_SET( Map2d, MAP2D, points, uorder*vorder, pointsOff )
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->ustride = ustride ;
|
|
pMsg->uorder = uorder ;
|
|
pMsg->v1 = v1 ;
|
|
pMsg->v2 = v2 ;
|
|
pMsg->vstride = vstride ;
|
|
pMsg->vorder = vorder ;
|
|
GLCLIENT_END_LARGE_SET
|
|
return;
|
|
#endif // _CLIENTSIDE_
|
|
}
|
|
|
|
void APIENTRY
|
|
glcltMap2f ( 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[] )
|
|
{
|
|
#ifndef _CLIENTSIDE_
|
|
GLMSGBATCHINFO *pMsgBatchInfo;
|
|
GLMSG_MAP2F *pMsg;
|
|
ULONG LargeOffset, DataOffset, AlignedSize, DataSize;
|
|
|
|
GLint ItemSize; /* Size of element in floats or doubles */
|
|
GLint ItemSizeByte; /* Size of element in bytes */
|
|
GLint ByteStrideU; /* Stride in BYTES */
|
|
GLint ByteStrideV; /* Stride in BYTES */
|
|
|
|
/* 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 */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP2F));
|
|
|
|
if ( DataOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/* No room for the message, flush the batch */
|
|
|
|
glsbAttention();
|
|
|
|
/* Reset DataOffset */
|
|
|
|
DataOffset = pMsgBatchInfo->NextOffset +
|
|
GLMSG_ALIGN(sizeof(GLMSG_MAP2F));
|
|
}
|
|
|
|
/* This is where we will store our message */
|
|
|
|
pMsg = (GLMSG_MAP2F *)( ((BYTE *)pMsgBatchInfo) +
|
|
pMsgBatchInfo->NextOffset);
|
|
|
|
/* Set the ProcOffset for this function */
|
|
|
|
pMsg->ProcOffset = offsetof(GLSRVSBPROCTABLE, glsrvMap2f);
|
|
|
|
/*
|
|
* Assign the members in the message as required
|
|
* Don't assign the stride since it maybe negative and
|
|
* will be made positive if the data is copied at the end
|
|
* of the message
|
|
*/
|
|
|
|
/* Assign the members in the message as required */
|
|
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->uorder = uorder ;
|
|
pMsg->v1 = v1 ;
|
|
pMsg->v2 = v2 ;
|
|
pMsg->vorder = vorder ;
|
|
|
|
/* get the size of an item (number of floats or doubles) */
|
|
|
|
ItemSize = __glCltMap2_size(target);
|
|
|
|
/* If points is NULL set the Size to zero */
|
|
|
|
/*
|
|
* Do some more error checking:
|
|
*
|
|
* ustride < k ; error
|
|
* vstride < k ; error
|
|
*/
|
|
|
|
if ( ( NULL == points ) ||
|
|
( !ItemSize ) ||
|
|
( 0 >= ustride ) ||
|
|
( 0 >= vstride ) ||
|
|
( ustride < ItemSize ) ||
|
|
( vstride < ItemSize )
|
|
)
|
|
{
|
|
/* XXXX Can this cause problems? */
|
|
pMsg->DataSize = 0;
|
|
DataSize = 0;
|
|
|
|
/* Save the stride */
|
|
|
|
pMsg->ustride = ustride;
|
|
pMsg->vstride = vstride;
|
|
}
|
|
else
|
|
{
|
|
/* Get the size of the data */
|
|
|
|
ItemSizeByte = ItemSize * sizeof(points[0]);
|
|
DataSize = uorder * vorder * ItemSizeByte;
|
|
ByteStrideU = ustride * sizeof(points[0]);
|
|
ByteStrideV = vstride * sizeof(points[0]);
|
|
}
|
|
|
|
AlignedSize = GLMSG_ALIGN(DataSize);
|
|
LargeOffset = DataOffset + AlignedSize;
|
|
|
|
if ( LargeOffset > pMsgBatchInfo->MaximumOffset )
|
|
{
|
|
/*
|
|
* No room for the data, Let the server read it
|
|
*/
|
|
|
|
/*
|
|
* figure out the size of the data including padding
|
|
*/
|
|
|
|
if ( ByteStrideU < ByteStrideV )
|
|
{
|
|
pMsg->DataSize = ByteStrideV * vorder;
|
|
}
|
|
else
|
|
{
|
|
pMsg->DataSize = ByteStrideU * uorder;
|
|
}
|
|
|
|
pMsg->ustride = ustride;
|
|
pMsg->vstride = vstride;
|
|
pMsg->pointsOff = (ULONG)points;
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP2F));
|
|
pMsgBatchInfo->NextOffset = DataOffset;
|
|
glsbAttention();
|
|
}
|
|
else
|
|
{
|
|
BYTE *Dest;
|
|
BYTE *Src;
|
|
BYTE *Save;
|
|
|
|
/* Size of the data */
|
|
|
|
pMsg->DataSize = DataSize;
|
|
|
|
/* Let the server know that the data is at the end of the message */
|
|
|
|
pMsg->pointsOff = (ULONG)0;
|
|
|
|
/* Set the size of the message */
|
|
|
|
pMsg->MsgSize = GLMSG_ALIGN(sizeof(GLMSG_MAP2F)) + AlignedSize;
|
|
|
|
pMsgBatchInfo->NextOffset = LargeOffset;
|
|
|
|
Dest = (BYTE *)((ULONG)(pMsgBatchInfo) + DataOffset);
|
|
|
|
if ( DataSize )
|
|
{
|
|
GLint u, v;
|
|
|
|
/* Change the stride */
|
|
|
|
pMsg->ustride = ItemSize;
|
|
pMsg->vstride = ItemSize * uorder;
|
|
|
|
Save = (BYTE *)(&points[0]);
|
|
|
|
for( v = vorder ; v ; v--, Dest )
|
|
{
|
|
Src = Save;
|
|
|
|
for ( u = uorder ; u ; u--, Src += ByteStrideU )
|
|
{
|
|
GLMSG_MEMCPY( Dest, Src, ItemSizeByte );
|
|
|
|
Dest += ItemSizeByte;
|
|
}
|
|
|
|
Save += ByteStrideV;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
#else
|
|
GLCLIENT_BEGIN_LARGE_SET( Map2f, MAP2F, points, uorder*vorder, pointsOff )
|
|
pMsg->target = target ;
|
|
pMsg->u1 = u1 ;
|
|
pMsg->u2 = u2 ;
|
|
pMsg->ustride = ustride ;
|
|
pMsg->uorder = uorder ;
|
|
pMsg->v1 = v1 ;
|
|
pMsg->v2 = v2 ;
|
|
pMsg->vstride = vstride ;
|
|
pMsg->vorder = vorder ;
|
|
GLCLIENT_END_LARGE_SET
|
|
return;
|
|
#endif // _CLIENTSIDE_
|
|
}
|
|
|
|
/*********** 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)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)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)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)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)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*)
|
|
(*gc->imports.calloc)(gc, 1, 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)
|
|
{
|
|
__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);
|
|
if (dirtyMask)
|
|
{
|
|
// __GL_DELAY_VALIDATE_MASK(gc, dirtyMask);
|
|
gc->beginMode = __GL_NEED_VALIDATE;
|
|
gc->dirtyMask |= dirtyMask;
|
|
}
|
|
}
|