From 3d9b5d80870924f69401c267b719a814f02c7c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 4 Dec 2020 19:50:53 -0500 Subject: [PATCH] mesa: combine STATE_ENV, STATE_LOCAL enums with STATE_xxx_PROGRAM flattening continues to get optimal code in fetch_state Reviewed-by: Eric Anholt Part-of: --- src/mesa/program/prog_statevars.c | 115 +++++++++++++----------------- src/mesa/program/prog_statevars.h | 9 ++- src/mesa/program/program_parse.y | 50 ++++++------- src/mesa/program/program_parser.h | 3 +- 4 files changed, 80 insertions(+), 97 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_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; 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; /**