radv: Detect if all immutable samplers for a binding are equal.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 27 Feb 2017 08:44:48 +0000 (09:44 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 28 Feb 2017 19:48:10 +0000 (20:48 +0100)
We can then use constants for indexed loads.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_descriptor_set.c
src/amd/vulkan/radv_descriptor_set.h

index b24ff91d3edbb389f5be7cfbcc7e14873e60fe33..d8399574f2a86abf7fdfd2f3bcb91a6c2dca6a44 100644 (file)
@@ -132,10 +132,15 @@ VkResult radv_CreateDescriptorSetLayout(
 
                if (binding->pImmutableSamplers) {
                        set_layout->binding[b].immutable_samplers = samplers;
+                       set_layout->binding[b].immutable_samplers_equal = true;
                        samplers += 4 * binding->descriptorCount;
 
                        for (uint32_t i = 0; i < binding->descriptorCount; i++)
                                memcpy(set_layout->binding[b].immutable_samplers + 4 * i, &radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
+                       for (uint32_t i = 1; i < binding->descriptorCount; i++)
+                               if (memcmp(set_layout->binding[b].immutable_samplers + 4 * i,
+                                          set_layout->binding[b].immutable_samplers, 16) != 0)
+                                       set_layout->binding[b].immutable_samplers_equal = false;
                } else {
                        set_layout->binding[b].immutable_samplers = NULL;
                }
index 8849d053121ddffea50bbe507f41a3400a47fedc..c373489ccb3d9fb2a55ed9dd7cab0f114d9ede8d 100644 (file)
@@ -45,6 +45,7 @@ struct radv_descriptor_set_binding_layout {
 
    /* Immutable samplers (or NULL if no immutable samplers) */
    uint32_t *immutable_samplers;
+   bool immutable_samplers_equal;
 };
 
 struct radv_descriptor_set_layout {