On Friday, 2017-09-01 16:40:17 +0100, Lionel Landwerlin wrote: > If we have more programs than what we can store, > aubinator_error_decode will assert. Instead let's have a rolling > window of programs. > > v2: Fix overflowing issues (Eric Engestrom) > > Signed-off-by: Lionel Landwerlin <[email protected]>
I don't know the aubinator code, but assuming you can overwrite programs without needing to free anything, this is: Reviewed-by: Eric Engestrom <[email protected]> > --- > src/intel/tools/aubinator_error_decode.c | 24 ++++++++++++++++-------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/src/intel/tools/aubinator_error_decode.c > b/src/intel/tools/aubinator_error_decode.c > index 636f56a3365..a62701d495b 100644 > --- a/src/intel/tools/aubinator_error_decode.c > +++ b/src/intel/tools/aubinator_error_decode.c > @@ -47,6 +47,8 @@ > #define GREEN_HEADER CSI "1;42m" > #define NORMAL CSI "0m" > > +#define MIN(a, b) ((a) < (b) ? (a) : (b)) > + > /* options */ > > static bool option_full_decode = true; > @@ -220,7 +222,15 @@ struct program { > > #define MAX_NUM_PROGRAMS 4096 > static struct program programs[MAX_NUM_PROGRAMS]; > -static int num_programs = 0; > +static int idx_program = 0, num_programs = 0; Side note: static vars are already zero-initialised, but I guess it doesn't hurt to be explicit. > + > +static int next_program(void) > +{ > + int ret = idx_program; > + idx_program = (idx_program + 1) % MAX_NUM_PROGRAMS; > + num_programs = MIN(num_programs + 1, MAX_NUM_PROGRAMS); > + return ret; > +} > > static void decode(struct gen_spec *spec, > const char *buffer_name, > @@ -300,7 +310,7 @@ static void decode(struct gen_spec *spec, > enabled[1] ? "SIMD16 fragment shader" : > enabled[2] ? "SIMD32 fragment shader" : NULL; > > - programs[num_programs++] = (struct program) { > + programs[next_program()] = (struct program) { > .type = type, > .command = inst->name, > .command_offset = offset, > @@ -309,7 +319,7 @@ static void decode(struct gen_spec *spec, > }; > } else { > if (enabled[0]) /* SIMD8 */ { > - programs[num_programs++] = (struct program) { > + programs[next_program()] = (struct program) { > .type = "SIMD8 fragment shader", > .command = inst->name, > .command_offset = offset, > @@ -319,7 +329,7 @@ static void decode(struct gen_spec *spec, > }; > } > if (enabled[1]) /* SIMD16 */ { > - programs[num_programs++] = (struct program) { > + programs[next_program()] = (struct program) { > .type = "SIMD16 fragment shader", > .command = inst->name, > .command_offset = offset, > @@ -328,7 +338,7 @@ static void decode(struct gen_spec *spec, > }; > } > if (enabled[2]) /* SIMD32 */ { > - programs[num_programs++] = (struct program) { > + programs[next_program()] = (struct program) { > .type = "SIMD32 fragment shader", > .command = inst->name, > .command_offset = offset, > @@ -375,7 +385,7 @@ static void decode(struct gen_spec *spec, > NULL; > > if (is_enabled) { > - programs[num_programs++] = (struct program) { > + programs[next_program()] = (struct program) { > .type = type, > .command = inst->name, > .command_offset = offset, > @@ -384,8 +394,6 @@ static void decode(struct gen_spec *spec, > }; > } > } > - > - assert(num_programs < MAX_NUM_PROGRAMS); > } > } > > -- > 2.14.1 > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
