From 1b89ebeedead8316bd7af0836a8890c8d1e8a131 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 9 Mar 2018 10:55:15 +0100 Subject: [PATCH] nir/spirv: add support for the SubgroupBallotKHR SPIR-V capability This capability is required for the VK_EXT_shader_subgroup_ballot extension. Reviewed-by: Connor Abbott --- src/compiler/spirv/spirv_to_nir.c | 3 +++ src/compiler/spirv/vtn_subgroup.c | 17 ++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index fe9fe6932e7..326f4b0d411 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -4525,6 +4525,9 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode, case SpvOpGroupNonUniformLogicalXor: case SpvOpGroupNonUniformQuadBroadcast: case SpvOpGroupNonUniformQuadSwap: + case SpvOpSubgroupBallotKHR: + case SpvOpSubgroupFirstInvocationKHR: + case SpvOpSubgroupReadInvocationKHR: case SpvOpSubgroupAllKHR: case SpvOpSubgroupAnyKHR: case SpvOpSubgroupAllEqualKHR: diff --git a/src/compiler/spirv/vtn_subgroup.c b/src/compiler/spirv/vtn_subgroup.c index dfa8347b292..ce795ec2cb5 100644 --- a/src/compiler/spirv/vtn_subgroup.c +++ b/src/compiler/spirv/vtn_subgroup.c @@ -88,12 +88,13 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode, break; } - case SpvOpGroupNonUniformBallot: { + case SpvOpGroupNonUniformBallot: ++w; + case SpvOpSubgroupBallotKHR: { vtn_fail_if(val->type->type != glsl_vector_type(GLSL_TYPE_UINT, 4), "OpGroupNonUniformBallot must return a uvec4"); nir_intrinsic_instr *ballot = nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_ballot); - ballot->src[0] = nir_src_for_ssa(vtn_ssa_value(b, w[4])->def); + ballot->src[0] = nir_src_for_ssa(vtn_ssa_value(b, w[3])->def); nir_ssa_dest_init(&ballot->instr, &ballot->dest, 4, 32, NULL); ballot->num_components = 4; nir_builder_instr_insert(&b->nb, &ballot->instr); @@ -176,15 +177,17 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode, break; } - case SpvOpGroupNonUniformBroadcastFirst: + case SpvOpGroupNonUniformBroadcastFirst: ++w; + case SpvOpSubgroupFirstInvocationKHR: vtn_build_subgroup_instr(b, nir_intrinsic_read_first_invocation, - val->ssa, vtn_ssa_value(b, w[4]), NULL, 0, 0); + val->ssa, vtn_ssa_value(b, w[3]), NULL, 0, 0); break; - case SpvOpGroupNonUniformBroadcast: + case SpvOpGroupNonUniformBroadcast: ++w; + case SpvOpSubgroupReadInvocationKHR: vtn_build_subgroup_instr(b, nir_intrinsic_read_invocation, - val->ssa, vtn_ssa_value(b, w[4]), - vtn_ssa_value(b, w[5])->def, 0, 0); + val->ssa, vtn_ssa_value(b, w[3]), + vtn_ssa_value(b, w[4])->def, 0, 0); break; case SpvOpGroupNonUniformAll: -- 2.30.2