zink: lower away fdph
[mesa.git] / src / gallium / drivers / zink / zink_compiler.c
index e243166e23d5963aa37b9727ab2f4c40cfddf52b..5c20c7b297fd0976c21e40dfc264ea098333675a 100644 (file)
@@ -116,57 +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
-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);
-         }
-
-         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)
 {
@@ -215,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,
@@ -260,12 +210,6 @@ optimize_nir(struct nir_shader *s)
    } while (progress);
 }
 
-static int
-glsl_type_size(const struct glsl_type *type, bool bindless)
-{
-   return glsl_count_attribute_slots(type, false);
-}
-
 static uint32_t
 zink_binding(enum pipe_shader_type stage, VkDescriptorType type, int index)
 {
@@ -295,14 +239,13 @@ zink_compile_nir(struct zink_screen *screen, struct nir_shader *nir)
 {
    struct zink_shader *ret = CALLOC_STRUCT(zink_shader);
 
-   NIR_PASS_V(nir, nir_lower_io, nir_var_all, glsl_type_size, (nir_lower_io_options)0);
    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);
+   NIR_PASS_V(nir, nir_convert_from_ssa, true);
 
    if (zink_debug & ZINK_DEBUG_NIR) {
       fprintf(stderr, "NIR shader:\n---8<---\n");
@@ -314,21 +257,35 @@ 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++;
+         }
       }
    }
 
+   ret->info = nir->info;
+
    struct spirv_shader *spirv = nir_to_spirv(nir);
    assert(spirv);