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

Author: Giancarlo Devich <[email protected]>
Date:   Fri Feb 24 11:30:07 2023 -0800

d3d12: Don't recompute has_flat_varyings or missing_dual_src_outputs

Per shader selection, these two flags can be expensive to compute.
Instead, recompute their values as neccessary, and save them in the
context.

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

---

 src/gallium/drivers/d3d12/d3d12_compiler.cpp | 15 +++++++++------
 src/gallium/drivers/d3d12/d3d12_compiler.h   |  6 ++++++
 src/gallium/drivers/d3d12/d3d12_context.cpp  | 13 ++++++++++++-
 src/gallium/drivers/d3d12/d3d12_context.h    |  3 +++
 4 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp 
b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
index 99bfc78b3f7..b56b4986102 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp
@@ -250,14 +250,17 @@ struct d3d12_selection_context {
    const unsigned *variable_workgroup_size;
 };
 
-static unsigned
+unsigned
 missing_dual_src_outputs(struct d3d12_context *ctx)
 {
-   if (!ctx->gfx_pipeline_state.blend->is_dual_src)
+   if (!ctx->gfx_pipeline_state.blend || 
!ctx->gfx_pipeline_state.blend->is_dual_src)
       return 0;
 
    struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
-   nir_shader *s = fs->initial;
+   if (!fs)
+      return 0;
+
+   const nir_shader *s = fs->initial;
 
    unsigned indices_seen = 0;
    nir_foreach_function(function, s) {
@@ -457,7 +460,7 @@ get_provoking_vertex(struct d3d12_selection_context 
*sel_ctx, bool *alternate, c
    return flatshade_first ? 0 : u_prim_vertex_count(mode)->min - 1;
 }
 
-static bool
+bool
 has_flat_varyings(struct d3d12_context *ctx)
 {
    struct d3d12_shader_selector *fs = ctx->gfx_stages[PIPE_SHADER_FRAGMENT];
@@ -481,7 +484,7 @@ static bool
 needs_vertex_reordering(struct d3d12_selection_context *sel_ctx, const struct 
pipe_draw_info *dinfo)
 {
    struct d3d12_context *ctx = sel_ctx->ctx;
-   bool flat = has_flat_varyings(ctx);
+   bool flat = ctx->has_flat_varyings;
    bool xfb = ctx->gfx_pipeline_state.num_so_targets > 0;
 
    if (fill_mode_lowered(ctx, dinfo) != PIPE_POLYGON_MODE_FILL)
@@ -1531,7 +1534,7 @@ d3d12_select_shader_variants(struct d3d12_context *ctx, 
const struct pipe_draw_i
    sel_ctx.cull_mode_lowered = cull_mode_lowered(ctx, 
sel_ctx.fill_mode_lowered);
    sel_ctx.provoking_vertex = get_provoking_vertex(&sel_ctx, 
&sel_ctx.alternate_tri, dinfo);
    sel_ctx.needs_vertex_reordering = needs_vertex_reordering(&sel_ctx, dinfo);
-   sel_ctx.missing_dual_src_outputs = missing_dual_src_outputs(ctx);
+   sel_ctx.missing_dual_src_outputs = ctx->missing_dual_src_outputs;
    sel_ctx.frag_result_color_lowering = frag_result_color_lowering(ctx);
    sel_ctx.manual_depth_range = manual_depth_range(ctx);
 
diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.h 
b/src/gallium/drivers/d3d12/d3d12_compiler.h
index 389501622b1..0ebc8cc642e 100644
--- a/src/gallium/drivers/d3d12/d3d12_compiler.h
+++ b/src/gallium/drivers/d3d12/d3d12_compiler.h
@@ -290,6 +290,12 @@ d3d12_tcs_variant_cache_destroy(struct d3d12_context *ctx);
 struct d3d12_shader_selector *
 d3d12_get_tcs_variant(struct d3d12_context *ctx, struct d3d12_tcs_variant_key 
*key);
 
+unsigned
+missing_dual_src_outputs(struct d3d12_context* ctx);
+
+bool
+has_flat_varyings(struct d3d12_context* ctx);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp 
b/src/gallium/drivers/d3d12/d3d12_context.cpp
index d3a0330cb5f..69943bdddf0 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -396,6 +396,11 @@ d3d12_bind_blend_state(struct pipe_context *pctx, void 
*blend_state)
    if (new_state == NULL || old_state == NULL ||
        new_state->blend_factor_flags != old_state->blend_factor_flags)
       ctx->state_dirty |= D3D12_DIRTY_BLEND_COLOR;
+
+   if (new_state == NULL)
+      ctx->missing_dual_src_outputs = false;
+   else if (new_state != NULL && (old_state == NULL || old_state->is_dual_src 
!= new_state->is_dual_src))
+      ctx->missing_dual_src_outputs = missing_dual_src_outputs(ctx);
 }
 
 static void
@@ -1124,8 +1129,11 @@ static void
 d3d12_bind_fs_state(struct pipe_context *pctx,
                     void *fss)
 {
-   bind_stage(d3d12_context(pctx), PIPE_SHADER_FRAGMENT,
+   struct d3d12_context* ctx = d3d12_context(pctx);
+   bind_stage(ctx, PIPE_SHADER_FRAGMENT,
               (struct d3d12_shader_selector *) fss);
+   ctx->has_flat_varyings = has_flat_varyings(ctx);
+   ctx->missing_dual_src_outputs = missing_dual_src_outputs(ctx);
 }
 
 static void
@@ -2505,6 +2513,9 @@ d3d12_context_create(struct pipe_screen *pscreen, void 
*priv, unsigned flags)
 
    ctx->gfx_pipeline_state.sample_mask = ~0;
 
+   ctx->has_flat_varyings = false;
+   ctx->missing_dual_src_outputs = false;
+
    d3d12_context_surface_init(&ctx->base);
    d3d12_context_resource_init(&ctx->base);
    d3d12_context_query_init(&ctx->base);
diff --git a/src/gallium/drivers/d3d12/d3d12_context.h 
b/src/gallium/drivers/d3d12/d3d12_context.h
index 7258b0c4eaf..460abfa7940 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.h
+++ b/src/gallium/drivers/d3d12/d3d12_context.h
@@ -238,6 +238,9 @@ struct d3d12_context {
    struct d3d12_shader_selector *gfx_stages[D3D12_GFX_SHADER_STAGES];
    struct d3d12_shader_selector *compute_state;
 
+   bool has_flat_varyings;
+   bool missing_dual_src_outputs;
+
    struct d3d12_gfx_pipeline_state gfx_pipeline_state;
    struct d3d12_compute_pipeline_state compute_pipeline_state;
    unsigned shader_dirty[PIPE_SHADER_TYPES];

Reply via email to