zink: lower away fdph
[mesa.git] / src / gallium / drivers / zink / zink_compiler.c
index afe93bff0ed937de732c9bf6b21efb0a37ffa1ac..5c20c7b297fd0976c21e40dfc264ea098333675a 100644 (file)
@@ -116,90 +116,6 @@ lower_uniforms_to_ubo(nir_shader *shader)
    return progress;
 }
 
-static void
-lower_store_output(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)
-      return;
-
-   b->cursor = nir_before_instr(&intr->instr);
-
-   nir_ssa_def *src = nir_ssa_for_src(b, intr->src[1], 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[1], nir_src_for_ssa(def));
-}
-
-static void
-position_to_vulkan(nir_shader *s)
-{
-   if (s->info.stage != MESA_SHADER_VERTEX)
-      return;
-
-   nir_foreach_function(function, s) {
-      if (function->impl) {
-         nir_builder b;
-         nir_builder_init(&b, function->impl);
-
-         nir_foreach_block(block, function->impl) {
-            nir_foreach_instr_safe(instr, block) {
-               lower_store_output(&b, instr);
-               lower_store_deref(&b, instr);
-            }
-         }
-
-         nir_metadata_preserve(function->impl, nir_metadata_block_index |
-                                               nir_metadata_dominance);
-      }
-   }
-}
-
 static bool
 lower_discard_if_instr(nir_intrinsic_instr *instr, nir_builder *b)
 {
@@ -248,6 +164,7 @@ lower_discard_if(nir_shader *shader)
 static const struct nir_shader_compiler_options nir_options = {
    .lower_all_io_to_temps = true,
    .lower_ffma = true,
+   .lower_fdph = true,
    .lower_flrp32 = true,
    .lower_fpow = true,
    .lower_fsat = true,
@@ -323,9 +240,8 @@ 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, nir_lower_clip_halfz);
    NIR_PASS_V(nir, nir_lower_regs_to_ssa);
-   NIR_PASS_V(nir, nir_lower_bool_to_float);
    optimize_nir(nir);
    NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp);
    NIR_PASS_V(nir, lower_discard_if);
@@ -341,18 +257,30 @@ zink_compile_nir(struct zink_screen *screen, struct nir_shader *nir)
 
    ret->num_bindings = 0;
    nir_foreach_variable(var, &nir->uniforms) {
-      if (glsl_type_is_sampler(var->type)) {
-         ret->bindings[ret->num_bindings].index = var->data.driver_location;
-         var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location);
-         ret->bindings[ret->num_bindings].binding = var->data.binding;
-         ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
-         ret->num_bindings++;
-      } else if (var->interface_type) {
+      if (var->data.mode == nir_var_mem_ubo) {
          ret->bindings[ret->num_bindings].index = var->data.binding;
          var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, var->data.binding);
          ret->bindings[ret->num_bindings].binding = var->data.binding;
          ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
          ret->num_bindings++;
+      } else {
+         assert(var->data.mode == nir_var_uniform);
+         if (glsl_type_is_array(var->type) &&
+             glsl_type_is_sampler(glsl_get_array_element(var->type))) {
+            for (int i = 0; i < glsl_get_length(var->type); ++i) {
+               ret->bindings[ret->num_bindings].index = var->data.driver_location + i;
+               var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location + i);
+               ret->bindings[ret->num_bindings].binding = var->data.binding;
+               ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+               ret->num_bindings++;
+            }
+         } else if (glsl_type_is_sampler(var->type)) {
+            ret->bindings[ret->num_bindings].index = var->data.driver_location;
+            var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location);
+            ret->bindings[ret->num_bindings].binding = var->data.binding;
+            ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+            ret->num_bindings++;
+         }
       }
    }