Module: Mesa
Branch: master
Commit: 440cd835de6f0555812f2ddecb5abf42bf32991a
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=440cd835de6f0555812f2ddecb5abf42bf32991a

Author: Jonathan Marek <[email protected]>
Date:   Sun Dec  8 18:16:34 2019 -0500

etnaviv: add missing vs_needs_z_div handling to NIR backend

Signed-off-by: Jonathan Marek <[email protected]>
Reviewed-by: Christian Gmeiner <[email protected]>

---

 src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c 
b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
index 4cf48b46e78..c481b890456 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_nir.c
@@ -96,10 +96,30 @@ etna_lower_io(nir_shader *shader, struct 
etna_shader_variant *v)
                                                  ssa->parent_instr);
                } break;
                case nir_intrinsic_store_deref: {
+                  nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
+                  if (shader->info.stage == MESA_SHADER_VERTEX &&
+                      v->shader->specs->vs_need_z_div &&
+                      deref->var->data.location == VARYING_SLOT_POS) {
+
+                     assert(deref->deref_type == nir_deref_type_var);
+
+                     b.cursor = nir_before_instr(instr);
+
+                     nir_ssa_def *out[4];
+                     out[0] = nir_channel(&b, intr->src[1].ssa, 0);
+                     out[1] = nir_channel(&b, intr->src[1].ssa, 1);
+                     out[2] = nir_fmul_imm(&b, nir_fadd(&b, nir_channel(&b, 
intr->src[1].ssa, 2),
+                                                        nir_channel(&b, 
intr->src[1].ssa, 3)),
+                                           0.5f);
+                     out[3] = nir_channel(&b, intr->src[1].ssa, 3);
+
+                     nir_instr_rewrite_src(instr, &intr->src[1],
+                                           nir_src_for_ssa(nir_vec(&b, out, 
4)));
+                  }
+
                   if (shader->info.stage != MESA_SHADER_FRAGMENT || 
!v->key.frag_rb_swap)
                      break;
 
-                  nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
                   assert(deref->deref_type == nir_deref_type_var);
 
                   if (deref->var->data.location != FRAG_RESULT_COLOR &&

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to