diff options
author | Kenneth Graunke <[email protected]> | 2017-05-19 15:25:21 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2017-06-01 11:49:45 -0700 |
commit | d1b949282f6387e9dc4a9a43defc8aaa08749c0a (patch) | |
tree | d5734f491adfaa80a55d76cd0ae8638063e508ce /src/intel | |
parent | df2d55ba57dec857e4fb36ba3d9ec86aa3a46cd5 (diff) |
genxml: Fix decoder for groups with multiple fields.
If you have something like:
<group count="0" start="96" size="32">
<field name="Entry_0" start="0" end="15" type="GATHER_CONSTANT_ENTRY"/>
<field name="Entry_1" start="16" end="31" type="GATHER_CONSTANT_ENTRY"/>
</group>
We would reset ctx->group_count to 0 after processing the first field,
so the second would not have a group count.
This is largely untested, as the only groups with multiple fields are
packets we don't emit in Mesa. Found by inspection.
Acked-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/common/gen_decoder.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index 3ea2eaf8dbf..de50c4466bc 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -414,11 +414,9 @@ start_element(void *data, const char *element_name, const char **atts) &ctx->group->group_count, &ctx->group->elem_size, &ctx->group->variable); } else if (strcmp(element_name, "field") == 0) { - do { + for (int g = 0; g < MAX2(ctx->group->group_count, 1); g++) { ctx->fields[ctx->nfields++] = create_field(ctx, atts); - if (ctx->group->group_count) - ctx->group->group_count--; - } while (ctx->group->group_count > 0); + } } else if (strcmp(element_name, "enum") == 0) { ctx->enoom = create_enum(ctx, name, atts); } else if (strcmp(element_name, "value") == 0) { |