spirv: Add subgroup vote support

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
Jason Ekstrand
2017-08-24 11:01:22 -07:00
parent 44681e4795
commit d792f3d4cd
3 changed files with 51 additions and 1 deletions

View File

@@ -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_vote;
}; };
typedef struct shader_info { typedef struct shader_info {

View File

@@ -3296,6 +3296,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
spv_check_supported(subgroup_basic, cap); spv_check_supported(subgroup_basic, cap);
break; break;
case SpvCapabilityGroupNonUniformVote:
spv_check_supported(subgroup_vote, cap);
break;
case SpvCapabilitySubgroupBallotKHR: case SpvCapabilitySubgroupBallotKHR:
case SpvCapabilityGroupNonUniformBallot: case SpvCapabilityGroupNonUniformBallot:
spv_check_supported(subgroup_ballot, cap); spv_check_supported(subgroup_ballot, cap);

View File

@@ -180,7 +180,52 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
case SpvOpGroupNonUniformAll: case SpvOpGroupNonUniformAll:
case SpvOpGroupNonUniformAny: case SpvOpGroupNonUniformAny:
case SpvOpGroupNonUniformAllEqual: case SpvOpGroupNonUniformAllEqual: {
vtn_fail_if(val->type->type != glsl_bool_type(),
"OpGroupNonUniform(All|Any|AllEqual) must return a bool");
nir_intrinsic_op op;
switch (opcode) {
case SpvOpGroupNonUniformAll:
op = nir_intrinsic_vote_all;
break;
case SpvOpGroupNonUniformAny:
op = nir_intrinsic_vote_any;
break;
case SpvOpGroupNonUniformAllEqual: {
switch (glsl_get_base_type(val->type->type)) {
case GLSL_TYPE_FLOAT:
case GLSL_TYPE_DOUBLE:
op = nir_intrinsic_vote_feq;
break;
case GLSL_TYPE_UINT:
case GLSL_TYPE_INT:
case GLSL_TYPE_UINT64:
case GLSL_TYPE_INT64:
case GLSL_TYPE_BOOL:
op = nir_intrinsic_vote_ieq;
break;
default:
unreachable("Unhandled type");
}
break;
}
default:
unreachable("Unhandled opcode");
}
nir_ssa_def *src0 = vtn_ssa_value(b, w[4])->def;
nir_intrinsic_instr *intrin =
nir_intrinsic_instr_create(b->nb.shader, op);
intrin->num_components = src0->num_components;
intrin->src[0] = nir_src_for_ssa(src0);
nir_ssa_dest_init(&intrin->instr, &intrin->dest, 1, 32, NULL);
nir_builder_instr_insert(&b->nb, &intrin->instr);
val->ssa->def = &intrin->dest.ssa;
break;
}
case SpvOpGroupNonUniformShuffle: case SpvOpGroupNonUniformShuffle:
case SpvOpGroupNonUniformShuffleXor: case SpvOpGroupNonUniformShuffleXor:
case SpvOpGroupNonUniformShuffleUp: case SpvOpGroupNonUniformShuffleUp: