📄 arbprogparse.c
字号:
assert(**inst == 0); /* integer string should end with 0 */ (*inst)++; /* skip over terminating 0 */ Program->Position = parse_position(inst); /* skip position (from integer) */ } if (scale) *scale = oscale; return value;}/** Parse an unsigned floating-point number from this stream of tokenized characters. Example floating-point formats supported: 12.34 12 0.34 .34 12.34e-4 */static GLfloatparse_float (const GLubyte ** inst, struct arb_program *Program){ GLint exponent; GLdouble whole, fraction, fracScale = 1.0; whole = parse_float_string(inst, Program, 0); fraction = parse_float_string(inst, Program, &fracScale); /* Parse signed exponent */ exponent = parse_integer(inst, Program); /* This is the exponent */ /* Assemble parts of floating-point number: */ return (GLfloat) ((whole + fraction / fracScale) * _mesa_pow(10.0, (GLfloat) exponent));}/** */static GLfloatparse_signed_float (const GLubyte ** inst, struct arb_program *Program){ GLint sign = parse_sign (inst); GLfloat value = parse_float (inst, Program); return value * sign;}/** * This picks out a constant value from the parsed array. The constant vector is r * returned in the *values array, which should be of length 4. * * \param values - The 4 component vector with the constant value in it */static GLvoidparse_constant (const GLubyte ** inst, GLfloat *values, struct arb_program *Program, GLboolean use){ GLuint components, i; switch (*(*inst)++) { case CONSTANT_SCALAR: if (use == GL_TRUE) { values[0] = 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 GLuintparse_relative_offset(GLcontext *ctx, const GLubyte **inst, struct arb_program *Program, GLint *offset){ (void) ctx; *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 GLuintparse_color_type (GLcontext * ctx, const 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 GLuintparse_generic_attrib_num(GLcontext *ctx, const GLubyte ** inst, struct arb_program *Program, GLuint *attrib){ GLint i = parse_integer(inst, Program); if ((i < 0) || (i >= MAX_VERTEX_PROGRAM_ATTRIBS)) { program_error(ctx, Program->Position, "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 GLuintparse_output_color_num (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLuint * color){ GLint i = parse_integer (inst, Program); if ((i < 0) || (i >= (int)ctx->Const.MaxDrawBuffers)) { program_error(ctx, Program->Position, "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 GLuintparse_texcoord_num (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLuint * coord){ GLint i = parse_integer (inst, Program); if ((i < 0) || (i >= (int)ctx->Const.MaxTextureUnits)) { program_error(ctx, Program->Position, "Invalid texture unit index"); return 1; } *coord = (GLuint) i; return 0;}/** * \param coord The weight index * \return 0 on sucess, 1 on error */static GLuintparse_weight_num (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * coord){ *coord = parse_integer (inst, Program); if ((*coord < 0) || (*coord >= 1)) { program_error(ctx, Program->Position, "Invalid weight index"); return 1; } return 0;}/** * \param coord The clip plane index * \return 0 on sucess, 1 on error */static GLuintparse_clipplane_num (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * coord){ *coord = parse_integer (inst, Program); if ((*coord < 0) || (*coord >= (GLint) ctx->Const.MaxClipPlanes)) { program_error(ctx, Program->Position, "Invalid clip plane index"); return 1; } return 0;}/** * \return 0 on front face, 1 on back face */static GLuintparse_face_type (const 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 GLuintparse_matrix (GLcontext * ctx, const 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; *matrix_idx = parse_integer (inst, Program); if (*matrix_idx > 0) { program_error(ctx, Program->Position, "ARB_vertex_blend not supported"); return 1; } break; case MATRIX_PROJECTION: *matrix = STATE_PROJECTION_MATRIX; break; case MATRIX_MVP: *matrix = STATE_MVP_MATRIX; break; case MATRIX_TEXTURE: *matrix = STATE_TEXTURE_MATRIX; *matrix_idx = parse_integer (inst, Program); if (*matrix_idx >= (GLint) ctx->Const.MaxTextureUnits) { program_error(ctx, Program->Position, "Invalid Texture Unit"); /* bad *matrix_id */ return 1; } break; /* This is not currently supported (ARB_matrix_palette) */ case MATRIX_PALETTE: *matrix_idx = parse_integer (inst, Program); program_error(ctx, Program->Position, "ARB_matrix_palette not supported"); return 1; break; case MATRIX_PROGRAM: *matrix = STATE_PROGRAM_MATRIX; *matrix_idx = parse_integer (inst, Program); if (*matrix_idx >= (GLint) ctx->Const.MaxProgramMatrices) { program_error(ctx, Program->Position, "Invalid Program Matrix"); /* bad *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 GLuintparse_state_single_item (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, gl_state_index state_tokens[STATE_LENGTH]){ GLubyte token = *(*inst)++; switch (token) { 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) { program_error(ctx, Program->Position, "Invalid Light Number"); /* bad 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_VECTOR; 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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -