zink: simplify gl-to-vulkan lowering
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 9 Oct 2019 09:25:50 +0000 (11:25 +0200)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Mon, 28 Oct 2019 08:51:48 +0000 (08:51 +0000)
Acked-by: Jordan Justen <jordan.l.justen@intel.com>
src/gallium/drivers/zink/zink_compiler.c

index d5c9a42b29c427d3a6fdf301ca8a133d25a3609a..d08b82a8ce9ee3638762006915f34d8c3972702c 100644 (file)
@@ -117,67 +117,43 @@ lower_uniforms_to_ubo(nir_shader *shader)
 }
 
 static void
-lower_store_output(nir_builder *b,
-                   struct nir_instr *instr)
+lower_pos_write(nir_builder *b, struct nir_instr *instr)
 {
    if (instr->type != nir_instr_type_intrinsic)
       return;
 
    nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
-   if (intr->intrinsic != nir_intrinsic_store_output)
-      return;
-
-   if (nir_intrinsic_base(intr) != VARYING_SLOT_POS)
-      return;
-
-   b->cursor = nir_before_instr(&intr->instr);
-
-   nir_ssa_def *src = nir_ssa_for_src(b, intr->src[0], 4);
-   nir_ssa_def *def = nir_vec4(b,
-                               nir_channel(b, src, 0),
-                               nir_channel(b, src, 1),
-                               nir_fmul(b,
-                                        nir_fadd(b,
-                                                 nir_channel(b, src, 2),
-                                                 nir_channel(b, src, 3)),
-                                        nir_imm_float(b, 0.5)),
-                               nir_channel(b, src, 3));
-   nir_instr_rewrite_src(&intr->instr, &intr->src[0], nir_src_for_ssa(def));
-}
-
-static void
-lower_store_deref(nir_builder *b,
-                  struct nir_instr *instr)
-{
-   if (instr->type != nir_instr_type_intrinsic)
-      return;
-
-   nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
-   if (intr->intrinsic != nir_intrinsic_store_deref)
-      return;
-
-   nir_variable *var = nir_intrinsic_get_var(intr, 0);
-   if (var->data.mode != nir_var_shader_out ||
-       var->data.location != VARYING_SLOT_POS)
+   struct nir_src *src;
+   if (intr->intrinsic == nir_intrinsic_store_output) {
+      if (nir_intrinsic_base(intr) != VARYING_SLOT_POS)
+         return;
+      src = &intr->src[0];
+   } else if (intr->intrinsic == nir_intrinsic_store_deref) {
+      nir_variable *var = nir_intrinsic_get_var(intr, 0);
+      if (var->data.mode != nir_var_shader_out ||
+          var->data.location != VARYING_SLOT_POS)
+         return;
+      src = &intr->src[1];
+   } else
       return;
 
    b->cursor = nir_before_instr(&intr->instr);
 
-   nir_ssa_def *src = nir_ssa_for_src(b, intr->src[1], 4);
+   nir_ssa_def *pos = nir_ssa_for_src(b, *src, 4);
    nir_ssa_def *def = nir_vec4(b,
-                               nir_channel(b, src, 0),
-                               nir_channel(b, src, 1),
+                               nir_channel(b, pos, 0),
+                               nir_channel(b, pos, 1),
                                nir_fmul(b,
                                         nir_fadd(b,
-                                                 nir_channel(b, src, 2),
-                                                 nir_channel(b, src, 3)),
+                                                 nir_channel(b, pos, 2),
+                                                 nir_channel(b, pos, 3)),
                                         nir_imm_float(b, 0.5)),
-                               nir_channel(b, src, 3));
-   nir_instr_rewrite_src(&intr->instr, &intr->src[1], nir_src_for_ssa(def));
+                               nir_channel(b, pos, 3));
+   nir_instr_rewrite_src(&intr->instr, src, nir_src_for_ssa(def));
 }
 
 static void
-position_to_vulkan(nir_shader *s)
+lower_clip_halfz(nir_shader *s)
 {
    if (s->info.stage != MESA_SHADER_VERTEX)
       return;
@@ -189,8 +165,7 @@ position_to_vulkan(nir_shader *s)
 
          nir_foreach_block(block, function->impl) {
             nir_foreach_instr_safe(instr, block) {
-               lower_store_output(&b, instr);
-               lower_store_deref(&b, instr);
+               lower_pos_write(&b, instr);
             }
          }
 
@@ -323,7 +298,7 @@ zink_compile_nir(struct zink_screen *screen, struct nir_shader *nir)
    struct zink_shader *ret = CALLOC_STRUCT(zink_shader);
 
    NIR_PASS_V(nir, lower_uniforms_to_ubo);
-   NIR_PASS_V(nir, position_to_vulkan);
+   NIR_PASS_V(nir, lower_clip_halfz);
    NIR_PASS_V(nir, nir_lower_regs_to_ssa);
    optimize_nir(nir);
    NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp);