diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index f35f7ce530f..d97ca57a79d 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -1520,7 +1520,7 @@ iris_setup_binding_table(const struct intel_device_info *devinfo, nir_builder b = nir_builder_create(impl); nir_foreach_block (block, impl) { - nir_foreach_instr (instr, block) { + nir_foreach_instr_safe (instr, block) { if (instr->type == nir_instr_type_tex) { nir_tex_instr *tex = nir_instr_as_tex(instr); if (tex->texture_index < 64) { @@ -1583,6 +1583,21 @@ iris_setup_binding_table(const struct intel_device_info *devinfo, IRIS_SURFACE_GROUP_SSBO); break; + case nir_intrinsic_load_num_workgroups: + b.cursor = nir_before_instr(instr); + nir_def_replace( + &intrin->def, + nir_load_ubo(&b, + intrin->def.num_components, + intrin->def.bit_size, + nir_imm_int(&b, bt->offsets[ + IRIS_SURFACE_GROUP_CS_WORK_GROUPS]), + nir_imm_int(&b, 0), + .range_base = 0, + .range = intrin->def.num_components * + intrin->def.bit_size / 8)); + break; + default: break; }