[Mesa-dev] [PATCHv4 4/7] nir: add shader_clock intrinsic
Emil Velikov
emil.l.velikov at gmail.com
Tue Oct 20 09:55:38 PDT 2015
v2: Add flags and inline comment/description.
v3: None of the input/outputs are variables
v4: Drop clockARB reference, relate code motion barrier comment wrt
intrinsic flag.
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
---
Matt,
Hopefully the updated comment makes more sense (the clockARB
reference was an unintentional left over). If not I'll just nuke it as
you suggested.
-Emil
src/glsl/nir/glsl_to_nir.cpp | 6 ++++++
src/glsl/nir/nir_intrinsics.h | 9 +++++++++
2 files changed, 15 insertions(+)
diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp
index cf5bb93..9dd3d07 100644
--- a/src/glsl/nir/glsl_to_nir.cpp
+++ b/src/glsl/nir/glsl_to_nir.cpp
@@ -685,6 +685,8 @@ nir_visitor::visit(ir_call *ir)
op = nir_intrinsic_ssbo_atomic_exchange;
} else if (strcmp(ir->callee_name(), "__intrinsic_ssbo_atomic_comp_swap_internal") == 0) {
op = nir_intrinsic_ssbo_atomic_comp_swap;
+ } else if (strcmp(ir->callee_name(), "__intrinsic_shader_clock") == 0) {
+ op = nir_intrinsic_shader_clock;
} else {
unreachable("not reached");
}
@@ -789,6 +791,10 @@ nir_visitor::visit(ir_call *ir)
case nir_intrinsic_memory_barrier:
nir_instr_insert_after_cf_list(this->cf_node_list, &instr->instr);
break;
+ case nir_intrinsic_shader_clock:
+ nir_ssa_dest_init(&instr->instr, &instr->dest, 1, NULL);
+ nir_instr_insert_after_cf_list(this->cf_node_list, &instr->instr);
+ break;
case nir_intrinsic_store_ssbo: {
exec_node *param = ir->actual_parameters.get_head();
ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
diff --git a/src/glsl/nir/nir_intrinsics.h b/src/glsl/nir/nir_intrinsics.h
index 49bf3b2..7485070 100644
--- a/src/glsl/nir/nir_intrinsics.h
+++ b/src/glsl/nir/nir_intrinsics.h
@@ -83,6 +83,15 @@ BARRIER(discard)
*/
BARRIER(memory_barrier)
+/*
+ * Shader clock intrinsic with semantics analogous to the clock2x32ARB()
+ * GLSL intrinsic.
+ * The latter can be used as code motion barrier, which is currently not
+ * feasible with NIR, thus we can eliminate the intrinsic when the return
+ * value is unused.
+ */
+INTRINSIC(shader_clock, 0, ARR(), true, 1, 0, 0, NIR_INTRINSIC_CAN_ELIMINATE)
+
/** A conditional discard, with a single boolean source. */
INTRINSIC(discard_if, 1, ARR(1), false, 0, 0, 0, 0)
--
2.6.1
More information about the mesa-dev
mailing list