Mesa (master): anv: fix 3DSTATE_MULTISAMPLE emission on gen8+

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 16 12:02:20 UTC 2021


Module: Mesa
Branch: master
Commit: 30bc562bdaec2efbfae4cc01548b2adbae2c0c4b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=30bc562bdaec2efbfae4cc01548b2adbae2c0c4b

Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date:   Fri Apr 16 11:08:46 2021 +0300

anv: fix 3DSTATE_MULTISAMPLE emission on gen8+

When pipeline->dynamic_state.sample_locations.samples is not set
because the state is dynamic, we're currently calling
genX(emit_multisample) with a 0 samples value which is incorrect.

Found when using renderdoc with the drawing overlay.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Fixes: 4ad4cd89069bfc ("anv: Enabled the VK_EXT_sample_locations extension")
Cc: <mesa-stable>
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10282>

---

 src/intel/vulkan/anv_pipeline.c  | 26 ++++++++++++++------------
 src/intel/vulkan/genX_pipeline.c | 16 ++++++++--------
 2 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index a598d3c15a0..a8b30274c91 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -2049,9 +2049,9 @@ copy_non_dynamic_state(struct anv_graphics_pipeline *pipeline,
       }
    }
 
+   const VkPipelineMultisampleStateCreateInfo *ms_info =
+      pCreateInfo->pMultisampleState;
    if (states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS) {
-      const VkPipelineMultisampleStateCreateInfo *ms_info =
-         pCreateInfo->pMultisampleState;
       const VkPipelineSampleLocationsStateCreateInfoEXT *sl_info = ms_info ?
          vk_find_struct_const(ms_info, PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT) : NULL;
 
@@ -2064,16 +2064,18 @@ copy_non_dynamic_state(struct anv_graphics_pipeline *pipeline,
             dynamic->sample_locations.locations[i].x = positions[i].x;
             dynamic->sample_locations.locations[i].y = positions[i].y;
          }
-
-      } else {
-         dynamic->sample_locations.samples =
-            ms_info ? ms_info->rasterizationSamples : 1;
-         const struct intel_sample_position *positions =
-            intel_get_sample_positions(dynamic->sample_locations.samples);
-         for (uint32_t i = 0; i < dynamic->sample_locations.samples; i++) {
-            dynamic->sample_locations.locations[i].x = positions[i].x;
-            dynamic->sample_locations.locations[i].y = positions[i].y;
-         }
+      }
+   }
+   /* Ensure we always have valid values for sample_locations. */
+   if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations &&
+       dynamic->sample_locations.samples == 0) {
+      dynamic->sample_locations.samples =
+         ms_info ? ms_info->rasterizationSamples : 1;
+      const struct intel_sample_position *positions =
+         intel_get_sample_positions(dynamic->sample_locations.samples);
+      for (uint32_t i = 0; i < dynamic->sample_locations.samples; i++) {
+         dynamic->sample_locations.locations[i].x = positions[i].x;
+         dynamic->sample_locations.locations[i].y = positions[i].y;
       }
    }
 
diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
index 32594192134..8e3aeef9ff2 100644
--- a/src/intel/vulkan/genX_pipeline.c
+++ b/src/intel/vulkan/genX_pipeline.c
@@ -755,16 +755,16 @@ emit_ms_state(struct anv_graphics_pipeline *pipeline,
               const VkPipelineMultisampleStateCreateInfo *info,
               uint32_t dynamic_states)
 {
-   /* If the sample locations are dynamic, 3DSTATE_MULTISAMPLE on Gfx7/7.5
-    * will be emitted dynamically, so skip it here. On Gfx8+
-    * 3DSTATE_SAMPLE_PATTERN will be emitted dynamically, so skip it here.
+   /* Only lookup locations if the extensions is active, otherwise the default
+    * ones will be used either at device initialization time or through
+    * 3DSTATE_MULTISAMPLE on Gfx7/7.5 by passing NULL locations.
     */
-   if (!(dynamic_states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS)) {
-      /* Only lookup locations if the extensions is active, otherwise the
-       * default ones will be used either at device initialization time or
-       * through 3DSTATE_MULTISAMPLE on Gfx7/7.5 by passing NULL locations.
+   if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations) {
+      /* If the sample locations are dynamic, 3DSTATE_MULTISAMPLE on Gfx7/7.5
+       * will be emitted dynamically, so skip it here. On Gfx8+
+       * 3DSTATE_SAMPLE_PATTERN will be emitted dynamically, so skip it here.
        */
-      if (pipeline->base.device->vk.enabled_extensions.EXT_sample_locations) {
+      if (!(dynamic_states & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS)) {
 #if GFX_VER >= 8
          genX(emit_sample_pattern)(&pipeline->base.batch,
                                    pipeline->dynamic_state.sample_locations.samples,



More information about the mesa-commit mailing list