mesa: combine STATE_ENV, STATE_LOCAL enums with STATE_xxx_PROGRAM

flattening continues to get optimal code in fetch_state

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8183>
This commit is contained in:
Marek Olšák 2020-12-04 19:50:53 -05:00 committed by Marge Bot
parent b4f3497786
commit 3d9b5d8087
4 changed files with 80 additions and 97 deletions

View File

@ -414,63 +414,43 @@ fetch_state(struct gl_context *ctx, const gl_state_index16 state[],
value[2] = ctx->ViewportArray[0].Far - ctx->ViewportArray[0].Near; /* far - near */
value[3] = 1.0;
return;
case STATE_FRAGMENT_PROGRAM:
{
/* state[1] = {STATE_ENV, STATE_LOCAL} */
/* state[2] = parameter index */
const int idx = (int) state[2];
switch (state[1]) {
case STATE_ENV:
COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);
return;
case STATE_LOCAL:
if (!ctx->FragmentProgram.Current->arb.LocalParams) {
ctx->FragmentProgram.Current->arb.LocalParams =
rzalloc_array_size(ctx->FragmentProgram.Current,
sizeof(float[4]),
MAX_PROGRAM_LOCAL_PARAMS);
if (!ctx->FragmentProgram.Current->arb.LocalParams)
return;
}
COPY_4V(value,
ctx->FragmentProgram.Current->arb.LocalParams[idx]);
return;
default:
unreachable("Bad state switch in fetch_state()");
return;
}
}
case STATE_FRAGMENT_PROGRAM_ENV: {
const int idx = (int) state[1];
COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);
return;
case STATE_VERTEX_PROGRAM:
{
/* state[1] = {STATE_ENV, STATE_LOCAL} */
/* state[2] = parameter index */
const int idx = (int) state[2];
switch (state[1]) {
case STATE_ENV:
COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
return;
case STATE_LOCAL:
if (!ctx->VertexProgram.Current->arb.LocalParams) {
ctx->VertexProgram.Current->arb.LocalParams =
rzalloc_array_size(ctx->VertexProgram.Current,
sizeof(float[4]),
MAX_PROGRAM_LOCAL_PARAMS);
if (!ctx->VertexProgram.Current->arb.LocalParams)
return;
}
COPY_4V(value,
ctx->VertexProgram.Current->arb.LocalParams[idx]);
return;
default:
unreachable("Bad state switch in fetch_state()");
return;
}
}
case STATE_FRAGMENT_PROGRAM_LOCAL: {
if (!ctx->FragmentProgram.Current->arb.LocalParams) {
ctx->FragmentProgram.Current->arb.LocalParams =
rzalloc_array_size(ctx->FragmentProgram.Current, sizeof(float[4]),
MAX_PROGRAM_LOCAL_PARAMS);
if (!ctx->FragmentProgram.Current->arb.LocalParams)
return;
}
const int idx = (int) state[1];
COPY_4V(value,
ctx->FragmentProgram.Current->arb.LocalParams[idx]);
return;
}
case STATE_VERTEX_PROGRAM_ENV: {
const int idx = (int) state[1];
COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
return;
}
case STATE_VERTEX_PROGRAM_LOCAL: {
if (!ctx->VertexProgram.Current->arb.LocalParams) {
ctx->VertexProgram.Current->arb.LocalParams =
rzalloc_array_size(ctx->VertexProgram.Current, sizeof(float[4]),
MAX_PROGRAM_LOCAL_PARAMS);
if (!ctx->VertexProgram.Current->arb.LocalParams)
return;
}
const int idx = (int) state[1];
COPY_4V(value, ctx->VertexProgram.Current->arb.LocalParams[idx]);
return;
}
case STATE_NORMAL_SCALE_EYESPACE:
ASSIGN_4V(value, ctx->_ModelViewInvScaleEyespace, 0, 0, 1);
@ -776,8 +756,10 @@ _mesa_program_state_flags(const gl_state_index16 state[STATE_LENGTH])
case STATE_DEPTH_RANGE:
return _NEW_VIEWPORT;
case STATE_FRAGMENT_PROGRAM:
case STATE_VERTEX_PROGRAM:
case STATE_FRAGMENT_PROGRAM_ENV:
case STATE_FRAGMENT_PROGRAM_LOCAL:
case STATE_VERTEX_PROGRAM_ENV:
case STATE_VERTEX_PROGRAM_LOCAL:
return _NEW_PROGRAM;
case STATE_NORMAL_SCALE_EYESPACE:
@ -1011,13 +993,12 @@ append_token(char *dst, gl_state_index k)
case STATE_DEPTH_RANGE:
append(dst, "depth.range");
break;
case STATE_VERTEX_PROGRAM:
case STATE_FRAGMENT_PROGRAM:
break;
case STATE_ENV:
case STATE_VERTEX_PROGRAM_ENV:
case STATE_FRAGMENT_PROGRAM_ENV:
append(dst, "env");
break;
case STATE_LOCAL:
case STATE_VERTEX_PROGRAM_LOCAL:
case STATE_FRAGMENT_PROGRAM_LOCAL:
append(dst, "local");
break;
case STATE_CURRENT_ATTRIB:
@ -1203,12 +1184,12 @@ _mesa_program_state_string(const gl_state_index16 state[STATE_LENGTH])
break;
case STATE_DEPTH_RANGE:
break;
case STATE_FRAGMENT_PROGRAM:
case STATE_VERTEX_PROGRAM:
/* state[1] = {STATE_ENV, STATE_LOCAL} */
/* state[2] = parameter index */
append_token(str, state[1]);
append_index(str, state[2], false);
case STATE_FRAGMENT_PROGRAM_ENV:
case STATE_FRAGMENT_PROGRAM_LOCAL:
case STATE_VERTEX_PROGRAM_ENV:
case STATE_VERTEX_PROGRAM_LOCAL:
/* state[1] = parameter index */
append_index(str, state[1], false);
break;
case STATE_NORMAL_SCALE_EYESPACE:
break;

