spirv: Add subgroup shuffle support
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
@@ -47,6 +47,7 @@ struct spirv_supported_capabilities {
|
||||
bool shader_viewport_index_layer;
|
||||
bool subgroup_ballot;
|
||||
bool subgroup_basic;
|
||||
bool subgroup_shuffle;
|
||||
bool subgroup_vote;
|
||||
};
|
||||
|
||||
|
@@ -3305,6 +3305,11 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
|
||||
spv_check_supported(subgroup_ballot, cap);
|
||||
break;
|
||||
|
||||
case SpvCapabilityGroupNonUniformShuffle:
|
||||
case SpvCapabilityGroupNonUniformShuffleRelative:
|
||||
spv_check_supported(subgroup_shuffle, cap);
|
||||
break;
|
||||
|
||||
case SpvCapabilityVariablePointersStorageBuffer:
|
||||
case SpvCapabilityVariablePointers:
|
||||
spv_check_supported(variable_pointers, cap);
|
||||
|
@@ -229,7 +229,29 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
|
||||
case SpvOpGroupNonUniformShuffle:
|
||||
case SpvOpGroupNonUniformShuffleXor:
|
||||
case SpvOpGroupNonUniformShuffleUp:
|
||||
case SpvOpGroupNonUniformShuffleDown:
|
||||
case SpvOpGroupNonUniformShuffleDown: {
|
||||
nir_intrinsic_op op;
|
||||
switch (opcode) {
|
||||
case SpvOpGroupNonUniformShuffle:
|
||||
op = nir_intrinsic_shuffle;
|
||||
break;
|
||||
case SpvOpGroupNonUniformShuffleXor:
|
||||
op = nir_intrinsic_shuffle_xor;
|
||||
break;
|
||||
case SpvOpGroupNonUniformShuffleUp:
|
||||
op = nir_intrinsic_shuffle_up;
|
||||
break;
|
||||
case SpvOpGroupNonUniformShuffleDown:
|
||||
op = nir_intrinsic_shuffle_down;
|
||||
break;
|
||||
default:
|
||||
unreachable("Invalid opcode");
|
||||
}
|
||||
vtn_build_subgroup_instr(b, op, val->ssa, vtn_ssa_value(b, w[4]),
|
||||
vtn_ssa_value(b, w[5])->def);
|
||||
break;
|
||||
}
|
||||
|
||||
case SpvOpGroupNonUniformIAdd:
|
||||
case SpvOpGroupNonUniformFAdd:
|
||||
case SpvOpGroupNonUniformIMul:
|
||||
|
Reference in New Issue
Block a user