zink: generate flat_flags during shader creation
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 29 Mar 2023 20:53:52 +0000 (16:53 -0400)
committerMarge Bot <emma+marge@anholt.net>
Tue, 4 Apr 2023 01:37:40 +0000 (01:37 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22266>

src/gallium/drivers/zink/zink_compiler.c
src/gallium/drivers/zink/zink_program.c
src/gallium/drivers/zink/zink_types.h

index 7e818fe..7dddafc 100644 (file)
@@ -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);
index 407f10d..5cc5882 100644 (file)
@@ -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)
index 7379b90..4057f77 100644 (file)
@@ -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;