Looks reasonable to me.
Reviewed-by: Roland Scheidegger
Am 16.10.18 um 10:07 schrieb Gert Wollny:
> From: Gert Wollny
>
> The number of immediate constants was fixed and the size check was
> only done by means of an assertion. Given this a shader that emits
> more immediate constants would result in a memory corruption when
> mesa is build in release mode.
>
> Instead of using this fixed limit allocate the space dynamically, let it
> grow as needed, and also remove the unused ImmArray.
>
> Fixes: dEQP-GLES31.functional.ssbo.layout.random.arrays_of_arrays.1
>
> Signed-off-by: Gert Wollny
> ---
> src/gallium/auxiliary/tgsi/tgsi_exec.c | 13 -
> src/gallium/auxiliary/tgsi/tgsi_exec.h | 7 +++
> 2 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index 59194ebe31..5db515a075 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -1223,7 +1223,17 @@ tgsi_exec_machine_bind_shader(
> {
> uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
> assert( size <= 4 );
> -assert( mach->ImmLimit + 1 <= TGSI_EXEC_NUM_IMMEDIATES );
> +if (mach->ImmLimit >= mach->ImmsReserved) {
> + unsigned newReserved = mach->ImmsReserved ? 2 *
> mach->ImmsReserved : 128;
> + float4 *imms = REALLOC(mach->Imms, mach->ImmsReserved,
> newReserved * sizeof(float4));
> + if (imms) {
> + mach->ImmsReserved = newReserved;
> + mach->Imms = imms;
> + } else {
> + debug_printf("Unable to (re)allocate space for immidiate
> constants\n");
> + break;
> + }
> +}
>
> for( i = 0; i < size; i++ ) {
> mach->Imms[mach->ImmLimit][i] =
> @@ -1337,6 +1347,7 @@ tgsi_exec_machine_destroy(struct tgsi_exec_machine
> *mach)
> if (mach) {
>FREE(mach->Instructions);
>FREE(mach->Declarations);
> + FREE(mach->Imms);
>
>align_free(mach->Inputs);
>align_free(mach->Outputs);
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index ed8b9e8869..6d4ac38142 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -231,7 +231,6 @@ struct tgsi_sampler
> };
>
> #define TGSI_EXEC_NUM_TEMPS 4096
> -#define TGSI_EXEC_NUM_IMMEDIATES 256
>
> /*
> * Locations of various utility registers (_I = Index, _C = Channel)
> @@ -341,6 +340,7 @@ enum tgsi_break_type {
>
> #define TGSI_EXEC_MAX_BREAK_STACK (TGSI_EXEC_MAX_LOOP_NESTING +
> TGSI_EXEC_MAX_SWITCH_NESTING)
>
> +typedef float float4[4];
>
> /**
> * Run-time virtual machine state for executing TGSI shader.
> @@ -352,9 +352,8 @@ struct tgsi_exec_machine
> struct tgsi_exec_vector Temps[TGSI_EXEC_NUM_TEMPS +
> TGSI_EXEC_NUM_TEMP_EXTRAS];
>
> - float Imms[TGSI_EXEC_NUM_IMMEDIATES][4];
> -
> - float ImmArray[TGSI_EXEC_NUM_IMMEDIATES][4];
> + unsigned ImmsReserved;
> + float4 *Imms;
>
> struct tgsi_exec_vector *Inputs;
> struct tgsi_exec_vector *Outputs;
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev