i965/fs: Implement basic SPIR-V subgroup intrinsics
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
@@ -4501,6 +4501,14 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_first_invocation: {
|
||||||
|
fs_reg tmp = bld.vgrf(BRW_REGISTER_TYPE_UD);
|
||||||
|
bld.exec_all().emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, tmp);
|
||||||
|
bld.MOV(retype(dest, BRW_REGISTER_TYPE_UD),
|
||||||
|
fs_reg(component(tmp, 0)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unreachable("unknown intrinsic");
|
unreachable("unknown intrinsic");
|
||||||
}
|
}
|
||||||
|
@@ -103,6 +103,24 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case nir_intrinsic_load_subgroup_id:
|
||||||
|
if (state->local_workgroup_size > 8)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* For small workgroup sizes, we know subgroup_id will be zero */
|
||||||
|
sysval = nir_imm_int(b, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case nir_intrinsic_load_num_subgroups: {
|
||||||
|
unsigned local_workgroup_size =
|
||||||
|
nir->info.cs.local_size[0] * nir->info.cs.local_size[1] *
|
||||||
|
nir->info.cs.local_size[2];
|
||||||
|
unsigned num_subgroups =
|
||||||
|
DIV_ROUND_UP(local_workgroup_size, state->dispatch_width);
|
||||||
|
sysval = nir_imm_int(b, num_subgroups);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user