intel: decoder: handle 0 sized structs
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Sat, 25 Aug 2018 17:22:00 +0000 (18:22 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 27 Aug 2018 17:33:18 +0000 (18:33 +0100)
Gen7.5 has a BLEND_STATE of size 0 which includes a variable length
group. We did not deal with that very well, leading to an endless
loop.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107544
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/common/gen_decoder.c

index 9e46f2716336e50c242c61c8c122bb6db5a8c22c..ec22b545492e4d6605c419d2b4815245f3a05459 100644 (file)
@@ -997,7 +997,7 @@ gen_field_iterator_init(struct gen_field_iterator *iter,
    iter->p_bit = p_bit;
 
    int length = gen_group_get_length(iter->group, iter->p);
-   iter->p_end = length > 0 ? &p[length] : NULL;
+   iter->p_end = length >= 0 ? &p[length] : NULL;
    iter->print_colors = print_colors;
 }
 
@@ -1012,10 +1012,14 @@ gen_field_iterator_next(struct gen_field_iterator *iter)
          iter_start_field(iter, iter->group->next->fields);
 
       bool result = iter_decode_field(iter);
-      if (iter->p_end)
-         assert(result);
+      if (!result && iter->p_end) {
+         /* We're dealing with a non empty struct of length=0 (BLEND_STATE on
+          * Gen 7.5)
+          */
+         assert(iter->group->dw_length == 0);
+      }
 
-      return true;
+      return result;
    }
 
    if (!iter_advance_field(iter))