Mesa (main): panvk: Emit fragment RSDs even with no shader

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon May 2 13:28:49 UTC 2022


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Wed Apr 27 18:57:04 2022 -0400

panvk: Emit fragment RSDs even with no shader

In Vulkan, it's possible to create a pipeline with no fragment shader that's
still expected to rasterize. This is useful for depth/stencil side effects, and
is closely related to the "fragment shader required" optimization we do in the
GLES driver. Refactor the RSD emit code to handle this case.

Fixes dEQP-VK.pipeline.stencil.nocolor.*

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16204>

---

 src/panfrost/ci/deqp-panfrost-g52-vk.toml |  1 +
 src/panfrost/vulkan/panvk_vX_pipeline.c   | 45 +++++++++++++++++--------------
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/src/panfrost/ci/deqp-panfrost-g52-vk.toml b/src/panfrost/ci/deqp-panfrost-g52-vk.toml
index a0775789ce9..54b60d7725c 100644
--- a/src/panfrost/ci/deqp-panfrost-g52-vk.toml
+++ b/src/panfrost/ci/deqp-panfrost-g52-vk.toml
@@ -25,6 +25,7 @@ include = [
     "dEQP-VK.image.load_store.with_format.*",
     "dEQP-VK.pipeline.input_assembly.*",
     "dEQP-VK.pipeline.sampler.view_type.*.format.r*.address_modes.all_mode_clamp_to_border*",
+    "dEQP-VK.pipeline.stencil.*",
     "dEQP-VK.rasterization.interpolation.*",
     "dEQP-VK.rasterization.primitive_size.*",
     "dEQP-VK.spirv_assembly.instruction.compute.opquantize.*",
diff --git a/src/panfrost/vulkan/panvk_vX_pipeline.c b/src/panfrost/vulkan/panvk_vX_pipeline.c
index 753546d1d2a..c7178d7a9da 100644
--- a/src/panfrost/vulkan/panvk_vX_pipeline.c
+++ b/src/panfrost/vulkan/panvk_vX_pipeline.c
@@ -212,7 +212,7 @@ panvk_pipeline_builder_alloc_static_state_bo(struct panvk_pipeline_builder *buil
 
    for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++) {
       const struct panvk_shader *shader = builder->shaders[i];
-      if (!shader)
+      if (!shader && i != MESA_SHADER_FRAGMENT)
          continue;
 
       if (pipeline->fs.dynamic_rsd && i == MESA_SHADER_FRAGMENT)
@@ -358,35 +358,40 @@ panvk_pipeline_builder_init_shaders(struct panvk_pipeline_builder *builder,
                       builder->stages[i].shader_offset;
       }
 
-      void *rsd = pipeline->state_bo->ptr.cpu + builder->stages[i].rsd_offset;
-      mali_ptr gpu_rsd = pipeline->state_bo->ptr.gpu + builder->stages[i].rsd_offset;
-
       if (i != MESA_SHADER_FRAGMENT) {
-         panvk_per_arch(emit_non_fs_rsd)(builder->device, &shader->info, shader_ptr, rsd);
-      } else if (!pipeline->fs.dynamic_rsd) {
-         void *bd = rsd + pan_size(RENDERER_STATE);
+         void *rsd = pipeline->state_bo->ptr.cpu + builder->stages[i].rsd_offset;
+         mali_ptr gpu_rsd = pipeline->state_bo->ptr.gpu + builder->stages[i].rsd_offset;
 
-         panvk_per_arch(emit_base_fs_rsd)(builder->device, pipeline, rsd);
-         for (unsigned rt = 0; rt < MAX2(pipeline->blend.state.rt_count, 1); rt++) {
-            panvk_per_arch(emit_blend)(builder->device, pipeline, rt, bd);
-            bd += pan_size(BLEND);
-         }
-      } else {
-         gpu_rsd = 0;
-         panvk_per_arch(emit_base_fs_rsd)(builder->device, pipeline, &pipeline->fs.rsd_template);
-         for (unsigned rt = 0; rt < MAX2(pipeline->blend.state.rt_count, 1); rt++) {
-            panvk_per_arch(emit_blend)(builder->device, pipeline, rt,
-                                       &pipeline->blend.bd_template[rt]);
-         }
+         panvk_per_arch(emit_non_fs_rsd)(builder->device, &shader->info, shader_ptr, rsd);
+         pipeline->rsds[i] = gpu_rsd;
       }
 
-      pipeline->rsds[i] = gpu_rsd;
       panvk_pipeline_builder_init_sysvals(builder, pipeline, i);
 
       if (i == MESA_SHADER_COMPUTE)
          pipeline->cs.local_size = shader->local_size;
    }
 
+   if (builder->create_info.gfx && !pipeline->fs.dynamic_rsd) {
+      void *rsd = pipeline->state_bo->ptr.cpu + builder->stages[MESA_SHADER_FRAGMENT].rsd_offset;
+      mali_ptr gpu_rsd = pipeline->state_bo->ptr.gpu + builder->stages[MESA_SHADER_FRAGMENT].rsd_offset;
+      void *bd = rsd + pan_size(RENDERER_STATE);
+
+      panvk_per_arch(emit_base_fs_rsd)(builder->device, pipeline, rsd);
+      for (unsigned rt = 0; rt < pipeline->blend.state.rt_count; rt++) {
+         panvk_per_arch(emit_blend)(builder->device, pipeline, rt, bd);
+         bd += pan_size(BLEND);
+      }
+
+      pipeline->rsds[MESA_SHADER_FRAGMENT] = gpu_rsd;
+   } else if (builder->create_info.gfx) {
+      panvk_per_arch(emit_base_fs_rsd)(builder->device, pipeline, &pipeline->fs.rsd_template);
+      for (unsigned rt = 0; rt < MAX2(pipeline->blend.state.rt_count, 1); rt++) {
+         panvk_per_arch(emit_blend)(builder->device, pipeline, rt,
+                                    &pipeline->blend.bd_template[rt]);
+      }
+   }
+
    pipeline->num_ubos = builder->layout->num_ubos + builder->layout->num_dyn_ubos;
    for (unsigned i = 0; i < ARRAY_SIZE(pipeline->sysvals); i++) {
       if (pipeline->sysvals[i].ids.sysval_count)



More information about the mesa-commit mailing list