Mesa (master): spirv: use intrinsic builders
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Nov 26 18:11:47 UTC 2020
Module: Mesa
Branch: master
Commit: eafc7eee5799139538398389592800589182b1e3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=eafc7eee5799139538398389592800589182b1e3
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Mon Sep 7 14:16:57 2020 +0100
spirv: use intrinsic builders
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6587>
---
src/compiler/spirv/spirv_to_nir.c | 88 ++++++++++++--------------------------
src/compiler/spirv/vtn_amd.c | 7 +--
src/compiler/spirv/vtn_cfg.c | 46 ++++++--------------
src/compiler/spirv/vtn_variables.c | 8 +---
4 files changed, 44 insertions(+), 105 deletions(-)
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 8512ba61a61..990cff6b263 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -2401,7 +2401,8 @@ vtn_emit_scoped_control_barrier(struct vtn_builder *b, SpvScope exec_scope,
else
nir_mem_scope = vtn_scope_to_nir_scope(b, mem_scope);
- nir_scoped_barrier(&b->nb, nir_exec_scope, nir_mem_scope, nir_semantics, modes);
+ nir_scoped_barrier(&b->nb, .execution_scope=nir_exec_scope, .memory_scope=nir_mem_scope,
+ .memory_semantics=nir_semantics, .memory_modes=modes);
}
static void
@@ -2416,8 +2417,9 @@ vtn_emit_scoped_memory_barrier(struct vtn_builder *b, SpvScope scope,
if (nir_semantics == 0 || modes == 0)
return;
- nir_scope nir_mem_scope = vtn_scope_to_nir_scope(b, scope);
- nir_scoped_barrier(&b->nb, NIR_SCOPE_NONE, nir_mem_scope, nir_semantics, modes);
+ nir_scoped_barrier(&b->nb, .memory_scope=vtn_scope_to_nir_scope(b, scope),
+ .memory_semantics=nir_semantics,
+ .memory_modes=modes);
}
struct vtn_ssa_value *
@@ -3828,13 +3830,6 @@ vtn_handle_composite(struct vtn_builder *b, SpvOp opcode,
vtn_push_ssa_value(b, w[2], ssa);
}
-static void
-vtn_emit_barrier(struct vtn_builder *b, nir_intrinsic_op op)
-{
- nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(b->shader, op);
- nir_builder_instr_insert(&b->nb, &intrin->instr);
-}
-
void
vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope,
SpvMemorySemanticsMask semantics)
@@ -3862,7 +3857,7 @@ vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope,
return; /* Nothing to do here */
if (scope == SpvScopeWorkgroup) {
- vtn_emit_barrier(b, nir_intrinsic_group_memory_barrier);
+ nir_group_memory_barrier(&b->nb);
return;
}
@@ -3873,15 +3868,15 @@ vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope,
* semantic to the corresponding NIR one.
*/
if (util_bitcount(semantics & all_memory_semantics) > 1) {
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier);
+ nir_memory_barrier(&b->nb);
if (semantics & SpvMemorySemanticsOutputMemoryMask) {
/* GLSL memoryBarrier() (and the corresponding NIR one) doesn't include
* TCS outputs, so we have to emit it's own intrinsic for that. We
* then need to emit another memory_barrier to prevent moving
* non-output operations to before the tcs_patch barrier.
*/
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_tcs_patch);
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier);
+ nir_memory_barrier_tcs_patch(&b->nb);
+ nir_memory_barrier(&b->nb);
}
return;
}
@@ -3889,20 +3884,20 @@ vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope,
/* Issue a more specific barrier */
switch (semantics & all_memory_semantics) {
case SpvMemorySemanticsUniformMemoryMask:
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_buffer);
+ nir_memory_barrier_buffer(&b->nb);
break;
case SpvMemorySemanticsWorkgroupMemoryMask:
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_shared);
+ nir_memory_barrier_shared(&b->nb);
break;
case SpvMemorySemanticsAtomicCounterMemoryMask:
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_atomic_counter);
+ nir_memory_barrier_atomic_counter(&b->nb);
break;
case SpvMemorySemanticsImageMemoryMask:
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_image);
+ nir_memory_barrier_image(&b->nb);
break;
case SpvMemorySemanticsOutputMemoryMask:
if (b->nb.shader->info.stage == MESA_SHADER_TESS_CTRL)
- vtn_emit_barrier(b, nir_intrinsic_memory_barrier_tcs_patch);
+ nir_memory_barrier_tcs_patch(&b->nb);
break;
default:
break;
@@ -3918,36 +3913,22 @@ vtn_handle_barrier(struct vtn_builder *b, SpvOp opcode,
case SpvOpEmitStreamVertex:
case SpvOpEndPrimitive:
case SpvOpEndStreamPrimitive: {
- nir_intrinsic_op intrinsic_op;
+ unsigned stream = 0;
+ if (opcode == SpvOpEmitStreamVertex || opcode == SpvOpEndStreamPrimitive)
+ stream = vtn_constant_uint(b, w[1]);
+
switch (opcode) {
- case SpvOpEmitVertex:
case SpvOpEmitStreamVertex:
- intrinsic_op = nir_intrinsic_emit_vertex;
+ case SpvOpEmitVertex:
+ nir_emit_vertex(&b->nb, stream);
break;
case SpvOpEndPrimitive:
case SpvOpEndStreamPrimitive:
- intrinsic_op = nir_intrinsic_end_primitive;
+ nir_end_primitive(&b->nb, stream);
break;
default:
unreachable("Invalid opcode");
}
-
- nir_intrinsic_instr *intrin =
- nir_intrinsic_instr_create(b->shader, intrinsic_op);
-
- switch (opcode) {
- case SpvOpEmitStreamVertex:
- case SpvOpEndStreamPrimitive: {
- unsigned stream = vtn_constant_uint(b, w[1]);
- nir_intrinsic_set_stream_id(intrin, stream);
- break;
- }
-
- default:
- break;
- }
-
- nir_builder_instr_insert(&b->nb, &intrin->instr);
break;
}
@@ -4003,7 +3984,7 @@ vtn_handle_barrier(struct vtn_builder *b, SpvOp opcode,
vtn_emit_memory_barrier(b, memory_scope, memory_semantics);
if (execution_scope == SpvScopeWorkgroup)
- vtn_emit_barrier(b, nir_intrinsic_control_barrier);
+ nir_control_barrier(&b->nb);
}
break;
}
@@ -5511,27 +5492,20 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
break;
case SpvOpBeginInvocationInterlockEXT:
- vtn_emit_barrier(b, nir_intrinsic_begin_invocation_interlock);
+ nir_begin_invocation_interlock(&b->nb);
break;
case SpvOpEndInvocationInterlockEXT:
- vtn_emit_barrier(b, nir_intrinsic_end_invocation_interlock);
+ nir_end_invocation_interlock(&b->nb);
break;
case SpvOpDemoteToHelperInvocationEXT: {
- nir_intrinsic_instr *intrin =
- nir_intrinsic_instr_create(b->shader, nir_intrinsic_demote);
- nir_builder_instr_insert(&b->nb, &intrin->instr);
+ nir_demote(&b->nb);
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);
-
- vtn_push_nir_ssa(b, w[2], &intrin->dest.ssa);
+ vtn_push_nir_ssa(b, w[2], nir_is_helper_invocation(&b->nb, 1));
break;
}
@@ -5553,23 +5527,17 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
/* Operation supports two result types: uvec2 and uint64_t. The NIR
* intrinsic gives uvec2, so pack the result for the other case.
*/
- nir_intrinsic_instr *intrin =
- nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_shader_clock);
- nir_ssa_dest_init(&intrin->instr, &intrin->dest, 2, 32, NULL);
- nir_intrinsic_set_memory_scope(intrin, nir_scope);
- nir_builder_instr_insert(&b->nb, &intrin->instr);
+ nir_ssa_def *result = nir_shader_clock(&b->nb, nir_scope);
struct vtn_type *type = vtn_get_type(b, w[1]);
const struct glsl_type *dest_type = type->type;
- nir_ssa_def *result;
if (glsl_type_is_vector(dest_type)) {
assert(dest_type == glsl_vector_type(GLSL_TYPE_UINT, 2));
- result = &intrin->dest.ssa;
} else {
assert(glsl_type_is_scalar(dest_type));
assert(glsl_get_base_type(dest_type) == GLSL_TYPE_UINT64);
- result = nir_pack_64_2x32(&b->nb, &intrin->dest.ssa);
+ result = nir_pack_64_2x32(&b->nb, result);
}
vtn_push_nir_ssa(b, w[2], result);
diff --git a/src/compiler/spirv/vtn_amd.c b/src/compiler/spirv/vtn_amd.c
index 55000418dcd..e909ebf8051 100644
--- a/src/compiler/spirv/vtn_amd.c
+++ b/src/compiler/spirv/vtn_amd.c
@@ -39,12 +39,7 @@ vtn_handle_amd_gcn_shader_instruction(struct vtn_builder *b, SpvOp ext_opcode,
def = nir_cube_face_coord(&b->nb, vtn_get_nir_ssa(b, w[5]));
break;
case TimeAMD: {
- nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(b->nb.shader,
- nir_intrinsic_shader_clock);
- nir_ssa_dest_init(&intrin->instr, &intrin->dest, 2, 32, NULL);
- nir_intrinsic_set_memory_scope(intrin, NIR_SCOPE_SUBGROUP);
- nir_builder_instr_insert(&b->nb, &intrin->instr);
- def = nir_pack_64_2x32(&b->nb, &intrin->dest.ssa);
+ def = nir_pack_64_2x32(&b->nb, nir_shader_clock(&b->nb, NIR_SCOPE_SUBGROUP));
break;
}
default:
diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
index 4ab076dc029..6c024954244 100644
--- a/src/compiler/spirv/vtn_cfg.c
+++ b/src/compiler/spirv/vtn_cfg.c
@@ -959,35 +959,23 @@ vtn_emit_branch(struct vtn_builder *b, enum vtn_branch_type branch_type,
case vtn_branch_type_return:
nir_jump(&b->nb, nir_jump_return);
break;
- case vtn_branch_type_discard: {
- nir_intrinsic_op op =
- b->convert_discard_to_demote ? nir_intrinsic_demote : nir_intrinsic_discard;
- nir_intrinsic_instr *discard =
- nir_intrinsic_instr_create(b->nb.shader, op);
- nir_builder_instr_insert(&b->nb, &discard->instr);
+ case vtn_branch_type_discard:
+ if (b->convert_discard_to_demote)
+ nir_demote(&b->nb);
+ else
+ nir_discard(&b->nb);
break;
- }
- case vtn_branch_type_terminate_invocation: {
- nir_intrinsic_instr *terminate =
- nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_terminate);
- nir_builder_instr_insert(&b->nb, &terminate->instr);
+ case vtn_branch_type_terminate_invocation:
+ nir_terminate(&b->nb);
break;
- }
- case vtn_branch_type_ignore_intersection: {
- nir_intrinsic_instr *ignore =
- nir_intrinsic_instr_create(b->nb.shader,
- nir_intrinsic_ignore_ray_intersection);
- nir_builder_instr_insert(&b->nb, &ignore->instr);
+ case vtn_branch_type_ignore_intersection:
+ nir_ignore_ray_intersection(&b->nb);
nir_jump(&b->nb, nir_jump_halt);
break;
- }
- case vtn_branch_type_terminate_ray: {
- nir_intrinsic_instr *terminate =
- nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_terminate_ray);
- nir_builder_instr_insert(&b->nb, &terminate->instr);
+ case vtn_branch_type_terminate_ray:
+ nir_terminate_ray(&b->nb);
nir_jump(&b->nb, nir_jump_halt);
break;
- }
default:
vtn_fail("Invalid branch type");
}
@@ -1089,9 +1077,7 @@ vtn_emit_cf_list_structured(struct vtn_builder *b, struct list_head *cf_list,
vtn_foreach_instruction(b, block_start, block_end, handler);
- block->end_nop = nir_intrinsic_instr_create(b->nb.shader,
- nir_intrinsic_nop);
- nir_builder_instr_insert(&b->nb, &block->end_nop->instr);
+ block->end_nop = nir_nop(&b->nb);
vtn_emit_ret_store(b, block);
@@ -1280,9 +1266,7 @@ vtn_emit_cf_func_unstructured(struct vtn_builder *b, struct vtn_function *func,
block_start = vtn_foreach_instruction(b, block_start, block_end,
vtn_handle_phis_first_pass);
vtn_foreach_instruction(b, block_start, block_end, handler);
- block->end_nop = nir_intrinsic_instr_create(b->nb.shader,
- nir_intrinsic_nop);
- nir_builder_instr_insert(&b->nb, &block->end_nop->instr);
+ block->end_nop = nir_nop(&b->nb);
SpvOp op = *block_end & SpvOpCodeMask;
switch (op) {
@@ -1348,9 +1332,7 @@ vtn_emit_cf_func_unstructured(struct vtn_builder *b, struct vtn_function *func,
}
case SpvOpKill: {
- nir_intrinsic_instr *discard =
- nir_intrinsic_instr_create(b->nb.shader, nir_intrinsic_discard);
- nir_builder_instr_insert(&b->nb, &discard->instr);
+ nir_discard(&b->nb);
nir_goto(&b->nb, b->func->impl->end_block);
break;
}
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index f874ab3f05a..3547490e391 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -2446,13 +2446,7 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
vtn_assert(ptr->block_index);
}
- nir_intrinsic_instr *instr =
- nir_intrinsic_instr_create(b->nb.shader,
- nir_intrinsic_get_ssbo_size);
- instr->src[0] = nir_src_for_ssa(ptr->block_index);
- nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
- nir_builder_instr_insert(&b->nb, &instr->instr);
- nir_ssa_def *buf_size = &instr->dest.ssa;
+ nir_ssa_def *buf_size = nir_get_ssbo_size(&b->nb, ptr->block_index);
/* array_length = max(buffer_size - offset, 0) / stride */
nir_ssa_def *array_length =
More information about the mesa-commit
mailing list