Module: Mesa
Branch: main
Commit: 9af2f179372567bf1bdfc25c37c33b153384f76c
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9af2f179372567bf1bdfc25c37c33b153384f76c

Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Aug 29 11:20:02 2023 -0400

zink: create new vars without copying existing ones

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24950>

---

 src/gallium/drivers/zink/zink_compiler.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 28f350df87c..56789271219 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -3515,12 +3515,16 @@ add_derefs_instr(nir_builder *b, nir_intrinsic_instr 
*intr, void *data)
             nir_def *interp = intr->src[0].ssa;
             nir_intrinsic_instr *interp_intr = 
nir_instr_as_intrinsic(interp->parent_instr);
             assert(interp_intr);
+            var->data.interpolation = nir_intrinsic_interp_mode(interp_intr);
             switch (interp_intr->intrinsic) {
             case nir_intrinsic_load_barycentric_centroid:
                load = nir_interp_deref_at_centroid(b, intr->num_components, 
bit_size, &deref->def);
                break;
-            case nir_intrinsic_load_barycentric_pixel:
             case nir_intrinsic_load_barycentric_sample:
+               var->data.sample = 1;
+               load = nir_load_deref(b, deref);
+               break;
+            case nir_intrinsic_load_barycentric_pixel:
                load = nir_load_deref(b, deref);
                break;
             case nir_intrinsic_load_barycentric_at_sample:
@@ -5126,13 +5130,23 @@ rework_io_vars(nir_shader *nir, nir_variable_mode mode)
             assert(!vars[location][c] ||
                    
(nir_get_nir_type_for_glsl_base_type(glsl_get_base_type(glsl_without_array(vars[location][c]->type)))
 == type &&
                     
glsl_get_vector_elements(glsl_without_array(vars[location][c]->type)) >= 
intr->num_components));
-            nir_variable *var = nir_variable_clone(old_var, nir);
+            char name[1024];
+            if (c)
+               snprintf(name, sizeof(name), "slot_%u_c%u", location, c);
+            else
+               snprintf(name, sizeof(name), "slot_%u", location);
+            nir_variable *var = nir_variable_create(nir, mode, vec_type, 
old_var ? old_var->name : name);
             var->data.mode = mode;
             var->type = vec_type;
             var->data.driver_location = nir_intrinsic_base(intr) + slot_offset;
             var->data.location_frac = c;
             var->data.location = location;
-            nir_shader_add_variable(nir, var);
+            var->data.patch = location >= VARYING_SLOT_PATCH0;
+            /* set flat by default */
+            if (nir->info.stage == MESA_SHADER_FRAGMENT && mode == 
nir_var_shader_in)
+               var->data.interpolation = INTERP_MODE_FLAT;
+            var->data.fb_fetch_output = s.fb_fetch_output;
+            var->data.precision = s.medium_precision;
             store_location_var(vars, var, nir);
          }
       }

Reply via email to