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

Author: Jason Ekstrand <[email protected]>
Date:   Fri Nov 19 13:44:35 2021 -0600

intel/compiler: Convert wm_prog_key::multisample_fbo to a tri-state

This allows us to communicate to the back-end that we don't actually
know if the framebuffer is multisampled or not.  No drivers set anything
but ALWAYS/NEVER and we still have a few ALWAYS/NEVER assumptions but
those should be asserted.

Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21094>

---

 src/gallium/drivers/crocus/crocus_state.c |  5 +++--
 src/gallium/drivers/iris/iris_program.c   |  2 +-
 src/intel/blorp/blorp_blit.c              |  2 +-
 src/intel/blorp/blorp_clear.c             |  2 +-
 src/intel/compiler/brw_compiler.h         |  6 ++++--
 src/intel/compiler/brw_fs.cpp             | 19 ++++++++++++++++---
 src/intel/compiler/brw_fs_nir.cpp         |  2 ++
 src/intel/compiler/brw_nir.c              |  2 +-
 src/intel/vulkan/anv_pipeline.c           |  2 +-
 src/intel/vulkan_hasvk/anv_pipeline.c     |  2 +-
 10 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/crocus/crocus_state.c 
b/src/gallium/drivers/crocus/crocus_state.c
index 711d99d708f..2793ecfbd0f 100644
--- a/src/gallium/drivers/crocus/crocus_state.c
+++ b/src/gallium/drivers/crocus/crocus_state.c
@@ -4843,11 +4843,12 @@ crocus_populate_fs_key(const struct crocus_context *ice,
    key->flat_shade = rast->cso.flatshade &&
       (info->inputs_read & (VARYING_BIT_COL0 | VARYING_BIT_COL1));
 
-   key->multisample_fbo = rast->cso.multisample && fb->samples > 1;
+   const bool multisample_fbo = rast->cso.multisample && fb->samples > 1;
+   key->multisample_fbo = multisample_fbo ? BRW_ALWAYS : BRW_NEVER;
    key->persample_interp =
       rast->cso.force_persample_interp ? BRW_ALWAYS : BRW_NEVER;
 
-   key->ignore_sample_mask_out = !key->multisample_fbo;
+   key->ignore_sample_mask_out = !multisample_fbo;
    key->coherent_fb_fetch = false; // TODO: needed?
 
    key->force_dual_color_blend =
diff --git a/src/gallium/drivers/iris/iris_program.c 
b/src/gallium/drivers/iris/iris_program.c
index 3a1c023b64b..ffda6797033 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -160,7 +160,7 @@ iris_to_brw_fs_key(const struct iris_screen *screen,
       .alpha_to_coverage = key->alpha_to_coverage,
       .clamp_fragment_color = key->clamp_fragment_color,
       .persample_interp = key->persample_interp ? BRW_ALWAYS : BRW_NEVER,
-      .multisample_fbo = key->multisample_fbo,
+      .multisample_fbo = key->multisample_fbo ? BRW_ALWAYS : BRW_NEVER,
       .force_dual_color_blend = key->force_dual_color_blend,
       .coherent_fb_fetch = key->coherent_fb_fetch,
       .color_outputs_valid = key->color_outputs_valid,
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 33a83f30230..1d0ca31cb49 100644
--- a/src/intel/blorp/blorp_blit.c
+++ b/src/intel/blorp/blorp_blit.c
@@ -1527,7 +1527,7 @@ brw_blorp_get_blit_kernel_fs(struct blorp_batch *batch,
 
    struct brw_wm_prog_key wm_key;
    brw_blorp_init_wm_prog_key(&wm_key);
-   wm_key.multisample_fbo = key->rt_samples > 1;
+   wm_key.multisample_fbo = key->rt_samples > 1 ? BRW_ALWAYS : BRW_NEVER;
 
    program = blorp_compile_fs(blorp, mem_ctx, nir, &wm_key, false,
                               &prog_data);
diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c
index 61581216f60..351e342d2b0 100644
--- a/src/intel/blorp/blorp_clear.c
+++ b/src/intel/blorp/blorp_clear.c
@@ -1371,7 +1371,7 @@ blorp_params_get_mcs_partial_resolve_kernel(struct 
blorp_batch *batch,
 
    struct brw_wm_prog_key wm_key;
    brw_blorp_init_wm_prog_key(&wm_key);
-   wm_key.multisample_fbo = true;
+   wm_key.multisample_fbo = BRW_ALWAYS;
 
    struct brw_wm_prog_data prog_data;
    const unsigned *program =
diff --git a/src/intel/compiler/brw_compiler.h 
b/src/intel/compiler/brw_compiler.h
index c45e1a84eb5..63562a266f3 100644
--- a/src/intel/compiler/brw_compiler.h
+++ b/src/intel/compiler/brw_compiler.h
@@ -500,14 +500,16 @@ struct brw_wm_prog_key {
     */
    enum brw_sometimes persample_interp:2;
 
-   bool multisample_fbo:1;
+   /* Whether or not we are running on a multisampled framebuffer */
+   enum brw_sometimes multisample_fbo:2;
+
    enum brw_sometimes line_aa:2;
    bool force_dual_color_blend:1;
    bool coherent_fb_fetch:1;
    bool ignore_sample_mask_out:1;
    bool coarse_pixel:1;
 
-   uint64_t padding:57;
+   uint64_t padding:56;
 };
 
 struct brw_cs_prog_key {
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp
index 85e21560414..ab37b87ec44 100644
--- a/src/intel/compiler/brw_fs.cpp
+++ b/src/intel/compiler/brw_fs.cpp
@@ -1273,12 +1273,13 @@ fs_visitor::emit_sampleid_setup()
 {
    assert(stage == MESA_SHADER_FRAGMENT);
    ASSERTED brw_wm_prog_key *key = (brw_wm_prog_key*) this->key;
+   struct brw_wm_prog_data *wm_prog_data = brw_wm_prog_data(this->prog_data);
    assert(devinfo->ver >= 6);
 
    const fs_builder abld = bld.annotate("compute sample id");
    fs_reg sample_id = abld.vgrf(BRW_REGISTER_TYPE_UD);
 
-   assert(key->multisample_fbo);
+   assert(key->multisample_fbo != BRW_NEVER);
 
    if (devinfo->ver >= 8) {
       /* Sample ID comes in as 4-bit numbers in g1.0:
@@ -1368,6 +1369,13 @@ fs_visitor::emit_sampleid_setup()
       abld.emit(FS_OPCODE_SET_SAMPLE_ID, sample_id, t1, t2);
    }
 
+   if (key->multisample_fbo == BRW_SOMETIMES) {
+      check_dynamic_msaa_flag(abld, wm_prog_data,
+                              BRW_WM_MSAA_FLAG_MULTISAMPLE_FBO);
+      set_predicate(BRW_PREDICATE_NORMAL,
+                    abld.SEL(sample_id, sample_id, brw_imm_ud(0)));
+   }
+
    return sample_id;
 }
 
@@ -7284,12 +7292,17 @@ brw_nir_populate_wm_prog_data(const nir_shader *shader,
       shader->info.fs.uses_sample_shading ||
       shader->info.outputs_read;
 
-   assert(key->multisample_fbo || key->persample_interp == BRW_NEVER);
+   assert(key->multisample_fbo != BRW_NEVER ||
+          key->persample_interp == BRW_NEVER);
 
    prog_data->persample_dispatch = key->persample_interp;
-   if (key->multisample_fbo && prog_data->sample_shading)
+   if (prog_data->sample_shading)
       prog_data->persample_dispatch = BRW_ALWAYS;
 
+   /* We can only persample dispatch if we have a multisample FBO */
+   prog_data->persample_dispatch = MIN2(prog_data->persample_dispatch,
+                                        key->multisample_fbo);
+
    if (devinfo->ver >= 6) {
       prog_data->uses_sample_mask =
          BITSET_TEST(shader->info.system_values_read, 
SYSTEM_VALUE_SAMPLE_MASK_IN);
diff --git a/src/intel/compiler/brw_fs_nir.cpp 
b/src/intel/compiler/brw_fs_nir.cpp
index fe6023de2ed..fc594301fbd 100644
--- a/src/intel/compiler/brw_fs_nir.cpp
+++ b/src/intel/compiler/brw_fs_nir.cpp
@@ -3189,6 +3189,8 @@ fs_visitor::emit_non_coherent_fb_read(const fs_builder 
&bld, const fs_reg &dst,
     * shouldn't be necessary to recompile based on whether the framebuffer is
     * CMS or UMS.
     */
+   assert(wm_key->multisample_fbo == BRW_ALWAYS ||
+          wm_key->multisample_fbo == BRW_NEVER);
    if (wm_key->multisample_fbo &&
        nir_system_values[SYSTEM_VALUE_SAMPLE_ID].file == BAD_FILE)
       nir_system_values[SYSTEM_VALUE_SAMPLE_ID] = emit_sampleid_setup();
diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c
index cd6994cd589..5c67a3759d3 100644
--- a/src/intel/compiler/brw_nir.c
+++ b/src/intel/compiler/brw_nir.c
@@ -553,7 +553,7 @@ brw_nir_lower_fs_inputs(nir_shader *nir,
    if (devinfo->ver >= 11)
       nir_lower_interpolation(nir, ~0);
 
-   if (!key->multisample_fbo) {
+   if (key->multisample_fbo == BRW_NEVER) {
       nir_lower_single_sampled(nir);
    } else if (key->persample_interp == BRW_ALWAYS) {
       nir_shader_instructions_pass(nir, lower_barycentric_per_sample,
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index 11e952ba0ad..c0e69cdc481 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -560,7 +560,7 @@ populate_wm_prog_key(const struct anv_graphics_pipeline 
*pipeline,
             (ms->sample_shading_enable &&
              (ms->min_sample_shading * ms->rasterization_samples) > 1) ?
             BRW_ALWAYS : BRW_NEVER;
-         key->multisample_fbo = true;
+         key->multisample_fbo = BRW_ALWAYS;
       }
 
       if (device->physical->instance->sample_mask_out_opengl_behaviour)
diff --git a/src/intel/vulkan_hasvk/anv_pipeline.c 
b/src/intel/vulkan_hasvk/anv_pipeline.c
index 4318f9d1658..bf9cbbc41ce 100644
--- a/src/intel/vulkan_hasvk/anv_pipeline.c
+++ b/src/intel/vulkan_hasvk/anv_pipeline.c
@@ -377,7 +377,7 @@ populate_wm_prog_key(const struct anv_graphics_pipeline 
*pipeline,
             (ms->sample_shading_enable &&
              (ms->min_sample_shading * ms->rasterization_samples) > 1) ?
             BRW_ALWAYS : BRW_NEVER;
-         key->multisample_fbo = true;
+         key->multisample_fbo = BRW_ALWAYS;
       }
 
       if (device->physical->instance->sample_mask_out_opengl_behaviour)

Reply via email to