spirv: Add subgroup quad 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_quad;
|
||||||
bool subgroup_shuffle;
|
bool subgroup_shuffle;
|
||||||
bool subgroup_vote;
|
bool subgroup_vote;
|
||||||
};
|
};
|
||||||
|
@@ -3310,6 +3310,9 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
|
|||||||
spv_check_supported(subgroup_shuffle, cap);
|
spv_check_supported(subgroup_shuffle, cap);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SpvCapabilityGroupNonUniformQuad:
|
||||||
|
spv_check_supported(subgroup_quad, cap);
|
||||||
|
|
||||||
case SpvCapabilityVariablePointersStorageBuffer:
|
case SpvCapabilityVariablePointersStorageBuffer:
|
||||||
case SpvCapabilityVariablePointers:
|
case SpvCapabilityVariablePointers:
|
||||||
spv_check_supported(variable_pointers, cap);
|
spv_check_supported(variable_pointers, cap);
|
||||||
|
@@ -252,6 +252,30 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SpvOpGroupNonUniformQuadBroadcast:
|
||||||
|
vtn_build_subgroup_instr(b, nir_intrinsic_quad_broadcast,
|
||||||
|
val->ssa, vtn_ssa_value(b, w[4]),
|
||||||
|
vtn_ssa_value(b, w[5])->def);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SpvOpGroupNonUniformQuadSwap: {
|
||||||
|
unsigned direction = vtn_constant_value(b, w[5])->values[0].u32[0];
|
||||||
|
nir_intrinsic_op op;
|
||||||
|
switch (direction) {
|
||||||
|
case 0:
|
||||||
|
op = nir_intrinsic_quad_swap_horizontal;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
op = nir_intrinsic_quad_swap_vertical;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
op = nir_intrinsic_quad_swap_diagonal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vtn_build_subgroup_instr(b, op, val->ssa, vtn_ssa_value(b, w[4]), NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case SpvOpGroupNonUniformIAdd:
|
case SpvOpGroupNonUniformIAdd:
|
||||||
case SpvOpGroupNonUniformFAdd:
|
case SpvOpGroupNonUniformFAdd:
|
||||||
case SpvOpGroupNonUniformIMul:
|
case SpvOpGroupNonUniformIMul:
|
||||||
@@ -268,8 +292,6 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
|
|||||||
case SpvOpGroupNonUniformLogicalAnd:
|
case SpvOpGroupNonUniformLogicalAnd:
|
||||||
case SpvOpGroupNonUniformLogicalOr:
|
case SpvOpGroupNonUniformLogicalOr:
|
||||||
case SpvOpGroupNonUniformLogicalXor:
|
case SpvOpGroupNonUniformLogicalXor:
|
||||||
case SpvOpGroupNonUniformQuadBroadcast:
|
|
||||||
case SpvOpGroupNonUniformQuadSwap:
|
|
||||||
default:
|
default:
|
||||||
unreachable("Invalid SPIR-V opcode");
|
unreachable("Invalid SPIR-V opcode");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user