[Mesa-dev] [PATCH v2] aubinator: implement a rolling window of programs
Eric Engestrom
eric.engestrom at imgtec.com
Fri Sep 1 15:53:17 UTC 2017
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 <lionel.g.landwerlin at intel.com>
I don't know the aubinator code, but assuming you can overwrite programs
without needing to free anything, this is:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>
> ---
> 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
>
More information about the mesa-dev
mailing list