📄 t_save_api.c
字号:
}
static void GLAPIENTRY _save_Color4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
DISPATCH_ATTR4F( _TNL_ATTRIB_COLOR0, x, y, z, w );
}
static void GLAPIENTRY _save_Color4fv( const GLfloat *v )
{
DISPATCH_ATTR4FV( _TNL_ATTRIB_COLOR0, v );
}
static void GLAPIENTRY _save_SecondaryColor3fEXT( GLfloat x, GLfloat y, GLfloat z )
{
DISPATCH_ATTR3F( _TNL_ATTRIB_COLOR1, x, y, z );
}
static void GLAPIENTRY _save_SecondaryColor3fvEXT( const GLfloat *v )
{
DISPATCH_ATTR3FV( _TNL_ATTRIB_COLOR1, v );
}
static void GLAPIENTRY _save_MultiTexCoord1f( GLenum target, GLfloat x )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR1F( attr, x );
}
static void GLAPIENTRY _save_MultiTexCoord1fv( GLenum target, const GLfloat *v )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR1FV( attr, v );
}
static void GLAPIENTRY _save_MultiTexCoord2f( GLenum target, GLfloat x, GLfloat y )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR2F( attr, x, y );
}
static void GLAPIENTRY _save_MultiTexCoord2fv( GLenum target, const GLfloat *v )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR2FV( attr, v );
}
static void GLAPIENTRY _save_MultiTexCoord3f( GLenum target, GLfloat x, GLfloat y,
GLfloat z)
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR3F( attr, x, y, z );
}
static void GLAPIENTRY _save_MultiTexCoord3fv( GLenum target, const GLfloat *v )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR3FV( attr, v );
}
static void GLAPIENTRY _save_MultiTexCoord4f( GLenum target, GLfloat x, GLfloat y,
GLfloat z, GLfloat w )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR4F( attr, x, y, z, w );
}
static void GLAPIENTRY _save_MultiTexCoord4fv( GLenum target, const GLfloat *v )
{
GLuint attr = (target & 0x7) + _TNL_ATTRIB_TEX0;
DISPATCH_ATTR4FV( attr, v );
}
static void GLAPIENTRY _save_VertexAttrib1fNV( GLuint index, GLfloat x )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR1F( index, x );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib1fvNV( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR1FV( index, v );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib2fNV( GLuint index, GLfloat x, GLfloat y )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR2F( index, x, y );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib2fvNV( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR2FV( index, v );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib3fNV( GLuint index, GLfloat x, GLfloat y,
GLfloat z )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR3F( index, x, y, z );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib3fvNV( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR3FV( index, v );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib4fNV( GLuint index, GLfloat x, GLfloat y,
GLfloat z, GLfloat w )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR4F( index, x, y, z, w );
else
enum_error();
}
static void GLAPIENTRY _save_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR4FV( index, v );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib1fARB( GLuint index, GLfloat x )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR1F( index, x );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib1fvARB( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR1FV( index, v );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib2fARB( GLuint index, GLfloat x, GLfloat y )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR2F( index, x, y );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib2fvARB( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR2FV( index, v );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib3fARB( GLuint index, GLfloat x, GLfloat y, GLfloat z )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR3F( index, x, y, z );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib3fvARB( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR3FV( index, v );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib4fARB( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR4F( index, x, y, z, w );
else
enum_error();
}
static void GLAPIENTRY
_save_VertexAttrib4fvARB( GLuint index, const GLfloat *v )
{
if (index < VERT_ATTRIB_MAX)
DISPATCH_ATTR4FV( index, v );
else
enum_error();
}
/* Materials:
*
* These are treated as per-vertex attributes, at indices above where
* the NV_vertex_program leaves off. There are a lot of good things
* about treating materials this way.
*
* However: I don't want to double the number of generated functions
* just to cope with this, so I unroll the 'C' varients of CHOOSE and
* ATTRF into this function, and dispense with codegen and
* second-level dispatch.
*
* There is no aliasing of material attributes with other entrypoints.
*/
#define MAT_ATTR( A, N, params ) \
do { \
if (tnl->save.attrsz[A] < N) { \
_save_upgrade_vertex( ctx, A, N ); \
tnl->save.have_materials = GL_TRUE; \
} \
\
{ \
GLfloat *dest = tnl->save.attrptr[A]; \
if (N>0) dest[0] = params[0]; \
if (N>1) dest[1] = params[1]; \
if (N>2) dest[2] = params[2]; \
if (N>3) dest[3] = params[3]; \
} \
} while (0)
#define MAT( ATTR, N, face, params ) \
do { \
if (face != GL_BACK) \
MAT_ATTR( ATTR, N, params ); /* front */ \
if (face != GL_FRONT) \
MAT_ATTR( ATTR + 1, N, params ); /* back */ \
} while (0)
/* NOTE: Have to remove/deal-with colormaterial crossovers, probably
* later on - in the meantime just store everything.
*/
static void GLAPIENTRY _save_Materialfv( GLenum face, GLenum pname,
const GLfloat *params )
{
GET_CURRENT_CONTEXT( ctx );
TNLcontext *tnl = TNL_CONTEXT(ctx);
switch (pname) {
case GL_EMISSION:
MAT( _TNL_ATTRIB_MAT_FRONT_EMISSION, 4, face, params );
break;
case GL_AMBIENT:
MAT( _TNL_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params );
break;
case GL_DIFFUSE:
MAT( _TNL_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params );
break;
case GL_SPECULAR:
MAT( _TNL_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params );
break;
case GL_SHININESS:
MAT( _TNL_ATTRIB_MAT_FRONT_SHININESS, 1, face, params );
break;
case GL_COLOR_INDEXES:
MAT( _TNL_ATTRIB_MAT_FRONT_INDEXES, 3, face, params );
break;
case GL_AMBIENT_AND_DIFFUSE:
MAT( _TNL_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params );
MAT( _TNL_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params );
break;
default:
_mesa_compile_error( ctx, GL_INVALID_ENUM, "glMaterialfv" );
return;
}
}
#define IDX_ATTR( A, IDX ) \
do { \
GET_CURRENT_CONTEXT( ctx ); \
TNLcontext *tnl = TNL_CONTEXT(ctx); \
\
if (tnl->save.attrsz[A] < 1) { \
_save_upgrade_vertex( ctx, A, 1 ); \
} \
\
{ \
GLfloat *dest = tnl->save.attrptr[A]; \
dest[0] = IDX; \
} \
} while (0)
static void GLAPIENTRY _save_EdgeFlag( GLboolean b )
{
IDX_ATTR( _TNL_ATTRIB_EDGEFLAG, (GLfloat)b );
}
static void GLAPIENTRY _save_EdgeFlagv( const GLboolean *v )
{
IDX_ATTR( _TNL_ATTRIB_EDGEFLAG, (GLfloat)(v[0]) );
}
static void GLAPIENTRY _save_Indexf( GLfloat f )
{
IDX_ATTR( _TNL_ATTRIB_INDEX, f );
}
static void GLAPIENTRY _save_Indexfv( const GLfloat *f )
{
IDX_ATTR( _TNL_ATTRIB_INDEX, f[0] );
}
/* Cope with EvalCoord/CallList called within a begin/end object:
* -- Flush current buffer
* -- Fallback to opcodes for the rest of the begin/end object.
*/
#define FALLBACK(ctx) \
do { \
TNLcontext *tnl = TNL_CONTEXT(ctx); \
\
if (tnl->save.initial_counter != tnl->save.counter || \
tnl->save.prim_count) \
_save_compile_vertex_list( ctx ); \
\
_save_copy_to_current( ctx ); \
_save_reset_vertex( ctx ); \
_mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt ); \
ctx->Driver.SaveNeedFlush = 0; \
} while (0)
static void GLAPIENTRY _save_EvalCoord1f( GLfloat u )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalCoord1f(ctx->Save, ( u ));
}
static void GLAPIENTRY _save_EvalCoord1fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalCoord1fv(ctx->Save, ( v ));
}
static void GLAPIENTRY _save_EvalCoord2f( GLfloat u, GLfloat v )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalCoord2f(ctx->Save, ( u, v ));
}
static void GLAPIENTRY _save_EvalCoord2fv( const GLfloat *v )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalCoord2fv(ctx->Save, ( v ));
}
static void GLAPIENTRY _save_EvalPoint1( GLint i )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalPoint1(ctx->Save, ( i ));
}
static void GLAPIENTRY _save_EvalPoint2( GLint i, GLint j )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_EvalPoint2(ctx->Save, ( i, j ));
}
static void GLAPIENTRY _save_CallList( GLuint l )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_CallList(ctx->Save, ( l ));
}
static void GLAPIENTRY _save_CallLists( GLsizei n, GLenum type, const GLvoid *v )
{
GET_CURRENT_CONTEXT(ctx);
FALLBACK(ctx);
CALL_CallLists(ctx->Save, ( n, type, v ));
}
/* This begin is hooked into ... Updating of
* ctx->Driver.CurrentSavePrimitive is already taken care of.
*/
static GLboolean _save_NotifyBegin( GLcontext *ctx, GLenum mode )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
if (1) {
GLuint i = tnl->save.prim_count++;
assert(i < tnl->save.prim_max);
tnl->save.prim[i].mode = mode | PRIM_BEGIN;
tnl->save.prim[i].start = tnl->save.initial_counter - tnl->save.counter;
tnl->save.prim[i].count = 0;
_mesa_install_save_vtxfmt( ctx, &tnl->save_vtxfmt );
ctx->Driver.SaveNeedFlush = 1;
return GL_TRUE;
}
else
return GL_FALSE;
}
static void GLAPIENTRY _save_End( void )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -