genxml: Fix decoder for groups with multiple fields.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 19 May 2017 22:25:21 +0000 (15:25 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 1 Jun 2017 18:49:45 +0000 (11:49 -0700)
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 <lionel.g.landwerlin@intel.com>
src/intel/common/gen_decoder.c

index 3ea2eaf8dbf3fd7ec263733d146863aecd8f5a9a..de50c4466bc1fd8802e2f0e60a5882c6e6efa6be 100644 (file)
@@ -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) {