<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>