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.landwer...@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107544 --- src/intel/common/gen_decoder.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index ec0a486b101..daaf772a59f 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; } @@ -1000,16 +1000,32 @@ gen_field_iterator_next(struct gen_field_iterator *iter) { /* Initial condition */ if (!iter->field) { - if (iter->group->fields) + if (iter->group->fields) { + /* We have an instruction/struct with at least one field. */ iter->field = iter->group->fields; - else + } else if (iter->group->next) { + /* We have an instruction/struct with no fields but at least a + * group. + */ iter->field = iter->group->next->fields; + iter->struct_desc = + gen_spec_find_struct(iter->group->spec, + iter->field->type.gen_struct->name); + } else { + /* Please fix genxml. */ + unreachable("Empty struct/instruction"); + return false; + } 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)) -- 2.18.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev