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

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Mar 29 16:53:52 2023 -0400

zink: generate flat_flags during shader creation

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

---

 src/gallium/drivers/zink/zink_compiler.c | 14 ++++++++++++++
 src/gallium/drivers/zink/zink_program.c  | 14 +-------------
 src/gallium/drivers/zink/zink_types.h    |  1 +
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 7e818fe88dc..7dddafc9c82 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -4661,6 +4661,18 @@ fixup_io_locations(nir_shader *nir)
    return true;
 }
 
+static uint32_t
+zink_flat_flags(struct nir_shader *shader)
+{
+   uint32_t flat_flags = 0, c = 0;
+   nir_foreach_shader_in_variable(var, shader) {
+      if (var->data.interpolation == INTERP_MODE_FLAT)
+         flat_flags |= 1u << (c++);
+   }
+
+   return flat_flags;
+}
+
 struct zink_shader *
 zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
                    const struct pipe_stream_output_info *so_info)
@@ -4697,6 +4709,8 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
 
    if (nir->info.stage < MESA_SHADER_FRAGMENT)
       have_psiz = check_psiz(nir);
+   if (nir->info.stage == MESA_SHADER_FRAGMENT)
+      ret->flat_flags = zink_flat_flags(nir);
 
    if (!gl_shader_stage_is_compute(nir->info.stage) && 
nir->info.separate_shader)
       NIR_PASS_V(nir, fixup_io_locations);
diff --git a/src/gallium/drivers/zink/zink_program.c 
b/src/gallium/drivers/zink/zink_program.c
index 407f10dba37..5cc5882456c 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -2224,18 +2224,6 @@ zink_add_inline_uniform(nir_shader *shader, int offset)
    ++shader->info.num_inlinable_uniforms;
 }
 
-static uint32_t
-zink_flat_flags(struct nir_shader *shader)
-{
-   uint32_t flat_flags = 0, c = 0;
-   nir_foreach_shader_in_variable(var, shader) {
-      if (var->data.interpolation == INTERP_MODE_FLAT)
-         flat_flags |= 1u << (c++);
-   }
-
-   return flat_flags;
-}
-
 static unsigned
 encode_lower_pv_mode(enum pipe_prim_type prim_type)
 {
@@ -2353,7 +2341,7 @@ zink_set_primitive_emulation_keys(struct zink_context 
*ctx)
       }
 
       ctx->base.set_inlinable_constants(&ctx->base, MESA_SHADER_GEOMETRY, 2,
-                                        (uint32_t 
[]){zink_flat_flags(ctx->gfx_stages[MESA_SHADER_FRAGMENT]->nir),
+                                        (uint32_t 
[]){ctx->gfx_stages[MESA_SHADER_FRAGMENT]->flat_flags,
                                                       
ctx->gfx_pipeline_state.dyn_state3.pv_last});
    } else if (ctx->gfx_stages[MESA_SHADER_GEOMETRY] &&
               ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated)
diff --git a/src/gallium/drivers/zink/zink_types.h 
b/src/gallium/drivers/zink/zink_types.h
index 7379b90bb47..4057f775147 100644
--- a/src/gallium/drivers/zink/zink_types.h
+++ b/src/gallium/drivers/zink/zink_types.h
@@ -748,6 +748,7 @@ struct zink_shader {
    unsigned num_texel_buffers;
    uint32_t ubos_used; // bitfield of which ubo indices are used
    uint32_t ssbos_used; // bitfield of which ssbo indices are used
+   uint32_t flat_flags;
    bool bindless;
    bool can_inline;
    bool has_uniforms;

Reply via email to