zink: unified `zink_set_primitive_emulation_keys` and `zink_create_primitive_emulatio...
authorantonino <antonino.maniscalco@collabora.com>
Wed, 8 Mar 2023 17:25:02 +0000 (18:25 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 19:18:40 +0000 (19:18 +0000)
Those two functions shared most of the code

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21238>

src/gallium/drivers/zink/zink_draw.cpp
src/gallium/drivers/zink/zink_program.c

index 5ab37b2..f3e9afd 100644 (file)
@@ -511,10 +511,7 @@ zink_draw(struct pipe_context *pctx,
    ctx->gfx_pipeline_state.gfx_prim_mode = mode;
 
    if ((mode_changed || prim_changed || rast_state_changed || ctx->gfx_pipeline_state.modules_changed)) {
-      if (screen->optimal_keys)
-         zink_create_primitive_emulation_gs(ctx);
-      else
-         zink_set_primitive_emulation_keys(ctx);
+      zink_set_primitive_emulation_keys(ctx);
    }
 
    if (index_size) {
index fc717f8..8a911b1 100644 (file)
@@ -2249,26 +2249,39 @@ void
 zink_set_primitive_emulation_keys(struct zink_context *ctx)
 {
    struct zink_screen *screen = zink_screen(ctx->base.screen);
-   bool lower_line_stipple = ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES &&
-                             screen->driver_workarounds.no_linestipple &&
-                             ctx->rast_state->base.line_stipple_enable &&
-                             !ctx->num_so_targets;
+   bool lower_line_stipple = false, lower_line_smooth = false;
+   if (!screen->optimal_keys) {
+      lower_line_stipple = ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES &&
+                                screen->driver_workarounds.no_linestipple &&
+                                ctx->rast_state->base.line_stipple_enable &&
+                                !ctx->num_so_targets;
+
+      bool lower_point_smooth = ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_POINTS &&
+                                screen->driconf.emulate_point_smooth &&
+                                ctx->rast_state->base.point_smooth;
+      if (zink_get_fs_key(ctx)->lower_line_stipple != lower_line_stipple) {
+         assert(zink_get_gs_key(ctx)->lower_line_stipple ==
+                zink_get_fs_key(ctx)->lower_line_stipple);
+         zink_set_fs_key(ctx)->lower_line_stipple = lower_line_stipple;
+         zink_set_gs_key(ctx)->lower_line_stipple = lower_line_stipple;
+      }
 
-   bool lower_point_smooth = ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_POINTS &&
-                             screen->driconf.emulate_point_smooth &&
-                             ctx->rast_state->base.point_smooth;
+      lower_line_smooth = screen->driver_workarounds.no_linesmooth &&
+                               ctx->rast_state->base.line_smooth &&
+                               !ctx->num_so_targets;
 
-   if (zink_get_fs_key(ctx)->lower_line_stipple != lower_line_stipple) {
-      assert(zink_get_gs_key(ctx)->lower_line_stipple ==
-             zink_get_fs_key(ctx)->lower_line_stipple);
-      zink_set_fs_key(ctx)->lower_line_stipple = lower_line_stipple;
-      zink_set_gs_key(ctx)->lower_line_stipple = lower_line_stipple;
-   }
+      if (zink_get_fs_key(ctx)->lower_line_smooth != lower_line_smooth) {
+         assert(zink_get_gs_key(ctx)->lower_line_smooth ==
+                zink_get_fs_key(ctx)->lower_line_smooth);
+         zink_set_fs_key(ctx)->lower_line_smooth = lower_line_smooth;
+         zink_set_gs_key(ctx)->lower_line_smooth = lower_line_smooth;
+      }
 
-   bool lower_line_smooth = ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES &&
-                            screen->driver_workarounds.no_linesmooth &&
-                            ctx->rast_state->base.line_smooth &&
-                            !ctx->num_so_targets;
+      if (zink_get_fs_key(ctx)->lower_point_smooth != lower_point_smooth) {
+         zink_set_fs_key(ctx)->lower_point_smooth = lower_point_smooth;
+      }
+
+   }
 
    bool lower_edge_flags = has_edge_flags(ctx);
 
@@ -2277,16 +2290,6 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
    bool lower_filled_quad =  lower_quad_prim &&
       ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_TRIANGLES;
 
-   if (zink_get_fs_key(ctx)->lower_line_smooth != lower_line_smooth) {
-      assert(zink_get_gs_key(ctx)->lower_line_smooth ==
-             zink_get_fs_key(ctx)->lower_line_smooth);
-      zink_set_fs_key(ctx)->lower_line_smooth = lower_line_smooth;
-      zink_set_gs_key(ctx)->lower_line_smooth = lower_line_smooth;
-   }
-
-   if (zink_get_fs_key(ctx)->lower_point_smooth != lower_point_smooth) {
-      zink_set_fs_key(ctx)->lower_point_smooth = lower_point_smooth;
-   }
 
    if (lower_line_stipple || lower_line_smooth ||
        lower_edge_flags || lower_quad_prim ||
@@ -2302,7 +2305,6 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
 
       if (!ctx->gfx_stages[MESA_SHADER_GEOMETRY] ||
           (ctx->gfx_stages[MESA_SHADER_GEOMETRY]->nir->info.gs.input_primitive != ctx->gfx_pipeline_state.gfx_prim_mode)) {
-         assert(!screen->optimal_keys);
 
          if (!ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]) {
             nir_shader *nir;
@@ -2344,67 +2346,3 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
               ctx->gfx_stages[MESA_SHADER_GEOMETRY]->non_fs.is_generated)
          bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, NULL);
 }
-
-void
-zink_create_primitive_emulation_gs(struct zink_context *ctx)
-{
-   struct zink_screen *screen = zink_screen(ctx->base.screen);
-   bool lower_edge_flags = has_edge_flags(ctx);
-
-   bool lower_quad_prim = ctx->gfx_pipeline_state.gfx_prim_mode == PIPE_PRIM_QUADS;
-
-   bool lower_filled_quad =  lower_quad_prim &&
-      ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_TRIANGLES;
-
-   if (lower_edge_flags | lower_quad_prim) {
-      enum pipe_shader_type prev_vertex_stage =
-         ctx->gfx_stages[MESA_SHADER_TESS_EVAL] ?
-            MESA_SHADER_TESS_EVAL : MESA_SHADER_VERTEX;
-      enum zink_rast_prim zink_prim_type =
-         zink_rast_prim_for_pipe(ctx->gfx_pipeline_state.rast_prim);
-
-      //when using transform feedback primitives must be tessellated
-      lower_filled_quad |= lower_quad_prim && ctx->gfx_stages[prev_vertex_stage]->nir->info.has_transform_feedback_varyings;
-
-      if (!ctx->gfx_stages[MESA_SHADER_GEOMETRY] ||
-          (ctx->gfx_stages[MESA_SHADER_GEOMETRY]->nir->info.gs.input_primitive != ctx->gfx_pipeline_state.gfx_prim_mode)) {
-
-         if (!ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]) {
-            nir_shader *nir;
-            if (lower_filled_quad) {
-               nir = zink_create_quads_emulation_gs(
-                  &screen->nir_options,
-                  ctx->gfx_stages[prev_vertex_stage]->nir,
-                  ZINK_INLINE_VAL_PV_LAST_VERT * 4);
-            } else {
-               nir = nir_create_passthrough_gs(
-                  &screen->nir_options,
-                  ctx->gfx_stages[prev_vertex_stage]->nir,
-                  ctx->gfx_pipeline_state.gfx_prim_mode,
-                  ZINK_INLINE_VAL_FLAT_MASK * 4,
-                  ZINK_INLINE_VAL_PV_LAST_VERT * 4,
-                  lower_edge_flags,
-                  lower_quad_prim);
-            }
-
-            zink_add_inline_uniform(nir, ZINK_INLINE_VAL_FLAT_MASK);
-            zink_add_inline_uniform(nir, ZINK_INLINE_VAL_PV_LAST_VERT);
-            struct zink_shader *shader = zink_shader_create(screen, nir, &ctx->gfx_stages[prev_vertex_stage]->sinfo.so_info);
-            shader->needs_inlining = true;
-            ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type] = shader;
-            shader->non_fs.is_generated = true;
-            shader->can_inline = true;
-         }
-
-         bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY,
-                        ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type]);
-         ctx->is_generated_gs_bound = true;
-      }
-
-      ctx->base.set_inlinable_constants(&ctx->base, MESA_SHADER_GEOMETRY, 2,
-                                        (uint32_t []){zink_flat_flags(ctx->gfx_stages[MESA_SHADER_FRAGMENT]->nir),
-                                                      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)
-         bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY, NULL);
-}