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:
parent
b4f3497786
commit
3d9b5d8087
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue