Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-08 Thread Emil Velikov
On 7 March 2018 at 19:56, Emil Velikov  wrote:
> On 7 March 2018 at 18:32, Bas Nieuwenhuizen  wrote:
>
>>>
>>> Missing break?
>>
>> So much for the tests ...
>>
> Speaking of tests, I hope they check that both KHR and non KHR
> annotated functions (the ones changed in 04/16) are tested.
> We don't want them to disappear for setups using a pre 1.1 loader.
>
To answer my own nit:
The python scripts produce both entrypoints, hence using an old loader
should be fine ;-)

-Emil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Emil Velikov
On 7 March 2018 at 18:32, Bas Nieuwenhuizen  wrote:

>>
>> Missing break?
>
> So much for the tests ...
>
Speaking of tests, I hope they check that both KHR and non KHR
annotated functions (the ones changed in 04/16) are tested.
We don't want them to disappear for setups using a pre 1.1 loader.

Just a fly-by comment ;-)

-Emil
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Samuel Pitoiset



On 03/07/2018 07:32 PM, Bas Nieuwenhuizen wrote:

On Wed, Mar 7, 2018 at 7:19 PM, Samuel Pitoiset
 wrote:



On 03/07/2018 03:47 PM, Bas Nieuwenhuizen wrote:


Reviewed-by: Dave Airlie 
---
   src/amd/vulkan/radv_descriptor_set.c | 82
++--
   src/amd/vulkan/radv_device.c | 10 +
   src/amd/vulkan/radv_extensions.py|  1 +
   3 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_descriptor_set.c
b/src/amd/vulkan/radv_descriptor_set.c
index 38b8dc78e1..265028df2b 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -31,6 +31,20 @@
   #include "radv_private.h"
   #include "sid.h"
   +
