Mesa (master): spirv: Implement SpvCapabilitySubgroupBufferBlockIOINTEL
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Nov 4 20:41:39 UTC 2020
Module: Mesa
Branch: master
Commit: eb03f29655cb6324ebf8016048fb9c21878eb1f5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=eb03f29655cb6324ebf8016048fb9c21878eb1f5
Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date: Mon Oct 5 14:49:15 2020 -0700
spirv: Implement SpvCapabilitySubgroupBufferBlockIOINTEL
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7448>
---
src/compiler/shader_info.h | 1 +
src/compiler/spirv/spirv_to_nir.c | 6 ++++++
src/compiler/spirv/vtn_variables.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 38 insertions(+)
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index 7f655bb6ca5..8d77d5c3b7a 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -95,6 +95,7 @@ struct spirv_supported_capabilities {
bool amd_image_gather_bias_lod;
bool intel_subgroup_shuffle;
+ bool intel_subgroup_buffer_block_io;
};
typedef struct shader_info {
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 6eb7b8f258d..0f89a78431a 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -4397,6 +4397,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
spv_check_supported(intel_subgroup_shuffle, cap);
break;
+ case SpvCapabilitySubgroupBufferBlockIOINTEL:
+ spv_check_supported(intel_subgroup_buffer_block_io, cap);
+ break;
+
default:
vtn_fail("Unhandled capability: %s (%u)",
spirv_capability_to_string(cap), cap);
@@ -5040,6 +5044,8 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
case SpvOpConvertUToPtr:
case SpvOpGenericCastToPtrExplicit:
case SpvOpGenericPtrMemSemantics:
+ case SpvOpSubgroupBlockReadINTEL:
+ case SpvOpSubgroupBlockWriteINTEL:
vtn_handle_variables(b, opcode, w, count);
break;
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 1cc5c2bf8cc..7307457df40 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -2424,6 +2424,37 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
break;
}
+ case SpvOpSubgroupBlockReadINTEL: {
+ struct vtn_type *res_type = vtn_get_type(b, w[1]);
+ nir_deref_instr *src = vtn_nir_deref(b, w[3]);
+
+ nir_intrinsic_instr *load =
+ nir_intrinsic_instr_create(b->nb.shader,
+ nir_intrinsic_load_deref_block_intel);
+ load->src[0] = nir_src_for_ssa(&src->dest.ssa);
+ nir_ssa_dest_init_for_type(&load->instr, &load->dest,
+ res_type->type, NULL);
+ load->num_components = load->dest.ssa.num_components;
+ nir_builder_instr_insert(&b->nb, &load->instr);
+
+ vtn_push_nir_ssa(b, w[2], &load->dest.ssa);
+ break;
+ }
+
+ case SpvOpSubgroupBlockWriteINTEL: {
+ nir_deref_instr *dest = vtn_nir_deref(b, w[1]);
+ nir_ssa_def *data = vtn_ssa_value(b, w[2])->def;
+
+ nir_intrinsic_instr *store =
+ nir_intrinsic_instr_create(b->nb.shader,
+ nir_intrinsic_store_deref_block_intel);
+ store->src[0] = nir_src_for_ssa(&dest->dest.ssa);
+ store->src[1] = nir_src_for_ssa(data);
+ store->num_components = data->num_components;
+ nir_builder_instr_insert(&b->nb, &store->instr);
+ break;
+ }
+
default:
vtn_fail_with_opcode("Unhandled opcode", opcode);
}
More information about the mesa-commit
mailing list