<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2018-03-07 15:47 GMT+01:00 Bas Nieuwenhuizen <span dir="ltr"><<a href="mailto:bas@basnieuwenhuizen.nl" target="_blank">bas@basnieuwenhuizen.nl</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Reviewed-by: Dave Airlie <<a href="mailto:airlied@redhat.com">airlied@redhat.com</a>><br>
---<br>
 src/amd/vulkan/radv_<wbr>descriptor_set.c | 82 ++++++++++++++++++++++++++++++<wbr>++++--<br>
 src/amd/vulkan/radv_device.c         | 10 +++++<br>
 src/amd/vulkan/radv_<wbr>extensions.py    |  1 +<br>
 3 files changed, 89 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/amd/vulkan/radv_<wbr>descriptor_set.c b/src/amd/vulkan/radv_<wbr>descriptor_set.c<br>
index 38b8dc78e1..265028df2b 100644<br>
--- a/src/amd/vulkan/radv_<wbr>descriptor_set.c<br>
+++ b/src/amd/vulkan/radv_<wbr>descriptor_set.c<br>
@@ -31,6 +31,20 @@<br>
 #include "radv_private.h"<br>
 #include "sid.h"<br>
<br>
+<br>
+static bool has_equal_immutable_samplers(<wbr>const VkSampler *samplers, uint32_t count)<br>
+{<br>
+       if (!samplers)<br>
+               return false;<br>
+       for(uint32_t i = 1; i < count; ++i) {<br>
+               if (memcmp(radv_sampler_from_<wbr>handle(samplers[0])->state,<br>
+                          radv_sampler_from_handle(<wbr>samplers[i])->state, 16)) {<br>
+                       return false;<br>
+               }<br>
+       }<br>
+       return true;<br>
+}<br>
+<br>
 VkResult radv_<wbr>CreateDescriptorSetLayout(<br>
        VkDevice                                    _device,<br>
        const VkDescriptorSetLayoutCreateInf<wbr>o*      pCreateInfo,<br>
@@ -132,15 +146,13 @@ VkResult radv_<wbr>CreateDescriptorSetLayout(<br>
<br>
                if (binding->pImmutableSamplers) {<br>
                        set_layout->binding[b].<wbr>immutable_samplers_offset = samplers_offset;<br>
-                       set_layout->binding[b].<wbr>immutable_samplers_equal = true;<br>
+                       set_layout->binding[b].<wbr>immutable_samplers_equal =<br>
+                               has_equal_immutable_samplers(<wbr>binding->pImmutableSamplers, binding->descriptorCount);<br>
                        set_layout->has_immutable_<wbr>samplers = true;<br>
<br>
<br>
                        for (uint32_t i = 0; i < binding->descriptorCount; i++)<br>
                                memcpy(samplers + 4 * i, &radv_sampler_from_handle(<wbr>binding->pImmutableSamplers[i]<wbr>)->state, 16);<br>
-                       for (uint32_t i = 1; i < binding->descriptorCount; i++)<br>
-                               if (memcmp(samplers + 4 * i, samplers, 16) != 0)<br>
-                                       set_layout->binding[b].<wbr>immutable_samplers_equal = false;<br>
<br>
                        /* Don't reserve space for the samplers if they're not accessed. */<br>
                        if (set_layout->binding[b].<wbr>immutable_samplers_equal) {<br>
@@ -182,6 +194,68 @@ void radv_<wbr>DestroyDescriptorSetLayout(<br>
        vk_free2(&device->alloc, pAllocator, set_layout);<br>
 }<br>
<br>
+void radv_<wbr>GetDescriptorSetLayoutSupport(<wbr>VkDevice device,<br>
+                                        const VkDescriptorSetLayoutCreateInf<wbr>o* pCreateInfo,<br>
+                                        VkDescriptorSetLayoutSupport* pSupport)<br>
+{<br>
+       bool supported = true;<br>
+       uint64_t size = 0;<br>
+       for (uint32_t i = 0; i < pCreateInfo->bindingCount; i++) {<br>
+               const VkDescriptorSetLayoutBinding *binding = &pCreateInfo->pBindings[i];<br>
+<br>
+               if (binding->descriptorCount == 0)<br>
+                       continue;<br>
+<br>
+               uint64_t descriptor_size = 0;<br>
+               uint64_t descriptor_alignment = 1;<br>
+               switch (binding->descriptorType) {<br>
+               case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>BUFFER_DYNAMIC:<br>
+               case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>BUFFER_DYNAMIC:<br>
+                       break;<br>
+               case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>BUFFER:<br>
+               case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>BUFFER:<br>
+               case VK_DESCRIPTOR_TYPE_UNIFORM_<wbr>TEXEL_BUFFER:<br>
+               case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>TEXEL_BUFFER:<br>
+                       descriptor_size = 16;<br>
+                       descriptor_alignment = 16;<br>
+                       break;<br>
+               case VK_DESCRIPTOR_TYPE_STORAGE_<wbr>IMAGE:<br>
+               case VK_DESCRIPTOR_TYPE_SAMPLED_<wbr>IMAGE:<br>
+               case VK_DESCRIPTOR_TYPE_INPUT_<wbr>ATTACHMENT:<br>
+                       descriptor_size = 64;<br>
+                       descriptor_alignment = 32;<br>
+                       break;<br>
+               case VK_DESCRIPTOR_TYPE_COMBINED_<wbr>IMAGE_SAMPLER:<br>
+                       if (!has_equal_immutable_<wbr>samplers(binding-><wbr>pImmutableSamplers, binding->descriptorCount)) {<br>
+                               descriptor_size = 64;<br>
+                       } else {<br>
+                               descriptor_size = 96;<br>
+                       }<br>
+                       descriptor_alignment = 32;<br>
+               case VK_DESCRIPTOR_TYPE_SAMPLER:<br>
+                       if (!has_equal_immutable_<wbr>samplers(binding-><wbr>pImmutableSamplers, binding->descriptorCount)) {<br>
+                               descriptor_size = 16;<br>
+                               descriptor_alignment = 16;<br>
+                       }<br>
+                       break;<br>
+               default:<br>
+                       unreachable("unknown descriptor type\n");<br>
+                       break;<br>
+               }<br>
+<br>
+               if (size && !align_u64(size, descriptor_alignment)) {<br>
+                       supported = false;<br>
+               }<br>
+               size = align_u64(size, descriptor_alignment);<br>
+               if (descriptor_size && (UINT64_MAX - size) / descriptor_size < binding->descriptorCount) {<br>
+                       supported = false;<br>
+               }<br>
+               size += binding->descriptorCount * descriptor_size;<br>
+       }<br>
+<br>
+       pSupport->supported = supported;<br>
+}<br>
+<br>
 /*<br>
  * Pipeline layouts.  These have nothing to do with the pipeline.  They are<br>
  * just muttiple descriptor set layouts pasted together<br>
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c<br>
index 00bb70612e..593cfc9a36 100644<br>
--- a/src/amd/vulkan/radv_device.c<br>
+++ b/src/amd/vulkan/radv_device.c<br>
@@ -875,6 +875,16 @@ void radv_<wbr>GetPhysicalDeviceProperties2(<br>
                        properties-><wbr>quadOperationsInAllStages = false;<br>
                        break;<br>
                }<br>
+               case VK_STRUCTURE_TYPE_PHYSICAL_<wbr>DEVICE_MAINTENANCE_3_<wbr>PROPERTIES: {<br>
+                       VkPhysicalDeviceMaintenance3Pr<wbr>operties *properties =<br>
+                           (<wbr>VkPhysicalDeviceMaintenance3Pr<wbr>operties*)ext;<br>
+                       /* Make sure evrything is addressable by a signed 32-bit int, and our<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">Typo: everything</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">Regards,</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial">Gustaw Smolarczyk</div><br>
+                        * largest descriptors are 96 bytes. */<br>
+                       properties-><wbr>maxPerSetDescriptors = (1ull << 31) / 96;<br>
+                       /* Our buffer size fields allow only this much */<br>
+                       properties-><wbr>maxMemoryAllocationSize = 0xFFFFFFFFull;<br>
+                       break;<br>
+               }<br>
                default:<br>
                        break;<br>
                }<br>
diff --git a/src/amd/vulkan/radv_<wbr>extensions.py b/src/amd/vulkan/radv_<wbr>extensions.py<br>
index 6fa553e589..3b4f75bff6 100644<br>
--- a/src/amd/vulkan/radv_<wbr>extensions.py<br>
+++ b/src/amd/vulkan/radv_<wbr>extensions.py<br>
@@ -70,6 +70,7 @@ EXTENSIONS = [<br>
     Extension('VK_KHR_incremental_<wbr>present',               1, True),<br>
     Extension('VK_KHR_<wbr>maintenance1',                      1, True),<br>
     Extension('VK_KHR_<wbr>maintenance2',                      1, True),<br>
+    Extension('VK_KHR_<wbr>maintenance3',                      1, True),<br>
     Extension('VK_KHR_push_<wbr>descriptor',                   1, True),<br>
     Extension('VK_KHR_relaxed_<wbr>block_layout',              1, True),<br>
     Extension('VK_KHR_sampler_<wbr>mirror_clamp_to_edge',      1, True),<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.16.1<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>