View File

@ -126,11 +126,10 @@ typedef enum gl_state_index_ {
STATE_DEPTH_RANGE,
STATE_VERTEX_PROGRAM,
STATE_FRAGMENT_PROGRAM,
STATE_ENV,
STATE_LOCAL,
STATE_VERTEX_PROGRAM_ENV,
STATE_VERTEX_PROGRAM_LOCAL,
STATE_FRAGMENT_PROGRAM_ENV,
STATE_FRAGMENT_PROGRAM_LOCAL,
STATE_CURRENT_ATTRIB, /* ctx->Current vertex attrib value */
STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, /* ctx->Current vertex attrib value after passthrough vertex processing */

View File

@ -1633,10 +1633,10 @@ programMultipleItem: progEnvParams | progLocalParams;
progEnvParams: PROGRAM ENV '[' progEnvParamNums ']'
{
memset($$, 0, sizeof($$));
$$[0] = state->state_param_enum;
$$[1] = STATE_ENV;
$$[2] = $4[0];
$$[3] = $4[1];
$$[0] = state->state_param_enum_env;
$$[1] = $4[0];
$$[2] = $4[1];
$$[3] = 0;
}
;
@ -1655,20 +1655,20 @@ progEnvParamNums: progEnvParamNum
progEnvParam: PROGRAM ENV '[' progEnvParamNum ']'
{
memset($$, 0, sizeof($$));
$$[0] = state->state_param_enum;
$$[1] = STATE_ENV;
$$[0] = state->state_param_enum_env;
$$[1] = $4;
$$[2] = $4;
$$[3] = $4;
$$[3] = 0;
}
;
progLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']'
{
memset($$, 0, sizeof($$));
$$[0] = state->state_param_enum;
$$[1] = STATE_LOCAL;
$$[2] = $4[0];
$$[3] = $4[1];
$$[0] = state->state_param_enum_local;
$$[1] = $4[0];
$$[2] = $4[1];
$$[3] = 0;
}
progLocalParamNums: progLocalParamNum
@ -1686,10 +1686,10 @@ progLocalParamNums: progLocalParamNum
progLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']'
{
memset($$, 0, sizeof($$));
$$[0] = state->state_param_enum;
$$[1] = STATE_LOCAL;
$$[0] = state->state_param_enum_local;
$$[1] = $4;
$$[2] = $4;
$$[3] = $4;
$$[3] = 0;
}
;
@ -2386,10 +2386,10 @@ initialize_symbol_from_param(struct gl_program *prog,
memcpy(state_tokens, tokens, sizeof(state_tokens));
assert((state_tokens[0] == STATE_VERTEX_PROGRAM)
|| (state_tokens[0] == STATE_FRAGMENT_PROGRAM));
assert((state_tokens[1] == STATE_ENV)
|| (state_tokens[1] == STATE_LOCAL));
assert(state_tokens[0] == STATE_VERTEX_PROGRAM_ENV ||
state_tokens[0] == STATE_VERTEX_PROGRAM_LOCAL ||
state_tokens[0] == STATE_FRAGMENT_PROGRAM_ENV ||
state_tokens[0] == STATE_FRAGMENT_PROGRAM_LOCAL);
/*
* The param type is STATE_VAR. The program parameter entry will
@ -2401,13 +2401,13 @@ initialize_symbol_from_param(struct gl_program *prog,
/* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements,
* we need to unroll it and call add_state_reference() for each row
*/
if (state_tokens[2] != state_tokens[3]) {
if (state_tokens[1] != state_tokens[2]) {
int row;
const int first_row = state_tokens[2];
const int last_row = state_tokens[3];
const int first_row = state_tokens[1];
const int last_row = state_tokens[2];
for (row = first_row; row <= last_row; row++) {
state_tokens[2] = state_tokens[3] = row;
state_tokens[1] = state_tokens[2] = row;
idx = add_state_reference(prog->Parameters, state_tokens);
if (param_var->param_binding_begin == ~0U) {
@ -2561,8 +2561,10 @@ _mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *st
state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices;
state->MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB)
? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM;
state->state_param_enum_env = (target == GL_VERTEX_PROGRAM_ARB)
? STATE_VERTEX_PROGRAM_ENV : STATE_FRAGMENT_PROGRAM_ENV;
state->state_param_enum_local = (target == GL_VERTEX_PROGRAM_ARB)
? STATE_VERTEX_PROGRAM_LOCAL : STATE_FRAGMENT_PROGRAM_LOCAL;
_mesa_set_program_error(ctx, -1, NULL);

View File

@ -186,7 +186,8 @@ struct asm_parser_state {
* Value to use in state vector accessors for environment and local
* parameters
*/
unsigned state_param_enum;
unsigned state_param_enum_env;
unsigned state_param_enum_local;
/**