diff options
Diffstat (limited to 'src/mesa/shader/arbprogparse.c')
-rw-r--r-- | src/mesa/shader/arbprogparse.c | 420 |
1 files changed, 172 insertions, 248 deletions
diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index 6d5567ec85..a080e7d724 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -583,7 +583,7 @@ var_cache_append (struct var_cache **va, struct var_cache *nv) } static struct var_cache * -var_cache_find (struct var_cache *va, GLubyte * name) +var_cache_find (struct var_cache *va, const GLubyte * name) { /*struct var_cache *first = va;*/ @@ -600,11 +600,39 @@ var_cache_find (struct var_cache *va, GLubyte * name) return NULL; } + + +/** + * Called when an error is detected while parsing/compiling a program. + * Sets the ctx->Program.ErrorString field to descript and records a + * GL_INVALID_OPERATION error. + * \param position position of error in program string + * \param descrip verbose error description + */ +static void +program_error(GLcontext *ctx, GLint position, const char *descrip) +{ + if (descrip) { + const char *prefix = "glProgramString(", *suffix = ")"; + char *str = (char *) _mesa_malloc(_mesa_strlen(descrip) + + _mesa_strlen(prefix) + + _mesa_strlen(suffix) + 1); + if (str) { + _mesa_sprintf(str, "%s%s%s", prefix, descrip, suffix); + _mesa_error(ctx, GL_INVALID_OPERATION, str); + _mesa_free(str); + } + } + _mesa_set_program_error(ctx, position, descrip); +} + + + /** * constructs an integer from 4 GLubytes in LE format */ static GLuint -parse_position (GLubyte ** inst) +parse_position (const GLubyte ** inst) { GLuint value; @@ -626,10 +654,10 @@ parse_position (GLubyte ** inst) * \return The location on the var_cache corresponding the the string starting at I */ static struct var_cache * -parse_string (GLubyte ** inst, struct var_cache **vc_head, +parse_string (const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, GLuint * found) { - GLubyte *i = *inst; + const GLubyte *i = *inst; struct var_cache *va = NULL; (void) Program; @@ -652,9 +680,9 @@ parse_string (GLubyte ** inst, struct var_cache **vc_head, } static char * -parse_string_without_adding (GLubyte ** inst, struct arb_program *Program) +parse_string_without_adding (const GLubyte ** inst, struct arb_program *Program) { - GLubyte *i = *inst; + const GLubyte *i = *inst; (void) Program; *inst += _mesa_strlen ((char *) i) + 1; @@ -666,7 +694,7 @@ parse_string_without_adding (GLubyte ** inst, struct arb_program *Program) * \return -1 if we parse '-', return 1 otherwise */ static GLint -parse_sign (GLubyte ** inst) +parse_sign (const GLubyte ** inst) { /*return *(*inst)++ != '+'; */ @@ -686,7 +714,7 @@ parse_sign (GLubyte ** inst) * parses and returns signed integer */ static GLint -parse_integer (GLubyte ** inst, struct arb_program *Program) +parse_integer (const GLubyte ** inst, struct arb_program *Program) { GLint sign; GLint value; @@ -723,7 +751,7 @@ parse_integer (GLubyte ** inst, struct arb_program *Program) in the string. */ static GLdouble -parse_float_string(GLubyte ** inst, struct arb_program *Program, GLdouble *scale) +parse_float_string(const GLubyte ** inst, struct arb_program *Program, GLdouble *scale) { GLdouble value = 0.0; GLdouble oscale = 1.0; @@ -756,7 +784,7 @@ parse_float_string(GLubyte ** inst, struct arb_program *Program, GLdouble *scale 12.34e-4 */ static GLfloat -parse_float (GLubyte ** inst, struct arb_program *Program) +parse_float (const GLubyte ** inst, struct arb_program *Program) { GLint exponent; GLdouble whole, fraction, fracScale = 1.0; @@ -776,7 +804,7 @@ parse_float (GLubyte ** inst, struct arb_program *Program) /** */ static GLfloat -parse_signed_float (GLubyte ** inst, struct arb_program *Program) +parse_signed_float (const GLubyte ** inst, struct arb_program *Program) { GLint sign = parse_sign (inst); GLfloat value = parse_float (inst, Program); @@ -790,7 +818,7 @@ parse_signed_float (GLubyte ** inst, struct arb_program *Program) * \param values - The 4 component vector with the constant value in it */ static GLvoid -parse_constant (GLubyte ** inst, GLfloat *values, struct arb_program *Program, +parse_constant (const GLubyte ** inst, GLfloat *values, struct arb_program *Program, GLboolean use) { GLuint components, i; @@ -828,8 +856,8 @@ parse_constant (GLubyte ** inst, GLfloat *values, struct arb_program *Program, * \return 0 on sucess, 1 on error */ static GLuint -parse_relative_offset (GLcontext *ctx, GLubyte **inst, struct arb_program *Program, - GLint *offset) +parse_relative_offset(GLcontext *ctx, const GLubyte **inst, + struct arb_program *Program, GLint *offset) { (void) ctx; *offset = parse_integer(inst, Program); @@ -841,7 +869,7 @@ parse_relative_offset (GLcontext *ctx, GLubyte **inst, struct arb_program *Progr * \return 0 on sucess, 1 on error */ static GLuint -parse_color_type (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, +parse_color_type (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * color) { (void) ctx; (void) Program; @@ -855,17 +883,15 @@ parse_color_type (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, * \return 0 on sucess, 1 on error */ static GLuint -parse_generic_attrib_num(GLcontext *ctx, GLubyte ** inst, +parse_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)) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid generic vertex attribute index"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid generic vertex attribute index"); - + program_error(ctx, Program->Position, + "Invalid generic vertex attribute index"); return 1; } @@ -880,15 +906,13 @@ parse_generic_attrib_num(GLcontext *ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_output_color_num (GLcontext * ctx, GLubyte ** inst, +parse_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)) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid draw buffer index"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid draw buffer index"); + program_error(ctx, Program->Position, "Invalid draw buffer index"); return 1; } @@ -902,15 +926,13 @@ parse_output_color_num (GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_texcoord_num (GLcontext * ctx, GLubyte ** inst, +parse_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)) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid texture unit index"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid texture unit index"); + program_error(ctx, Program->Position, "Invalid texture unit index"); return 1; } @@ -923,15 +945,13 @@ parse_texcoord_num (GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_weight_num (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, +parse_weight_num (GLcontext * ctx, const 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"); + program_error(ctx, Program->Position, "Invalid weight index"); return 1; } @@ -943,15 +963,13 @@ parse_weight_num (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, * \return 0 on sucess, 1 on error */ static GLuint -parse_clipplane_num (GLcontext * ctx, GLubyte ** inst, +parse_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)) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid clip plane index"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Invalid clip plane index"); + program_error(ctx, Program->Position, "Invalid clip plane index"); return 1; } @@ -963,7 +981,7 @@ parse_clipplane_num (GLcontext * ctx, GLubyte ** inst, * \return 0 on front face, 1 on back face */ static GLuint -parse_face_type (GLubyte ** inst) +parse_face_type (const GLubyte ** inst) { switch (*(*inst)++) { case FACE_FRONT: @@ -986,7 +1004,7 @@ parse_face_type (GLubyte ** inst) * \return 0 on sucess, 1 on failure */ static GLuint -parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, +parse_matrix (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * matrix, GLint * matrix_idx, GLint * matrix_modifier) { GLubyte mat = *(*inst)++; @@ -998,10 +1016,8 @@ parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, *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"); + program_error(ctx, Program->Position, + "ARB_vertex_blend not supported"); return 1; } break; @@ -1018,10 +1034,8 @@ parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, *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); + program_error(ctx, Program->Position, "Invalid Texture Unit"); + /* bad *matrix_id */ return 1; } break; @@ -1029,10 +1043,8 @@ parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, /* 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"); + program_error(ctx, Program->Position, + "ARB_matrix_palette not supported"); return 1; break; @@ -1040,10 +1052,8 @@ parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *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); + program_error(ctx, Program->Position, "Invalid Program Matrix"); + /* bad *matrix_idx */ return 1; } break; @@ -1077,7 +1087,7 @@ parse_matrix (GLcontext * ctx, GLubyte ** inst, struct arb_program *Program, * \return - 0 on sucess, 1 on error */ static GLuint -parse_state_single_item (GLcontext * ctx, GLubyte ** inst, +parse_state_single_item (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * state_tokens) { switch (*(*inst)++) { @@ -1109,10 +1119,8 @@ parse_state_single_item (GLcontext * ctx, GLubyte ** inst, /* 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]); + program_error(ctx, Program->Position, "Invalid Light Number"); + /* bad state_tokens[1] */ return 1; } @@ -1159,10 +1167,8 @@ parse_state_single_item (GLcontext * ctx, GLubyte ** inst, /* 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]); + program_error(ctx, Program->Position, "Invalid Light Number"); + /* bad state_tokens[1] */ return 1; } @@ -1293,11 +1299,9 @@ parse_state_single_item (GLcontext * ctx, GLubyte ** inst, if ((**inst) != 0) { /* Either the last row, 0 */ state_tokens[4] = parse_integer (inst, Program); if (state_tokens[4] < state_tokens[3]) { - _mesa_set_program_error (ctx, Program->Position, - "Second matrix index less than the first"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Second matrix index (%d) less than the first (%d)", - state_tokens[4], state_tokens[3]); + program_error(ctx, Program->Position, + "Second matrix index less than the first"); + /* state_tokens[4] vs. state_tokens[3] */ return 1; } } @@ -1342,7 +1346,7 @@ parse_state_single_item (GLcontext * ctx, GLubyte ** inst, * \return - 0 on sucess, 1 on failure */ static GLuint -parse_program_single_item (GLcontext * ctx, GLubyte ** inst, +parse_program_single_item (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLint * state_tokens) { if (Program->Base.Target == GL_FRAGMENT_PROGRAM_ARB) @@ -1362,11 +1366,9 @@ parse_program_single_item (GLcontext * ctx, GLubyte ** inst, || ((Program->Base.Target == GL_VERTEX_PROGRAM_ARB) && (state_tokens[2] >= (GLint) ctx->Const.VertexProgram.MaxEnvParams))) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid Program Env Parameter"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Invalid Program Env Parameter: %d", - state_tokens[2]); + program_error(ctx, Program->Position, + "Invalid Program Env Parameter"); + /* bad state_tokens[2] */ return 1; } @@ -1382,11 +1384,9 @@ parse_program_single_item (GLcontext * ctx, GLubyte ** inst, || ((Program->Base.Target == GL_VERTEX_PROGRAM_ARB) && (state_tokens[2] >= (GLint) ctx->Const.VertexProgram.MaxLocalParams))) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid Program Local Parameter"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Invalid Program Local Parameter: %d", - state_tokens[2]); + program_error(ctx, Program->Position, + "Invalid Program Local Parameter"); + /* bad state_tokens[2] */ return 1; } break; @@ -1442,10 +1442,10 @@ generic_attrib_check(struct var_cache *vc_head) * * \param inputReg returns the input register index, one of the * VERT_ATTRIB_* or FRAG_ATTRIB_* values. - * \return returns 0 on sucess, 1 on error + * \return returns 0 on success, 1 on error */ static GLuint -parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, +parse_attrib_binding(GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program, GLuint *inputReg, GLuint *is_generic) { @@ -1488,12 +1488,11 @@ parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, case VERTEX_ATTRIB_WEIGHT: { - const char *msg = "ARB_vertex_blend not supported"; GLint weight; err = parse_weight_num (ctx, inst, Program, &weight); *inputReg = VERT_ATTRIB_WEIGHT; - _mesa_set_program_error(ctx, Program->Position, msg); - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, + "ARB_vertex_blend not supported"); } return 1; @@ -1531,18 +1530,15 @@ parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, { const char *msg = "ARB_palette_matrix not supported"; parse_integer (inst, Program); - _mesa_set_program_error (ctx, Program->Position, msg); - _mesa_error (ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, msg); } return 1; case VERTEX_ATTRIB_GENERIC: { GLuint attrib; - err = parse_generic_attrib_num(ctx, inst, Program, &attrib); - - if (!err) { + if (!err) { *is_generic = 1; /* Add VERT_ATTRIB_GENERIC0 here because ARB_vertex_program's * attributes do not alias the conventional vertex @@ -1563,9 +1559,7 @@ parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, } if (err) { - const char *msg = "Bad attribute binding"; - _mesa_set_program_error(ctx, Program->Position, msg); - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, "Bad attribute binding"); } Program->Base.InputsRead |= (1 << *inputReg); @@ -1583,7 +1577,7 @@ parse_attrib_binding(GLcontext * ctx, GLubyte ** inst, * one of the VERT_RESULT_* or FRAG_RESULT_* values. */ static GLuint -parse_result_binding(GLcontext *ctx, GLubyte **inst, +parse_result_binding(GLcontext *ctx, const GLubyte **inst, GLuint *outputReg, struct arb_program *Program) { const GLubyte token = *(*inst)++; @@ -1674,7 +1668,7 @@ parse_result_binding(GLcontext *ctx, GLubyte **inst, * \return 0 on sucess, 1 on error */ static GLint -parse_attrib (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_attrib (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found; @@ -1688,10 +1682,7 @@ parse_attrib (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) attrib_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", attrib_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error(ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -1703,12 +1694,9 @@ parse_attrib (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, return 1; if (generic_attrib_check(*vc_head)) { - _mesa_set_program_error(ctx, Program->Position, - "Cannot use both a generic vertex attribute " - "and a specific attribute of the same type"); - _mesa_error(ctx, GL_INVALID_OPERATION, - "Cannot use both a generic vertex attribute and a specific " - "attribute of the same type"); + program_error(ctx, Program->Position, + "Cannot use both a generic vertex attribute " + "and a specific attribute of the same type"); return 1; } @@ -1722,7 +1710,7 @@ parse_attrib (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * if we get a signed or unsigned float for scalar constants */ static GLuint -parse_param_elements (GLcontext * ctx, GLubyte ** inst, +parse_param_elements (GLcontext * ctx, const GLubyte ** inst, struct var_cache *param_var, struct arb_program *Program, GLboolean use) { @@ -1799,10 +1787,8 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, out_of_range = 1; } if (out_of_range) { - _mesa_set_program_error (ctx, Program->Position, - "Invalid Program Parameter"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Invalid Program Parameter: %d", end_idx); + program_error(ctx, Program->Position, + "Invalid Program Parameter"); /*end_idx*/ return 1; } @@ -1831,10 +1817,8 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, break; default: - _mesa_set_program_error(ctx, Program->Position, - "Unexpected token in parse_param_elements()"); - _mesa_error(ctx, GL_INVALID_OPERATION, - "Unexpected token in parse_param_elements()"); + program_error(ctx, Program->Position, + "Unexpected token (in parse_param_elements())"); return 1; } @@ -1845,9 +1829,7 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, || ((Program->Base.Target == GL_FRAGMENT_PROGRAM_ARB) && (Program->Base.NumParameters >= ctx->Const.FragmentProgram.MaxLocalParams))) { - _mesa_set_program_error (ctx, Program->Position, - "Too many parameter variables"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Too many parameter variables"); + program_error(ctx, Program->Position, "Too many parameter variables"); return 1; } @@ -1863,7 +1845,7 @@ parse_param_elements (GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_param (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_param (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found, err; @@ -1879,10 +1861,7 @@ parse_param (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) param_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", param_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error (ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -1890,10 +1869,7 @@ parse_param (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, specified_length = parse_integer (inst, Program); if (specified_length < 0) { - _mesa_set_program_error (ctx, Program->Position, - "Negative parameter array length"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Negative parameter array length: %d", specified_length); + program_error(ctx, Program->Position, "Negative parameter array length"); return 1; } @@ -1921,10 +1897,8 @@ parse_param (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, /* Test array length here! */ if (specified_length) { if (specified_length != (int)param_var->param_binding_length) { - const char *msg - = "Declared parameter array length does not match parameter list"; - _mesa_set_program_error(ctx, Program->Position, msg); - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, + "Declared parameter array length does not match parameter list"); } } @@ -1937,7 +1911,7 @@ parse_param (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * */ static GLuint -parse_param_use (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_param_use (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct var_cache **new_var) { struct var_cache *param_var; @@ -1973,7 +1947,7 @@ parse_param_use (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLuint -parse_temp (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_temp (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found; @@ -1987,10 +1961,7 @@ parse_temp (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", temp_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error(ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -2003,10 +1974,8 @@ parse_temp (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, || ((Program->Base.Target == GL_VERTEX_PROGRAM_ARB) && (Program->Base.NumTemporaries >= ctx->Const.VertexProgram.MaxTemps))) { - _mesa_set_program_error (ctx, Program->Position, - "Too many TEMP variables declared"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Too many TEMP variables declared"); + program_error(ctx, Program->Position, + "Too many TEMP variables declared"); return 1; } @@ -2024,7 +1993,7 @@ parse_temp (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLuint -parse_output (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_output (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found; @@ -2038,10 +2007,7 @@ parse_output (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) output_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", output_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error (ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -2058,7 +2024,7 @@ parse_output (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLuint -parse_alias (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_alias (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found; @@ -2072,10 +2038,7 @@ parse_alias (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", temp_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error(ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -2090,10 +2053,7 @@ parse_alias (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); _mesa_sprintf (error_msg, "Alias value %s is not defined", temp_var->alias_binding->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error (ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -2107,7 +2067,7 @@ parse_alias (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLuint -parse_address (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_address (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLuint found; @@ -2121,10 +2081,7 @@ parse_address (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, _mesa_malloc (_mesa_strlen ((char *) temp_var->name) + 40); _mesa_sprintf (error_msg, "Duplicate Varible Declaration: %s", temp_var->name); - - _mesa_set_program_error (ctx, Program->Position, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, error_msg); - + program_error (ctx, Program->Position, error_msg); _mesa_free (error_msg); return 1; } @@ -2134,9 +2091,7 @@ parse_address (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, if (Program->Base.NumAddressRegs >= ctx->Const.VertexProgram.MaxAddressRegs) { const char *msg = "Too many ADDRESS variables declared"; - _mesa_set_program_error(ctx, Program->Position, msg); - - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, msg); return 1; } @@ -2154,7 +2109,7 @@ parse_address (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLint -parse_declaration (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_declaration (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program) { GLint err = 0; @@ -2203,7 +2158,7 @@ parse_declaration (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * \return 0 on sucess, 1 on error */ static GLuint -parse_masked_dst_reg (GLcontext * ctx, GLubyte ** inst, +parse_masked_dst_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, enum register_file *File, GLuint *Index, GLint *WriteMask) { @@ -2226,10 +2181,7 @@ parse_masked_dst_reg (GLcontext * ctx, GLubyte ** inst, /* If the name has never been added to our symbol table, we're hosed */ if (!result) { - _mesa_set_program_error (ctx, Program->Position, - "0: Undefined variable"); - _mesa_error (ctx, GL_INVALID_OPERATION, "0: Undefined variable: %s", - dst->name); + program_error(ctx, Program->Position, "0: Undefined variable"); return 1; } @@ -2246,20 +2198,15 @@ parse_masked_dst_reg (GLcontext * ctx, GLubyte ** inst, /* If the var type is not vt_output or vt_temp, no go */ default: - _mesa_set_program_error (ctx, Program->Position, - "Destination register is read only"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Destination register is read only: %s", - dst->name); + program_error(ctx, Program->Position, + "Destination register is read only"); return 1; } break; default: - _mesa_set_program_error (ctx, Program->Position, - "Unexpected opcode in parse_masked_dst_reg()"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Unexpected opcode in parse_masked_dst_reg()"); + program_error(ctx, Program->Position, + "Unexpected opcode in parse_masked_dst_reg()"); return 1; } @@ -2271,9 +2218,7 @@ parse_masked_dst_reg (GLcontext * ctx, GLubyte ** inst, */ /*if ((Program->HintPositionInvariant) && (*File == PROGRAM_OUTPUT) && (*Index == 0)) { - _mesa_set_program_error (ctx, Program->Position, - "Vertex program specified position invariance and wrote vertex position"); - _mesa_error (ctx, GL_INVALID_OPERATION, + program_error(ctx, Program->Position, "Vertex program specified position invariance and wrote vertex position"); }*/ @@ -2303,7 +2248,7 @@ parse_masked_dst_reg (GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_address_reg (GLcontext * ctx, GLubyte ** inst, +parse_address_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, GLint * Index) { @@ -2317,17 +2262,12 @@ parse_address_reg (GLcontext * ctx, GLubyte ** inst, /* If the name has never been added to our symbol table, we're hosed */ if (!result) { - _mesa_set_program_error (ctx, Program->Position, "Undefined variable"); - _mesa_error (ctx, GL_INVALID_OPERATION, "Undefined variable: %s", - dst->name); + program_error(ctx, Program->Position, "Undefined variable"); return 1; } if (dst->type != vt_address) { - _mesa_set_program_error (ctx, Program->Position, - "Variable is not of type ADDRESS"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Variable: %s is not of type ADDRESS", dst->name); + program_error(ctx, Program->Position, "Variable is not of type ADDRESS"); return 1; } @@ -2344,7 +2284,7 @@ parse_address_reg (GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_masked_address_reg (GLcontext * ctx, GLubyte ** inst, +parse_masked_address_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, GLint * Index, GLboolean * WriteMask) @@ -2372,7 +2312,7 @@ parse_masked_address_reg (GLcontext * ctx, GLubyte ** inst, * swizzle, or just 1 component for a scalar src register selection */ static void -parse_swizzle_mask(GLubyte ** inst, GLubyte *swizzle, GLint len) +parse_swizzle_mask(const GLubyte ** inst, GLubyte *swizzle, GLint len) { GLint i; @@ -2408,7 +2348,7 @@ parse_swizzle_mask(GLubyte ** inst, GLubyte *swizzle, GLint len) * \return negateMask four element bitfield */ static void -parse_extended_swizzle_mask(GLubyte **inst, GLubyte swizzle[4], +parse_extended_swizzle_mask(const GLubyte **inst, GLubyte swizzle[4], GLubyte *negateMask) { GLint i; @@ -2449,7 +2389,8 @@ parse_extended_swizzle_mask(GLubyte **inst, GLubyte swizzle[4], static GLuint -parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, +parse_src_reg (GLcontext * ctx, const GLubyte ** inst, + struct var_cache **vc_head, struct arb_program *Program, enum register_file * File, GLint * Index, GLboolean *IsRelOffset ) @@ -2479,10 +2420,9 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, src->attrib_is_generic = is_generic; var_cache_append(vc_head, src); if (generic_attrib_check(*vc_head)) { - const char *msg = "Cannot use both a generic vertex attribute " - "and a specific attribute of the same type"; - _mesa_set_program_error (ctx, Program->Position, msg); - _mesa_error (ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, + "Cannot use both a generic vertex attribute " + "and a specific attribute of the same type"); return 1; } break; @@ -2495,10 +2435,8 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, Program->Position = parse_position (inst); if (!found) { - _mesa_set_program_error (ctx, Program->Position, - "2: Undefined variable"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "2: Undefined variable: %s", src->name); + program_error(ctx, Program->Position, + "2: Undefined variable"); /* src->name */ return 1; } @@ -2510,11 +2448,9 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, if ((offset < 0) || (offset >= (int)src->param_binding_length)) { - _mesa_set_program_error (ctx, Program->Position, - "Index out of range"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Index %d out of range for %s", offset, - src->name); + program_error(ctx, Program->Position, + "Index out of range"); + /* offset, src->name */ return 1; } @@ -2562,10 +2498,8 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, /* If the name has never been added to our symbol table, we're hosed */ if (!found) { - _mesa_set_program_error (ctx, Program->Position, - "3: Undefined variable"); - _mesa_error (ctx, GL_INVALID_OPERATION, "3: Undefined variable: %s", - src->name); + program_error(ctx, Program->Position, + "3: Undefined variable"); /* src->name */ return 1; } @@ -2588,20 +2522,16 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, /* If the var type is vt_output no go */ default: - _mesa_set_program_error (ctx, Program->Position, - "destination register is read only"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "destination register is read only: %s", - src->name); + program_error(ctx, Program->Position, + "destination register is read only"); + /* bad src->name */ return 1; } break; default: - _mesa_set_program_error (ctx, Program->Position, - "Unknown token in parse_src_reg"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "Unknown token in parse_src_reg"); + program_error(ctx, Program->Position, + "Unknown token in parse_src_reg"); return 1; } @@ -2612,7 +2542,7 @@ parse_src_reg (GLcontext * ctx, GLubyte ** inst, struct var_cache **vc_head, * Parse fragment program vector source register. */ static GLuint -parse_fp_vector_src_reg(GLcontext * ctx, GLubyte ** inst, +parse_fp_vector_src_reg(GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *program, struct prog_src_register *reg) @@ -2648,7 +2578,7 @@ parse_fp_vector_src_reg(GLcontext * ctx, GLubyte ** inst, * \return 1 if error, 0 if no error. */ static GLuint -parse_fp_dst_reg(GLcontext * ctx, GLubyte ** inst, +parse_fp_dst_reg(GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_dst_register *reg ) { @@ -2673,7 +2603,7 @@ parse_fp_dst_reg(GLcontext * ctx, GLubyte ** inst, * \return 1 if error, 0 if no error. */ static GLuint -parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst, +parse_fp_scalar_src_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_src_register *reg ) @@ -2711,7 +2641,7 @@ parse_fp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst, * \return 1 if error, 0 if no error */ static GLuint -parse_fp_instruction (GLcontext * ctx, GLubyte ** inst, +parse_fp_instruction (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_instruction *fp) { @@ -3060,9 +2990,8 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst, Program->TexturesUsed[texcoord] |= (1 << fp->TexSrcTarget); /* Check that both "2D" and "CUBE" (for example) aren't both used */ if (_mesa_bitcount(Program->TexturesUsed[texcoord]) > 1) { - char *msg = "multiple targets used on one texture image unit"; - _mesa_set_program_error(ctx, Program->Position, msg); - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, + "multiple targets used on one texture image unit"); return 1; } break; @@ -3082,7 +3011,7 @@ parse_fp_instruction (GLcontext * ctx, GLubyte ** inst, } static GLuint -parse_vp_dst_reg(GLcontext * ctx, GLubyte ** inst, +parse_vp_dst_reg(GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_dst_register *reg ) { @@ -3108,7 +3037,7 @@ parse_vp_dst_reg(GLcontext * ctx, GLubyte ** inst, * \return 0 on sucess, 1 on error */ static GLuint -parse_vp_address_reg (GLcontext * ctx, GLubyte ** inst, +parse_vp_address_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_dst_register *reg) @@ -3133,7 +3062,7 @@ parse_vp_address_reg (GLcontext * ctx, GLubyte ** inst, * Parse vertex program vector source register. */ static GLuint -parse_vp_vector_src_reg(GLcontext * ctx, GLubyte ** inst, +parse_vp_vector_src_reg(GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *program, struct prog_src_register *reg ) @@ -3165,7 +3094,7 @@ parse_vp_vector_src_reg(GLcontext * ctx, GLubyte ** inst, static GLuint -parse_vp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst, +parse_vp_scalar_src_reg (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_src_register *reg ) @@ -3200,7 +3129,7 @@ parse_vp_scalar_src_reg (GLcontext * ctx, GLubyte ** inst, * and handling the src & dst registers for vertex program instructions */ static GLuint -parse_vp_instruction (GLcontext * ctx, GLubyte ** inst, +parse_vp_instruction (GLcontext * ctx, const GLubyte ** inst, struct var_cache **vc_head, struct arb_program *Program, struct prog_instruction *vp) { @@ -3661,8 +3590,8 @@ debug_variables (GLcontext * ctx, struct var_cache *vc_head, * \return 1 on error, 0 on success */ static GLint -parse_instructions(GLcontext * ctx, GLubyte * inst, struct var_cache **vc_head, - struct arb_program *Program) +parse_instructions(GLcontext * ctx, const GLubyte * inst, + struct var_cache **vc_head, struct arb_program *Program) { const GLuint maxInst = (Program->Base.Target == GL_FRAGMENT_PROGRAM_ARB) ? ctx->Const.FragmentProgram.MaxInstructions @@ -3721,9 +3650,8 @@ parse_instructions(GLcontext * ctx, GLubyte * inst, struct var_cache **vc_head, case INSTRUCTION: /* check length */ if (Program->Base.NumInstructions + 1 >= maxInst) { - const char *msg = "Max instruction count exceeded"; - _mesa_set_program_error(ctx, Program->Position, msg); - _mesa_error(ctx, GL_INVALID_OPERATION, msg); + program_error(ctx, Program->Position, + "Max instruction count exceeded"); return 1; } Program->Position = parse_position (&inst); @@ -3958,9 +3886,7 @@ _mesa_parse_arb_program(GLcontext *ctx, GLenum target, GLint i; for (i = 0; i < len; i++) { if (str[i] == '\0') { - _mesa_set_program_error (ctx, i, "invalid character"); - _mesa_error (ctx, GL_INVALID_OPERATION, - "glProgramStringARB(illegal character)"); + program_error(ctx, i, "illegal character"); grammar_destroy (arbprogram_syn_id); return GL_FALSE; } @@ -3983,25 +3909,25 @@ _mesa_parse_arb_program(GLcontext *ctx, GLenum target, /* Syntax parse error */ if (err) { - _mesa_free(strz); - _mesa_free(parsed); - grammar_get_last_error ((GLubyte *) error_msg, 300, &error_pos); - _mesa_set_program_error (ctx, error_pos, error_msg); - _mesa_error (ctx, GL_INVALID_OPERATION, - "glProgramStringARB(syntax error)"); + grammar_get_last_error((GLubyte *) error_msg, 300, &error_pos); + program_error(ctx, error_pos, error_msg); - /* useful for debugging */ #if DEBUG_PARSING + /* useful for debugging */ do { int line, col; char *s; fprintf(stderr, "program: %s\n", (char *) strz); fprintf(stderr, "Error Pos: %d\n", ctx->program.ErrorPos); - s = (char *) _mesa_find_line_column(strz, strz+ctx->program.ErrorPos, &line, &col); + s = (char *) _mesa_find_line_column(strz, strz+ctx->program.ErrorPos, + &line, &col); fprintf(stderr, "line %d col %d: %s\n", line, col, s); } while (0) #endif + _mesa_free(strz); + _mesa_free(parsed); + grammar_destroy (arbprogram_syn_id); return GL_FALSE; } @@ -4044,9 +3970,7 @@ _mesa_parse_arb_program(GLcontext *ctx, GLenum target, /* Check the grammer rev */ if (*inst++ != REVISION) { - _mesa_set_program_error (ctx, 0, "Grammar version mismatch"); - _mesa_error(ctx, GL_INVALID_OPERATION, - "glProgramStringARB(Grammar version mismatch)"); + program_error (ctx, 0, "Grammar version mismatch"); err = GL_TRUE; } else { |