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

Author: Dave Airlie <[email protected]>
Date:   Tue Mar 16 11:14:55 2021 +1000

lavapipe: only init immutable samplers for correct types.

This is ported from anv, and it needed to stop crashes with
the buffer_device_address CTS tests

Reviewed-By: Mike Blumenkrantz <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9616>

---

 .../frontends/lavapipe/lvp_descriptor_set.c        | 35 ++++++++++++++--------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c 
b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
index daf177b2ac7..42a199ae07b 100644
--- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
+++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c
@@ -61,7 +61,21 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateDescriptorSetLayout(
    uint32_t immutable_sampler_count = 0;
    for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) {
       max_binding = MAX2(max_binding, pCreateInfo->pBindings[j].binding);
-      if (pCreateInfo->pBindings[j].pImmutableSamplers)
+      /* From the Vulkan 1.1.97 spec for VkDescriptorSetLayoutBinding:
+       *
+       *    "If descriptorType specifies a VK_DESCRIPTOR_TYPE_SAMPLER or
+       *    VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER type descriptor, then
+       *    pImmutableSamplers can be used to initialize a set of immutable
+       *    samplers. [...]  If descriptorType is not one of these descriptor
+       *    types, then pImmutableSamplers is ignored.
+       *
+       * We need to be careful here and only parse pImmutableSamplers if we
+       * have one of the right descriptor types.
+       */
+      VkDescriptorType desc_type = pCreateInfo->pBindings[j].descriptorType;
+      if ((desc_type == VK_DESCRIPTOR_TYPE_SAMPLER ||
+           desc_type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) &&
+          pCreateInfo->pBindings[j].pImmutableSamplers)
          immutable_sampler_count += pCreateInfo->pBindings[j].descriptorCount;
    }
 
@@ -125,6 +139,14 @@ VKAPI_ATTR VkResult VKAPI_CALL 
lvp_CreateDescriptorSetLayout(
             set_layout->binding[b].stage[s].sampler_index = 
set_layout->stage[s].sampler_count;
             set_layout->stage[s].sampler_count += binding->descriptorCount;
          }
+         if (binding->pImmutableSamplers) {
+            set_layout->binding[b].immutable_samplers = samplers;
+            samplers += binding->descriptorCount;
+
+            for (uint32_t i = 0; i < binding->descriptorCount; i++)
+               set_layout->binding[b].immutable_samplers[i] =
+                  lvp_sampler_from_handle(binding->pImmutableSamplers[i]);
+         }
          break;
       default:
          break;
@@ -166,17 +188,6 @@ VKAPI_ATTR VkResult VKAPI_CALL 
lvp_CreateDescriptorSetLayout(
          break;
       }
 
-      if (binding->pImmutableSamplers) {
-         set_layout->binding[b].immutable_samplers = samplers;
-         samplers += binding->descriptorCount;
-
-         for (uint32_t i = 0; i < binding->descriptorCount; i++)
-            set_layout->binding[b].immutable_samplers[i] =
-               lvp_sampler_from_handle(binding->pImmutableSamplers[i]);
-      } else {
-         set_layout->binding[b].immutable_samplers = NULL;
-      }
-
       set_layout->shader_stages |= binding->stageFlags;
    }
 

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to