<div dir="ltr"><div><div>I'm not terribly happy with how this worked out, I'm not going to NAK it as I think it's the best we can do at the moment.<br><br></div>The reason why Connor (and others) have chosen to emit these things at the top of the shader is because they frequently require some computation and we don't want to duplicate that if we don't have to. However, it also leads to variables with very long live ranges which we don't want either. Once we have GVN, we can value-number system value intrinsics. This will ensure that we only do the (potentially expensive) caluculation once and GCM will ensure that they land as far down the program as we can put them. However, until we have GVN, this seems like as good as we're going to get at the moment.<br></div>--Jason<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 9, 2015 at 1:58 AM, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
---<br>
src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 51 ++++++++++++++++++++++++++++++++<br>
1 file changed, 51 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
index c5ed55c..d700523 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp<br>
@@ -363,6 +363,30 @@ emit_system_values_block(nir_block *block, void *void_visitor)<br>
<br>
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);<br>
switch (intrin->intrinsic) {<br>
+ case nir_intrinsic_load_vertex_id:<br>
+ unreachable("should be lowered by lower_vertex_id().");<br>
+<br>
+ case nir_intrinsic_load_vertex_id_zero_base:<br>
+ assert(v->stage == MESA_SHADER_VERTEX);<br>
+ reg = &v->nir_system_values[SYSTEM_VALUE_VERTEX_ID_ZERO_BASE];<br>
+ if (reg->file == BAD_FILE)<br>
+ *reg = *v->emit_vs_system_value(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE);<br>
+ break;<br>
+<br>
+ case nir_intrinsic_load_base_vertex:<br>
+ assert(v->stage == MESA_SHADER_VERTEX);<br>
+ reg = &v->nir_system_values[SYSTEM_VALUE_BASE_VERTEX];<br>
+ if (reg->file == BAD_FILE)<br>
+ *reg = *v->emit_vs_system_value(SYSTEM_VALUE_BASE_VERTEX);<br>
+ break;<br>
+<br>
+ case nir_intrinsic_load_instance_id:<br>
+ assert(v->stage == MESA_SHADER_VERTEX);<br>
+ reg = &v->nir_system_values[SYSTEM_VALUE_INSTANCE_ID];<br>
+ if (reg->file == BAD_FILE)<br>
+ *reg = *v->emit_vs_system_value(SYSTEM_VALUE_INSTANCE_ID);<br>
+ break;<br>
+<br>
case nir_intrinsic_load_sample_pos:<br>
assert(v->stage == MESA_SHADER_FRAGMENT);<br>
reg = &v->nir_system_values[SYSTEM_VALUE_SAMPLE_POS];<br>
@@ -1344,6 +1368,33 @@ fs_visitor::nir_emit_intrinsic(nir_intrinsic_instr *instr)<br>
*emit_frontfacing_interpolation()));<br>
break;<br>
<br>
+ case nir_intrinsic_load_vertex_id:<br>
+ unreachable("should be lowered by lower_vertex_id()");<br>
+<br>
+ case nir_intrinsic_load_vertex_id_zero_base: {<br>
+ fs_reg vertex_id = nir_system_values[SYSTEM_VALUE_VERTEX_ID_ZERO_BASE];<br>
+ assert(vertex_id.file != BAD_FILE);<br>
+ dest.type = vertex_id.type;<br>
+ emit(MOV(dest, vertex_id));<br>
+ break;<br>
+ }<br>
+<br>
+ case nir_intrinsic_load_base_vertex: {<br>
+ fs_reg base_vertex = nir_system_values[SYSTEM_VALUE_BASE_VERTEX];<br>
+ assert(base_vertex.file != BAD_FILE);<br>
+ dest.type = base_vertex.type;<br>
+ emit(MOV(dest, base_vertex));<br>
+ break;<br>
+ }<br>
+<br>
+ case nir_intrinsic_load_instance_id: {<br>
+ fs_reg instance_id = nir_system_values[SYSTEM_VALUE_INSTANCE_ID];<br>
+ assert(instance_id.file != BAD_FILE);<br>
+ dest.type = instance_id.type;<br>
+ emit(MOV(dest, instance_id));<br>
+ break;<br>
+ }<br>
+<br>
case nir_intrinsic_load_sample_mask_in: {<br>
fs_reg sample_mask_in = nir_system_values[SYSTEM_VALUE_SAMPLE_MASK_IN];<br>
assert(sample_mask_in.file != BAD_FILE);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.2.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>