diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index a57274250b9..ab1193d2a7c 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -122,6 +122,7 @@ struct gs_thread_payload : public thread_payload { fs_reg urb_handles; fs_reg primitive_id; + fs_reg instance_id; fs_reg icp_handle_start; }; diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index ed67e626f9b..25b22695dad 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -220,11 +220,7 @@ emit_system_values_block(nir_to_brw_state &ntb, nir_block *block) assert(s.stage == MESA_SHADER_GEOMETRY); reg = &ntb.system_values[SYSTEM_VALUE_INVOCATION_ID]; if (reg->file == BAD_FILE) { - const fs_builder abld = ntb.bld.annotate("gl_InvocationID", NULL); - fs_reg g1(retype(brw_vec8_grf(1, 0), BRW_REGISTER_TYPE_UD)); - fs_reg iid = abld.vgrf(BRW_REGISTER_TYPE_UD, 1); - abld.SHR(iid, g1, brw_imm_ud(27u)); - *reg = iid; + *reg = s.gs_payload().instance_id; } break; diff --git a/src/intel/compiler/brw_fs_thread_payload.cpp b/src/intel/compiler/brw_fs_thread_payload.cpp index 1ad4f38d8c8..d4d29acf6c1 100644 --- a/src/intel/compiler/brw_fs_thread_payload.cpp +++ b/src/intel/compiler/brw_fs_thread_payload.cpp @@ -113,6 +113,11 @@ gs_thread_payload::gs_thread_payload(fs_visitor &v) urb_handles = bld.vgrf(BRW_REGISTER_TYPE_UD); bld.AND(urb_handles, brw_ud8_grf(r, 0), v.devinfo->ver >= 20 ? brw_imm_ud(0xFFFFFF) : brw_imm_ud(0xFFFF)); + + /* R1: Instance ID stored in bits 31:27 */ + instance_id = bld.vgrf(BRW_REGISTER_TYPE_UD); + bld.SHR(instance_id, brw_ud8_grf(r, 0), brw_imm_ud(27u)); + r += reg_unit(v.devinfo); if (gs_prog_data->include_primitive_id) {