+static bool has_equal_immutable_samplers(const VkSampler *samplers,
uint32_t count)
+{
+   if (!samplers)
+   return false;
+   for(uint32_t i = 1; i < count; ++i) {
+   if (memcmp(radv_sampler_from_handle(samplers[0])->state,
+  radv_sampler_from_handle(samplers[i])->state,
16)) {
+   return false;
+   }
+   }
+   return true;
+}
+
   VkResult radv_CreateDescriptorSetLayout(
 VkDevice_device,
 const VkDescriptorSetLayoutCreateInfo*  pCreateInfo,
@@ -132,15 +146,13 @@ VkResult radv_CreateDescriptorSetLayout(
 if (binding->pImmutableSamplers) {
 set_layout->binding[b].immutable_samplers_offset =
samplers_offset;
-   set_layout->binding[b].immutable_samplers_equal =
true;
+   set_layout->binding[b].immutable_samplers_equal =
+
has_equal_immutable_samplers(binding->pImmutableSamplers,
binding->descriptorCount);
 set_layout->has_immutable_samplers = true;
 for (uint32_t i = 0; i < binding->descriptorCount;
i++)
 memcpy(samplers + 4 * i,
&radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
-   for (uint32_t i = 1; i < binding->descriptorCount;
i++)
-   if (memcmp(samplers + 4 * i, samplers, 16)
!= 0)
-
set_layout->binding[b].immutable_samplers_equal = false;
 /* Don't reserve space for the samplers if they're
not accessed. */
 if
(set_layout->binding[b].immutable_samplers_equal) {
@@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout(
 vk_free2(&device->alloc, pAllocator, set_layout);
   }
   +void radv_GetDescriptorSetLayoutSupport(VkDevice device,
+const
VkDescriptorSetLayoutCreateInfo* pCreateInfo,
+VkDescriptorSetLayoutSupport*
pSupport)
+{
+   bool supported = true;
+   uint64_t size = 0;
+   for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
+   const VkDescriptorSetLayoutBinding *binding =
&pCreateInfo->pBindings[i];
+
+   if (binding->descriptorCount == 0)
+   continue;
+
+   uint64_t descriptor_size = 0;
+   uint64_t descriptor_alignment = 1;
+   switch (binding->descriptorType) {
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+   break;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   break;
+   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+   descriptor_size = 64;
+   descriptor_alignment = 32;
+   break;
+   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+   if
(!has_equal_immutable_samplers(binding->pImmutableSamplers,
binding->descriptorCount)) {
+   descriptor_size = 64;
+   } else {
+   descriptor_size = 96;
+   }
+   descriptor_alignment = 32;



Missing break?


So much for the tests ...


Yes...

The rest looks good to me, nice work!



Fixed locally.





+   case VK_DESCRIPTOR_TYPE_SAMPLER:
+   if
(!has_equal_immutable_samplers(binding->pImmutableSamplers,
binding->descriptorCount)) {
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   }
+   break;
+   default:
+   unreachable("unknown descriptor t

Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Bas Nieuwenhuizen
On Wed, Mar 7, 2018 at 7:19 PM, Samuel Pitoiset
 wrote:
>
>
> On 03/07/2018 03:47 PM, Bas Nieuwenhuizen wrote:
>>
>> Reviewed-by: Dave Airlie 
>> ---
>>   src/amd/vulkan/radv_descriptor_set.c | 82
>> ++--
>>   src/amd/vulkan/radv_device.c | 10 +
>>   src/amd/vulkan/radv_extensions.py|  1 +
>>   3 files changed, 89 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/amd/vulkan/radv_descriptor_set.c
>> b/src/amd/vulkan/radv_descriptor_set.c
>> index 38b8dc78e1..265028df2b 100644
>> --- a/src/amd/vulkan/radv_descriptor_set.c
>> +++ b/src/amd/vulkan/radv_descriptor_set.c
>> @@ -31,6 +31,20 @@
>>   #include "radv_private.h"
>>   #include "sid.h"
>>   +
>> +static bool has_equal_immutable_samplers(const VkSampler *samplers,
>> uint32_t count)
>> +{
>> +   if (!samplers)
>> +   return false;
>> +   for(uint32_t i = 1; i < count; ++i) {
>> +   if (memcmp(radv_sampler_from_handle(samplers[0])->state,
>> +  radv_sampler_from_handle(samplers[i])->state,
>> 16)) {
>> +   return false;
>> +   }
>> +   }
>> +   return true;
>> +}
>> +
>>   VkResult radv_CreateDescriptorSetLayout(
>> VkDevice_device,
>> const VkDescriptorSetLayoutCreateInfo*  pCreateInfo,
>> @@ -132,15 +146,13 @@ VkResult radv_CreateDescriptorSetLayout(
>> if (binding->pImmutableSamplers) {
>> set_layout->binding[b].immutable_samplers_offset =
>> samplers_offset;
>> -   set_layout->binding[b].immutable_samplers_equal =
>> true;
>> +   set_layout->binding[b].immutable_samplers_equal =
>> +
>> has_equal_immutable_samplers(binding->pImmutableSamplers,
>> binding->descriptorCount);
>> set_layout->has_immutable_samplers = true;
>> for (uint32_t i = 0; i < binding->descriptorCount;
>> i++)
>> memcpy(samplers + 4 * i,
>> &radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
>> -   for (uint32_t i = 1; i < binding->descriptorCount;
>> i++)
>> -   if (memcmp(samplers + 4 * i, samplers, 16)
>> != 0)
>> -
>> set_layout->binding[b].immutable_samplers_equal = false;
>> /* Don't reserve space for the samplers if they're
>> not accessed. */
>> if
>> (set_layout->binding[b].immutable_samplers_equal) {
>> @@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout(
>> vk_free2(&device->alloc, pAllocator, set_layout);
>>   }
>>   +void radv_GetDescriptorSetLayoutSupport(VkDevice device,
>> +const
>> VkDescriptorSetLayoutCreateInfo* pCreateInfo,
>> +VkDescriptorSetLayoutSupport*
>> pSupport)
>> +{
>> +   bool supported = true;
>> +   uint64_t size = 0;
>> +   for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
>> +   const VkDescriptorSetLayoutBinding *binding =
>> &pCreateInfo->pBindings[i];
>> +
>> +   if (binding->descriptorCount == 0)
>> +   continue;
>> +
>> +   uint64_t descriptor_size = 0;
>> +   uint64_t descriptor_alignment = 1;
>> +   switch (binding->descriptorType) {
>> +   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
>> +   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
>> +   break;
>> +   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
>> +   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
>> +   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
>> +   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
>> +   descriptor_size = 16;
>> +   descriptor_alignment = 16;
>> +   break;
>> +   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
>> +   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
>> +   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
>> +   descriptor_size = 64;
>> +   descriptor_alignment = 32;
>> +   break;
>> +   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
>> +   if
>> (!has_equal_immutable_samplers(binding->pImmutableSamplers,
>> binding->descriptorCount)) {
>> +   descriptor_size = 64;
>> +   } else {
>> +   descriptor_size = 96;
>> +   }
>> +   descriptor_alignment = 32;
>
>
> Missing break?

So much for the tests ...

Fixed locally.

>
>
>> +   case VK_DESCRIPTOR_TYPE_SAMPLER:
>> +   if
>> (!has_equal_immutable_samplers(binding->pImmutableSamplers,
>> binding->descriptorCount)) {
>> +   descr

Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Samuel Pitoiset



On 03/07/2018 03:47 PM, Bas Nieuwenhuizen wrote:

Reviewed-by: Dave Airlie 
---
  src/amd/vulkan/radv_descriptor_set.c | 82 ++--
  src/amd/vulkan/radv_device.c | 10 +
  src/amd/vulkan/radv_extensions.py|  1 +
  3 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_descriptor_set.c 
b/src/amd/vulkan/radv_descriptor_set.c
index 38b8dc78e1..265028df2b 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -31,6 +31,20 @@
  #include "radv_private.h"
  #include "sid.h"
  
+

+static bool has_equal_immutable_samplers(const VkSampler *samplers, uint32_t 
count)
+{
+   if (!samplers)
+   return false;
+   for(uint32_t i = 1; i < count; ++i) {
+   if (memcmp(radv_sampler_from_handle(samplers[0])->state,
+  radv_sampler_from_handle(samplers[i])->state, 16)) {
+   return false;
+   }
+   }
+   return true;
+}
+
  VkResult radv_CreateDescriptorSetLayout(
VkDevice_device,
const VkDescriptorSetLayoutCreateInfo*  pCreateInfo,
@@ -132,15 +146,13 @@ VkResult radv_CreateDescriptorSetLayout(
  
  		if (binding->pImmutableSamplers) {

set_layout->binding[b].immutable_samplers_offset = 
samplers_offset;
-   set_layout->binding[b].immutable_samplers_equal = true;
+   set_layout->binding[b].immutable_samplers_equal =
+   
has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount);
set_layout->has_immutable_samplers = true;
  
  
  			for (uint32_t i = 0; i < binding->descriptorCount; i++)

memcpy(samplers + 4 * i, 
&radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
-   for (uint32_t i = 1; i < binding->descriptorCount; i++)
-   if (memcmp(samplers + 4 * i, samplers, 16) != 0)
-   
set_layout->binding[b].immutable_samplers_equal = false;
  
  			/* Don't reserve space for the samplers if they're not accessed. */

if (set_layout->binding[b].immutable_samplers_equal) {
@@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout(
vk_free2(&device->alloc, pAllocator, set_layout);
  }
  
+void radv_GetDescriptorSetLayoutSupport(VkDevice device,

+const VkDescriptorSetLayoutCreateInfo* 
pCreateInfo,
+VkDescriptorSetLayoutSupport* pSupport)
+{
+   bool supported = true;
+   uint64_t size = 0;
+   for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
+   const VkDescriptorSetLayoutBinding *binding = 
&pCreateInfo->pBindings[i];
+
+   if (binding->descriptorCount == 0)
+   continue;
+
+   uint64_t descriptor_size = 0;
+   uint64_t descriptor_alignment = 1;
+   switch (binding->descriptorType) {
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+   break;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   break;
+   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+   descriptor_size = 64;
+   descriptor_alignment = 32;
+   break;
+   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+   if 
(!has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount)) {
+   descriptor_size = 64;
+   } else {
+   descriptor_size = 96;
+   }
+   descriptor_alignment = 32;


Missing break?


+   case VK_DESCRIPTOR_TYPE_SAMPLER:
+   if 
(!has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount)) {
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   }
+   break;
+   default:
+   unreachable("unknown descriptor type\n");
+   break;
+   }
+
+   if (size && !align_u64(size, descriptor_alignment)) {
+   supported = false;
+

Re: [Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Gustaw Smolarczyk
2018-03-07 15:47 GMT+01:00 Bas Nieuwenhuizen :

> Reviewed-by: Dave Airlie 
> ---
>  src/amd/vulkan/radv_descriptor_set.c | 82 ++
> --
>  src/amd/vulkan/radv_device.c | 10 +
>  src/amd/vulkan/radv_extensions.py|  1 +
>  3 files changed, 89 insertions(+), 4 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_
> descriptor_set.c
> index 38b8dc78e1..265028df2b 100644
> --- a/src/amd/vulkan/radv_descriptor_set.c
> +++ b/src/amd/vulkan/radv_descriptor_set.c
> @@ -31,6 +31,20 @@
>  #include "radv_private.h"
>  #include "sid.h"
>
> +
> +static bool has_equal_immutable_samplers(const VkSampler *samplers,
> uint32_t count)
> +{
> +   if (!samplers)
> +   return false;
> +   for(uint32_t i = 1; i < count; ++i) {
> +   if (memcmp(radv_sampler_from_handle(samplers[0])->state,
> +  radv_sampler_from_handle(samplers[i])->state,
> 16)) {
> +   return false;
> +   }
> +   }
> +   return true;
> +}
> +
>  VkResult radv_CreateDescriptorSetLayout(
> VkDevice_device,
> const VkDescriptorSetLayoutCreateInfo*  pCreateInfo,
> @@ -132,15 +146,13 @@ VkResult radv_CreateDescriptorSetLayout(
>
> if (binding->pImmutableSamplers) {
> set_layout->binding[b].immutable_samplers_offset
> = samplers_offset;
> -   set_layout->binding[b].immutable_samplers_equal =
> true;
> +   set_layout->binding[b].immutable_samplers_equal =
> +   
> has_equal_immutable_samplers(binding->pImmutableSamplers,
> binding->descriptorCount);
> set_layout->has_immutable_samplers = true;
>
>
> for (uint32_t i = 0; i < binding->descriptorCount;
> i++)
> memcpy(samplers + 4 * i,
> &radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
> -   for (uint32_t i = 1; i < binding->descriptorCount;
> i++)
> -   if (memcmp(samplers + 4 * i, samplers, 16)
> != 0)
> -   
> set_layout->binding[b].immutable_samplers_equal
> = false;
>
> /* Don't reserve space for the samplers if they're
> not accessed. */
> if (set_layout->binding[b].immutable_samplers_equal)
> {
> @@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout(
> vk_free2(&device->alloc, pAllocator, set_layout);
>  }
>
> +void radv_GetDescriptorSetLayoutSupport(VkDevice device,
> +const
> VkDescriptorSetLayoutCreateInfo* pCreateInfo,
> +VkDescriptorSetLayoutSupport*
> pSupport)
> +{
> +   bool supported = true;
> +   uint64_t size = 0;
> +   for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
> +   const VkDescriptorSetLayoutBinding *binding =
> &pCreateInfo->pBindings[i];
> +
> +   if (binding->descriptorCount == 0)
> +   continue;
> +
> +   uint64_t descriptor_size = 0;
> +   uint64_t descriptor_alignment = 1;
> +   switch (binding->descriptorType) {
> +   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
> +   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
> +   break;
> +   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
> +   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
> +   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
> +   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
> +   descriptor_size = 16;
> +   descriptor_alignment = 16;
> +   break;
> +   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
> +   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
> +   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
> +   descriptor_size = 64;
> +   descriptor_alignment = 32;
> +   break;
> +   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
> +   if 
> (!has_equal_immutable_samplers(binding->pImmutableSamplers,
> binding->descriptorCount)) {
> +   descriptor_size = 64;
> +   } else {
> +   descriptor_size = 96;
> +   }
> +   descriptor_alignment = 32;
> +   case VK_DESCRIPTOR_TYPE_SAMPLER:
> +   if 
> (!has_equal_immutable_samplers(binding->pImmutableSamplers,
> binding->descriptorCount)) {
> +   descriptor_size = 16;
> +   descriptor_alignment = 16;
> +   }
> +   break;
> +   default:
> + 

[Mesa-dev] [PATCH 07/16] radv: Implement VK_KHR_maintenance3.

2018-03-07 Thread Bas Nieuwenhuizen
Reviewed-by: Dave Airlie 
---
 src/amd/vulkan/radv_descriptor_set.c | 82 ++--
 src/amd/vulkan/radv_device.c | 10 +
 src/amd/vulkan/radv_extensions.py|  1 +
 3 files changed, 89 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_descriptor_set.c 
b/src/amd/vulkan/radv_descriptor_set.c
index 38b8dc78e1..265028df2b 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -31,6 +31,20 @@
 #include "radv_private.h"
 #include "sid.h"
 
+
+static bool has_equal_immutable_samplers(const VkSampler *samplers, uint32_t 
count)
+{
+   if (!samplers)
+   return false;
+   for(uint32_t i = 1; i < count; ++i) {
+   if (memcmp(radv_sampler_from_handle(samplers[0])->state,
+  radv_sampler_from_handle(samplers[i])->state, 16)) {
+   return false;
+   }
+   }
+   return true;
+}
+
 VkResult radv_CreateDescriptorSetLayout(
VkDevice_device,
const VkDescriptorSetLayoutCreateInfo*  pCreateInfo,
@@ -132,15 +146,13 @@ VkResult radv_CreateDescriptorSetLayout(
 
if (binding->pImmutableSamplers) {
set_layout->binding[b].immutable_samplers_offset = 
samplers_offset;
-   set_layout->binding[b].immutable_samplers_equal = true;
+   set_layout->binding[b].immutable_samplers_equal =
+   
has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount);
set_layout->has_immutable_samplers = true;
 
 
for (uint32_t i = 0; i < binding->descriptorCount; i++)
memcpy(samplers + 4 * i, 
&radv_sampler_from_handle(binding->pImmutableSamplers[i])->state, 16);
-   for (uint32_t i = 1; i < binding->descriptorCount; i++)
-   if (memcmp(samplers + 4 * i, samplers, 16) != 0)
-   
set_layout->binding[b].immutable_samplers_equal = false;
 
/* Don't reserve space for the samplers if they're not 
accessed. */
if (set_layout->binding[b].immutable_samplers_equal) {
@@ -182,6 +194,68 @@ void radv_DestroyDescriptorSetLayout(
vk_free2(&device->alloc, pAllocator, set_layout);
 }
 
+void radv_GetDescriptorSetLayoutSupport(VkDevice device,
+const VkDescriptorSetLayoutCreateInfo* 
pCreateInfo,
+VkDescriptorSetLayoutSupport* pSupport)
+{
+   bool supported = true;
+   uint64_t size = 0;
+   for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {
+   const VkDescriptorSetLayoutBinding *binding = 
&pCreateInfo->pBindings[i];
+
+   if (binding->descriptorCount == 0)
+   continue;
+
+   uint64_t descriptor_size = 0;
+   uint64_t descriptor_alignment = 1;
+   switch (binding->descriptorType) {
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
+   break;
+   case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
+   case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+   case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   break;
+   case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+   case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+   case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+   descriptor_size = 64;
+   descriptor_alignment = 32;
+   break;
+   case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+   if 
(!has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount)) {
+   descriptor_size = 64;
+   } else {
+   descriptor_size = 96;
+   }
+   descriptor_alignment = 32;
+   case VK_DESCRIPTOR_TYPE_SAMPLER:
+   if 
(!has_equal_immutable_samplers(binding->pImmutableSamplers, 
binding->descriptorCount)) {
+   descriptor_size = 16;
+   descriptor_alignment = 16;
+   }
+   break;
+   default:
+   unreachable("unknown descriptor type\n");
+   break;
+   }
+
+   if (size && !align_u64(size, descriptor_alignment)) {
+   supported = false;
+   }
+   size = alig