diff options
author | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2018-08-25 18:22:00 +0100 |
---|---|---|
committer | Andres Gomez <agomez@igalia.com> | 2018-08-28 15:51:00 +0300 |
commit | 09743ed9fcf46f0d8dcc3d4a44d807c4891af132 (patch) | |
tree | 9d2b0d62ef71e14a2417f35dbc6786523a886c02 /src/intel | |
parent | 633ef670bb36d6543611ae6ea3c06217cb998483 (diff) |
intel: decoder: handle 0 sized structs
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>
(cherry picked from commit 440a988bd1478bb33dafcbb8575473bc643ae383)
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/common/gen_decoder.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index 4316b7a82e8..04de7b7bb81 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -991,7 +991,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; } @@ -1006,10 +1006,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)) |