diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c index 712eccebc3e..40b1c10a49f 100644 --- a/src/mesa/program/prog_parameter.c +++ b/src/mesa/program/prog_parameter.c @@ -326,6 +326,8 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList, if (state) { for (unsigned i = 0; i < STATE_LENGTH; i++) paramList->Parameters[oldNum].StateIndexes[i] = state[i]; + } else { + paramList->Parameters[oldNum].StateIndexes[0] = STATE_NOT_STATE_VAR; } if (type == PROGRAM_UNIFORM || type == PROGRAM_CONSTANT) { @@ -462,5 +464,4 @@ _mesa_recompute_parameter_bounds(struct gl_program_parameter_list *list) list->UniformBytes = MAX2(list->UniformBytes, list->NumParameterValues * 4); } } - assert(list->LastUniformIndex < list->FirstStateVarIndex); } diff --git a/src/mesa/program/prog_parameter.h b/src/mesa/program/prog_parameter.h index bc07dc09531..d625897692a 100644 --- a/src/mesa/program/prog_parameter.h +++ b/src/mesa/program/prog_parameter.h @@ -148,7 +148,9 @@ struct gl_program_parameter_list bool DisallowRealloc; /* Parameters are optionally sorted as follows. Uniforms and constants - * are first, then state vars. + * are first, then state vars. This should be true in all cases except + * ir_to_mesa, which adds constants at the end, and ARB_vp with ARL, + * which can't sort parameters. */ int UniformBytes; int LastUniformIndex; diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c index da547cb419c..64bff6fcfa8 100644 --- a/src/mesa/program/prog_statevars.c +++ b/src/mesa/program/prog_statevars.c @@ -674,6 +674,12 @@ fetch_state(struct gl_context *ctx, const gl_state_index16 state[], } return; + case STATE_NOT_STATE_VAR: + /* Most likely PROGRAM_CONSTANT. This only happens in rare cases, e.g. + * ARB_vp with ARL, which can't sort parameters by type. + */ + return; + default: unreachable("Invalid state in _mesa_fetch_state"); return; @@ -812,6 +818,9 @@ _mesa_program_state_flags(const gl_state_index16 state[STATE_LENGTH]) return 0; } + case STATE_NOT_STATE_VAR: + return 0; + default: _mesa_problem(NULL, "unexpected state[0] in make_state_flags()"); return 0; @@ -1201,6 +1210,9 @@ _mesa_program_state_string(const gl_state_index16 state[STATE_LENGTH]) state[1] == STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED) append_index(str, state[2], false); break; + case STATE_NOT_STATE_VAR: + append(str, "not_state"); + break; default: _mesa_problem(NULL, "Invalid state in _mesa_program_state_string"); break; @@ -1225,7 +1237,6 @@ _mesa_load_state_parameters(struct gl_context *ctx, if (!paramList) return; - assert(paramList->LastUniformIndex < paramList->FirstStateVarIndex); int num = paramList->NumParameters; for (int i = paramList->FirstStateVarIndex; i < num; i++) { @@ -1240,7 +1251,6 @@ _mesa_upload_state_parameters(struct gl_context *ctx, struct gl_program_parameter_list *paramList, uint32_t *dst) { - assert(paramList->LastUniformIndex < paramList->FirstStateVarIndex); int num = paramList->NumParameters; for (int i = paramList->FirstStateVarIndex; i < num; i++) { @@ -1260,15 +1270,11 @@ _mesa_upload_state_parameters(struct gl_context *ctx, void _mesa_optimize_state_parameters(struct gl_program_parameter_list *list) { - assert(list->LastUniformIndex < list->FirstStateVarIndex); - for (int first_param = list->FirstStateVarIndex; first_param < (int)list->NumParameters; first_param++) { int last_param = first_param; int param_diff = 0; - assert(list->Parameters[first_param].Type == PROGRAM_STATE_VAR); - switch (list->Parameters[first_param].StateIndexes[0]) { case STATE_MODELVIEW_MATRIX: case STATE_MODELVIEW_MATRIX_INVERSE: diff --git a/src/mesa/program/prog_statevars.h b/src/mesa/program/prog_statevars.h index bc7325a32ae..8832d4ef9c5 100644 --- a/src/mesa/program/prog_statevars.h +++ b/src/mesa/program/prog_statevars.h @@ -50,6 +50,8 @@ struct gl_program_parameter_list; * always be the array index. */ typedef enum gl_state_index_ { + STATE_NOT_STATE_VAR = 0, + STATE_MATERIAL = 100, /* start at 100 so small ints are seen as ints */ STATE_LIGHT, /* One gl_light attribute. */