📄 arbprogparse.c
字号:
values[1] =
values[2] = values[3] = parse_float (inst, Program);
}
else {
values[0] =
values[1] =
values[2] = values[3] = parse_signed_float (inst, Program);
}
break;
case CONSTANT_VECTOR:
values[0] = values[1] = values[2] = 0;
values[3] = 1;
components = *(*inst)++;
for (i = 0; i < components; i++) {
values[i] = parse_signed_float (inst, Program);
}
break;
}
}
/**
* \param offset The offset from the address register that we should
* address
*
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_relative_offset (GLcontext *ctx, GLubyte **inst, struct arb_program *Program,
GLint *offset)
{
*offset = parse_integer(inst, Program);
return 0;
}
/**
* \param color 0 if color type is primary, 1 if color type is secondary
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_color_type (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program,
GLint * color)
{
(void) ctx; (void) Program;
*color = *(*inst)++ != COLOR_PRIMARY;
return 0;
}
/**
* Get an integer corresponding to a generic vertex attribute.
*
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_generic_attrib_num(GLcontext *ctx, GLubyte ** inst,
struct arb_program *Program, GLuint *attrib)
{
GLint i = parse_integer(inst, Program);
if ((i < 0) || (i > MAX_VERTEX_PROGRAM_ATTRIBS))
{
_mesa_set_program_error (ctx, Program->Position,
"Invalid generic vertex attribute index");
_mesa_error (ctx, GL_INVALID_OPERATION, "Invalid generic vertex attribute index");
return 1;
}
*attrib = (GLuint) i;
return 0;
}
/**
* \param color The index of the color buffer to write into
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_output_color_num (GLcontext * ctx, GLubyte ** inst,
struct arb_program *Program, GLuint * color)
{
GLint i = parse_integer (inst, Program);
if ((i < 0) || (i >= (int)ctx->Const.MaxDrawBuffers)) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid draw buffer index");
_mesa_error (ctx, GL_INVALID_OPERATION, "Invalid draw buffer index");
return 1;
}
*color = (GLuint) i;
return 0;
}
/**
* \param coord The texture unit index
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_texcoord_num (GLcontext * ctx, GLubyte ** inst,
struct arb_program *Program, GLuint * coord)
{
GLint i = parse_integer (inst, Program);
if ((i < 0) || (i >= (int)ctx->Const.MaxTextureUnits)) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid texture unit index");
_mesa_error (ctx, GL_INVALID_OPERATION, "Invalid texture unit index");
return 1;
}
*coord = (GLuint) i;
return 0;
}
/**
* \param coord The weight index
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_weight_num (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program,
GLint * coord)
{
*coord = parse_integer (inst, Program);
if ((*coord < 0) || (*coord >= 1)) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid weight index");
_mesa_error (ctx, GL_INVALID_OPERATION, "Invalid weight index");
return 1;
}
return 0;
}
/**
* \param coord The clip plane index
* \return 0 on sucess, 1 on error
*/
static GLuint
parse_clipplane_num (GLcontext * ctx, GLubyte ** inst,
struct arb_program *Program, GLint * coord)
{
*coord = parse_integer (inst, Program);
if ((*coord < 0) || (*coord >= (GLint) ctx->Const.MaxClipPlanes)) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid clip plane index");
_mesa_error (ctx, GL_INVALID_OPERATION, "Invalid clip plane index");
return 1;
}
return 0;
}
/**
* \return 0 on front face, 1 on back face
*/
static GLuint
parse_face_type (GLubyte ** inst)
{
switch (*(*inst)++) {
case FACE_FRONT:
return 0;
case FACE_BACK:
return 1;
}
return 0;
}
/**
* Given a matrix and a modifier token on the binary array, return tokens
* that _mesa_fetch_state() [program.c] can understand.
*
* \param matrix - the matrix we are talking about
* \param matrix_idx - the index of the matrix we have (for texture & program matricies)
* \param matrix_modifier - the matrix modifier (trans, inv, etc)
* \return 0 on sucess, 1 on failure
*/
static GLuint
parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program,
GLint * matrix, GLint * matrix_idx, GLint * matrix_modifier)
{
GLubyte mat = *(*inst)++;
*matrix_idx = 0;
switch (mat) {
case MATRIX_MODELVIEW:
*matrix = STATE_MODELVIEW;
*matrix_idx = parse_integer (inst, Program);
if (*matrix_idx > 0) {
_mesa_set_program_error (ctx, Program->Position,
"ARB_vertex_blend not supported\n");
_mesa_error (ctx, GL_INVALID_OPERATION,
"ARB_vertex_blend not supported\n");
return 1;
}
break;
case MATRIX_PROJECTION:
*matrix = STATE_PROJECTION;
break;
case MATRIX_MVP:
*matrix = STATE_MVP;
break;
case MATRIX_TEXTURE:
*matrix = STATE_TEXTURE;
*matrix_idx = parse_integer (inst, Program);
if (*matrix_idx >= (GLint) ctx->Const.MaxTextureUnits) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid Texture Unit");
_mesa_error (ctx, GL_INVALID_OPERATION,
"Invalid Texture Unit: %d", *matrix_idx);
return 1;
}
break;
/* This is not currently supported (ARB_matrix_palette) */
case MATRIX_PALETTE:
*matrix_idx = parse_integer (inst, Program);
_mesa_set_program_error (ctx, Program->Position,
"ARB_matrix_palette not supported\n");
_mesa_error (ctx, GL_INVALID_OPERATION,
"ARB_matrix_palette not supported\n");
return 1;
break;
case MATRIX_PROGRAM:
*matrix = STATE_PROGRAM;
*matrix_idx = parse_integer (inst, Program);
if (*matrix_idx >= (GLint) ctx->Const.MaxProgramMatrices) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid Program Matrix");
_mesa_error (ctx, GL_INVALID_OPERATION,
"Invalid Program Matrix: %d", *matrix_idx);
return 1;
}
break;
}
switch (*(*inst)++) {
case MATRIX_MODIFIER_IDENTITY:
*matrix_modifier = 0;
break;
case MATRIX_MODIFIER_INVERSE:
*matrix_modifier = STATE_MATRIX_INVERSE;
break;
case MATRIX_MODIFIER_TRANSPOSE:
*matrix_modifier = STATE_MATRIX_TRANSPOSE;
break;
case MATRIX_MODIFIER_INVTRANS:
*matrix_modifier = STATE_MATRIX_INVTRANS;
break;
}
return 0;
}
/**
* This parses a state string (rather, the binary version of it) into
* a 6-token sequence as described in _mesa_fetch_state() [program.c]
*
* \param inst - the start in the binary arry to start working from
* \param state_tokens - the storage for the 6-token state description
* \return - 0 on sucess, 1 on error
*/
static GLuint
parse_state_single_item (GLcontext * ctx, GLubyte ** inst,
struct arb_program *Program, GLint * state_tokens)
{
switch (*(*inst)++) {
case STATE_MATERIAL_PARSER:
state_tokens[0] = STATE_MATERIAL;
state_tokens[1] = parse_face_type (inst);
switch (*(*inst)++) {
case MATERIAL_AMBIENT:
state_tokens[2] = STATE_AMBIENT;
break;
case MATERIAL_DIFFUSE:
state_tokens[2] = STATE_DIFFUSE;
break;
case MATERIAL_SPECULAR:
state_tokens[2] = STATE_SPECULAR;
break;
case MATERIAL_EMISSION:
state_tokens[2] = STATE_EMISSION;
break;
case MATERIAL_SHININESS:
state_tokens[2] = STATE_SHININESS;
break;
}
break;
case STATE_LIGHT_PARSER:
state_tokens[0] = STATE_LIGHT;
state_tokens[1] = parse_integer (inst, Program);
/* Check the value of state_tokens[1] against the # of lights */
if (state_tokens[1] >= (GLint) ctx->Const.MaxLights) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid Light Number");
_mesa_error (ctx, GL_INVALID_OPERATION,
"Invalid Light Number: %d", state_tokens[1]);
return 1;
}
switch (*(*inst)++) {
case LIGHT_AMBIENT:
state_tokens[2] = STATE_AMBIENT;
break;
case LIGHT_DIFFUSE:
state_tokens[2] = STATE_DIFFUSE;
break;
case LIGHT_SPECULAR:
state_tokens[2] = STATE_SPECULAR;
break;
case LIGHT_POSITION:
state_tokens[2] = STATE_POSITION;
break;
case LIGHT_ATTENUATION:
state_tokens[2] = STATE_ATTENUATION;
break;
case LIGHT_HALF:
state_tokens[2] = STATE_HALF;
break;
case LIGHT_SPOT_DIRECTION:
state_tokens[2] = STATE_SPOT_DIRECTION;
break;
}
break;
case STATE_LIGHT_MODEL:
switch (*(*inst)++) {
case LIGHT_MODEL_AMBIENT:
state_tokens[0] = STATE_LIGHTMODEL_AMBIENT;
break;
case LIGHT_MODEL_SCENECOLOR:
state_tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;
state_tokens[1] = parse_face_type (inst);
break;
}
break;
case STATE_LIGHT_PROD:
state_tokens[0] = STATE_LIGHTPROD;
state_tokens[1] = parse_integer (inst, Program);
/* Check the value of state_tokens[1] against the # of lights */
if (state_tokens[1] >= (GLint) ctx->Const.MaxLights) {
_mesa_set_program_error (ctx, Program->Position,
"Invalid Light Number");
_mesa_error (ctx, GL_INVALID_OPERATION,
"Invalid Light Number: %d", state_tokens[1]);
return 1;
}
state_tokens[2] = parse_face_type (inst);
switch (*(*inst)++) {
case LIGHT_PROD_AMBIENT:
state_tokens[3] = STATE_AMBIENT;
break;
case LIGHT_PROD_DIFFUSE:
state_tokens[3] = STATE_DIFFUSE;
break;
case LIGHT_PROD_SPECULAR:
state_tokens[3] = STATE_SPECULAR;
break;
}
break;
case STATE_FOG:
switch (*(*inst)++) {
case FOG_COLOR:
state_tokens[0] = STATE_FOG_COLOR;
break;
case FOG_PARAMS:
state_tokens[0] = STATE_FOG_PARAMS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -