summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaio Marcelo de Oliveira Filho <[email protected]>2019-06-07 23:08:04 -0700
committerCaio Marcelo de Oliveira Filho <[email protected]>2019-07-08 08:57:25 -0700
commit1a83c9a619dc8c7f50ad8f6381b178785c1b0099 (patch)
tree147d41b727374bfa6a3921bd98e673103c0d7681
parent5a7c69399d4800f6e7794177991bce2e9a967371 (diff)
spirv: Implement SPV_EXT_demote_to_helper_invocation
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r--src/compiler/shader_info.h1
-rw-r--r--src/compiler/spirv/spirv_to_nir.c26
2 files changed, 27 insertions, 0 deletions
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index 46588c327f9..f71b93e84d0 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -35,6 +35,7 @@ extern "C" {
struct spirv_supported_capabilities {
bool address;
bool atomic_storage;
+ bool demote_to_helper_invocation;
bool derivative_group;
bool descriptor_array_dynamic_indexing;
bool descriptor_array_non_uniform_indexing;
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index b9eb69c7247..3e88e54ab84 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -3718,6 +3718,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
spv_check_supported(fragment_shader_pixel_interlock, cap);
break;
+ case SpvCapabilityDemoteToHelperInvocationEXT:
+ spv_check_supported(demote_to_helper_invocation, cap);
+ break;
+
default:
vtn_fail("Unhandled capability: %s (%u)",
spirv_capability_to_string(cap), cap);
@@ -4532,6 +4536,28 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
vtn_emit_barrier(b, nir_intrinsic_end_invocation_interlock);
break;
+ case SpvOpDemoteToHelperInvocationEXT: {
+ nir_intrinsic_instr *intrin =
+ nir_intrinsic_instr_create(b->shader, nir_intrinsic_demote);
+ nir_builder_instr_insert(&b->nb, &intrin->instr);
+ break;
+ }
+
+ case SpvOpIsHelperInvocationEXT: {
+ nir_intrinsic_instr *intrin =
+ nir_intrinsic_instr_create(b->shader, nir_intrinsic_is_helper_invocation);
+ nir_ssa_dest_init(&intrin->instr, &intrin->dest, 1, 1, NULL);
+ nir_builder_instr_insert(&b->nb, &intrin->instr);
+
+ struct vtn_type *res_type =
+ vtn_value(b, w[1], vtn_value_type_type)->type;
+ struct vtn_ssa_value *val = vtn_create_ssa_value(b, res_type->type);
+ val->def = &intrin->dest.ssa;
+
+ vtn_push_ssa(b, w[2], res_type, val);
+ break;
+ }
+
default:
vtn_fail_with_opcode("Unhandled opcode", opcode);
}