From 293526a273304ea6e500270f1f78bd78ad38dc41 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 11 Dec 2020 21:00:29 -0500 Subject: [PATCH] mesa: don't allocate local parameters in fetch_state MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit It's better to return what the user expects: the initial value. Reviewed-by: Zoltán Böszörményi Part-of: --- src/mesa/program/prog_statevars.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c index b3e596e..9094ce1 100644 --- a/src/mesa/program/prog_statevars.c +++ b/src/mesa/program/prog_statevars.c @@ -382,17 +382,18 @@ fetch_state(struct gl_context *ctx, const gl_state_index16 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; + float (*params)[4] = ctx->FragmentProgram.Current->arb.LocalParams; + if (unlikely(!params)) { + /* Local parameters haven't been allocated yet. + * ARB_fragment_program says that local parameters are + * "initially set to (0,0,0,0)." Return that. + */ + memset(value, 0, sizeof(float) * 4); + return; } const int idx = (int) state[1]; - COPY_4V(value, - ctx->FragmentProgram.Current->arb.LocalParams[idx]); + COPY_4V(value, params[idx]); return; } case STATE_VERTEX_PROGRAM_ENV: { @@ -401,16 +402,18 @@ fetch_state(struct gl_context *ctx, const gl_state_index16 state[], 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; + float (*params)[4] = ctx->VertexProgram.Current->arb.LocalParams; + if (unlikely(!params)) { + /* Local parameters haven't been allocated yet. + * ARB_vertex_program says that local parameters are + * "initially set to (0,0,0,0)." Return that. + */ + memset(value, 0, sizeof(float) * 4); + return; } const int idx = (int) state[1]; - COPY_4V(value, ctx->VertexProgram.Current->arb.LocalParams[idx]); + COPY_4V(value, params[idx]); return; } -- 2.7.4