diff options
-rw-r--r-- | src/intel/compiler/brw_fs_nir.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index 39e7e692874..35fae180285 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -231,6 +231,24 @@ fs_visitor::nir_emit_system_values() nir_system_values[i] = fs_reg(); } + /* Always emit SUBGROUP_INVOCATION. Dead code will clean it up if we + * never end up using it. + */ + { + const fs_builder abld = bld.annotate("gl_SubgroupInvocation", NULL); + fs_reg ® = nir_system_values[SYSTEM_VALUE_SUBGROUP_INVOCATION]; + reg = abld.vgrf(BRW_REGISTER_TYPE_W); + + const fs_builder allbld8 = abld.group(8, 0).exec_all(); + allbld8.MOV(reg, brw_imm_v(0x76543210)); + if (dispatch_width > 8) + allbld8.ADD(byte_offset(reg, 16), reg, brw_imm_uw(8u)); + if (dispatch_width > 16) { + const fs_builder allbld16 = abld.group(16, 0).exec_all(); + allbld16.ADD(byte_offset(reg, 32), reg, brw_imm_uw(16u)); + } + } + nir_foreach_function(function, nir) { assert(strcmp(function->name, "main") == 0); assert(function->impl); @@ -4170,20 +4188,10 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), brw_imm_d(dispatch_width)); break; - case nir_intrinsic_load_subgroup_invocation: { - fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_UW); - dest = retype(dest, BRW_REGISTER_TYPE_UD); - const fs_builder allbld8 = bld.group(8, 0).exec_all(); - allbld8.MOV(tmp, brw_imm_v(0x76543210)); - if (dispatch_width > 8) - allbld8.ADD(byte_offset(tmp, 16), tmp, brw_imm_uw(8u)); - if (dispatch_width > 16) { - const fs_builder allbld16 = bld.group(16, 0).exec_all(); - allbld16.ADD(byte_offset(tmp, 32), tmp, brw_imm_uw(16u)); - } - bld.MOV(dest, tmp); + case nir_intrinsic_load_subgroup_invocation: + bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), + nir_system_values[SYSTEM_VALUE_SUBGROUP_INVOCATION]); break; - } case nir_intrinsic_load_subgroup_eq_mask: case nir_intrinsic_load_subgroup_ge_mask: |