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