Mesa (master): mesa: combine STATE_ENV, STATE_LOCAL enums with STATE_xxx_PROGRAM
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 21 22:16:31 UTC 2021
Module: Mesa
Branch: master
Commit: 3d9b5d80870924f69401c267b719a814f02c7c61
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3d9b5d80870924f69401c267b719a814f02c7c61
Author: Marek Olšák <marek.olsak at amd.com>
Date: Fri Dec 4 19:50:53 2020 -0500
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 at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8183>
---
src/mesa/program/prog_statevars.c | 113 ++++++++++++++++----------------------
src/mesa/program/prog_statevars.h | 9 ++-
src/mesa/program/program_parse.y | 50 +++++++++--------
src/mesa/program/program_parser.h | 3 +-
4 files changed, 79 insertions(+), 96 deletions(-)
diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c
index 790e79238a5..7ee39ba74f8 100644
--- a/src/mesa/program/prog_statevars.c
+++ b/src/mesa/program/prog_statevars.c
@@ -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_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;
+ }
- 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;
- }
+ 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;
diff --git a/src/mesa/program/prog_statevars.h b/src/mesa/program/prog_statevars.h
index a490c8679ae..5fcccf3aca8 100644
--- a/src/mesa/program/prog_statevars.h
+++ b/src/mesa/program/prog_statevars.h
@@ -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 */
diff --git a/src/mesa/program/program_parse.y b/src/mesa/program/program_parse.y
index 47bbf9e531e..8d46461a1ff 100644
--- a/src/mesa/program/program_parse.y
+++ b/src/mesa/program/program_parse.y
@@ -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);
diff --git a/src/mesa/program/program_parser.h b/src/mesa/program/program_parser.h
index dadce126247..4d31d997724 100644
--- a/src/mesa/program/program_parser.h
+++ b/src/mesa/program/program_parser.h
@@ -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;
/**
More information about the mesa-commit
mailing list