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 shader_viewport_index_layer;
|
||||||
bool subgroup_ballot;
|
bool subgroup_ballot;
|
||||||
bool subgroup_basic;
|
bool subgroup_basic;
|
||||||
|
bool subgroup_shuffle;
|
||||||
bool subgroup_vote;
|
bool subgroup_vote;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -3305,6 +3305,11 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
|
|||||||
spv_check_supported(subgroup_ballot, cap);
|
spv_check_supported(subgroup_ballot, cap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SpvCapabilityGroupNonUniformShuffle:
|
||||||
|
case SpvCapabilityGroupNonUniformShuffleRelative:
|
||||||
|
spv_check_supported(subgroup_shuffle, cap);
|
||||||
|
break;
|
||||||
|
|
||||||
case SpvCapabilityVariablePointersStorageBuffer:
|
case SpvCapabilityVariablePointersStorageBuffer:
|
||||||
case SpvCapabilityVariablePointers:
|
case SpvCapabilityVariablePointers:
|
||||||
spv_check_supported(variable_pointers, cap);
|
spv_check_supported(variable_pointers, cap);
|
||||||
|
@@ -229,7 +229,29 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
|
|||||||
case SpvOpGroupNonUniformShuffle:
|
case SpvOpGroupNonUniformShuffle:
|
||||||
case SpvOpGroupNonUniformShuffleXor:
|
case SpvOpGroupNonUniformShuffleXor:
|
||||||
case SpvOpGroupNonUniformShuffleUp:
|
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 SpvOpGroupNonUniformIAdd:
|
||||||
case SpvOpGroupNonUniformFAdd:
|
case SpvOpGroupNonUniformFAdd:
|
||||||
case SpvOpGroupNonUniformIMul:
|
case SpvOpGroupNonUniformIMul:
|
||||||
|
Reference in New Issue
Block a user