<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">Having read through this code, I think I like this approach.  It seems to be the most easily extensible thing we can do.  Series is<br><br></div><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_quote"><br>On Wed, Jan 25, 2017 at 12:12 PM, Chad Versace <span dir="ltr"><<a href="mailto:chadversary@chromium.org" target="_blank">chadversary@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
 src/intel/vulkan/anv_device.c  | 90 ++++++++++++++++++++++++++++++<wbr>++++++++++++<br>
 src/intel/vulkan/anv_formats.c | 53 +++++++++++++++++++++++++<br>
 src/intel/vulkan/anv_private.h | 18 +++++++++<br>
 3 files changed, 161 insertions(+)<br>
<br>
diff --git a/src/intel/vulkan/anv_device.<wbr>c b/src/intel/vulkan/anv_device.<wbr>c<br>
index 5c9652290f..5f86444ed9 100644<br>
--- a/src/intel/vulkan/anv_device.<wbr>c<br>
+++ b/src/intel/vulkan/anv_device.<wbr>c<br>
@@ -253,6 +253,10 @@ static const VkExtensionProperties global_extensions[] = {<br>
       .specVersion = 5,<br>
    },<br>
 #endif<br>
+   {<br>
+      .extensionName = VK_KHR_GET_PHYSICAL_DEVICE_<wbr>PROPERTIES_2_EXTENSION_NAME,<br>
+      .specVersion = 1,<br>
+   },<br>
 };<br>
<br>
 static const VkExtensionProperties device_extensions[] = {<br>
@@ -493,6 +497,21 @@ void anv_GetPhysicalDeviceFeatures(<br>
       pdevice->compiler->scalar_<wbr>stage[MESA_SHADER_GEOMETRY];<br>
 }<br>
<br>
+void anv_<wbr>GetPhysicalDeviceFeatures2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    VkPhysicalDeviceFeatures2KHR*               pFeatures)<br>
+{<br>
+   anv_GetPhysicalDeviceFeatures(<wbr>physicalDevice, &pFeatures->features);<br>
+<br>
+   for (struct anv_common *c = pFeatures->pNext; c != NULL; c = c->pNext) {<br></blockquote><div><br></div><div>It seems like it might be nice to have an anv_foreach_ext_struct macro so this becomes:<br><br></div><div>anv_foreach_ext_struct(s, pFeatures) {<br>}<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+}<br>
+<br>
 void anv_<wbr>GetPhysicalDeviceProperties(<br>
     VkPhysicalDevice                            physicalDevice,<br>
     VkPhysicalDeviceProperties*                 pProperties)<br>
@@ -636,6 +655,21 @@ void anv_<wbr>GetPhysicalDeviceProperties(<br>
    memcpy(pProperties-><wbr>pipelineCacheUUID, pdevice->uuid, VK_UUID_SIZE);<br>
 }<br>
<br>
+void anv_<wbr>GetPhysicalDeviceProperties2KH<wbr>R(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    VkPhysicalDeviceProperties2KHR<wbr>*             pProperties)<br>
+{<br>
+   anv_<wbr>GetPhysicalDeviceProperties(<wbr>physicalDevice, &pProperties->properties);<br>
+<br>
+   for (struct anv_common *c = pProperties->pNext; c != NULL; c = c->pNext) {<br>
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+}<br>
+<br>
 static void<br>
 anv_get_queue_family_<wbr>properties(struct anv_physical_device *phys_dev,<br>
                                 VkQueueFamilyProperties *props)<br>
@@ -675,6 +709,45 @@ void anv_<wbr>GetPhysicalDeviceQueueFamilyPr<wbr>operties(<br>
    anv_get_queue_family_<wbr>properties(phys_dev, pQueueFamilyProperties);<br>
 }<br>
<br>
+void anv_<wbr>GetPhysicalDeviceQueueFamilyPr<wbr>operties2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    uint32_t*                                   pQueueFamilyPropertyCount,<br>
+    VkQueueFamilyProperties2KHR*                pQueueFamilyProperties)<br>
+{<br>
+<br>
+   ANV_FROM_HANDLE(anv_physical_<wbr>device, phys_dev, physicalDevice);<br>
+<br>
+   if (pQueueFamilyProperties == NULL) {<br>
+      *pQueueFamilyPropertyCount = 1;<br>
+      return;<br>
+   }<br>
+<br>
+   /* The spec implicitly allows the incoming count to be 0. From the Vulkan<br>
+    * 1.0.38 spec, Section 4.1 Physical Devices:<br>
+    *<br>
+    *     If the value referenced by pQueueFamilyPropertyCount is not 0 [then<br>
+    *     do stuff].<br>
+    */<br>
+   if (*pQueueFamilyPropertyCount == 0)<br>
+      return;<br>
+<br>
+   /* We support exactly one queue family. So need to traverse only the first<br>
+    * array element's pNext chain.<br>
+    */<br>
+   *pQueueFamilyPropertyCount = 1;<br>
+   anv_get_queue_family_<wbr>properties(phys_dev,<br>
+         &pQueueFamilyProperties-><wbr>queueFamilyProperties);<br>
+<br>
+   for (struct anv_common *c = pQueueFamilyProperties->pNext;<br>
+        c != NULL; c = c->pNext) {<br>
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+}<br>
+<br>
 void anv_<wbr>GetPhysicalDeviceMemoryPropert<wbr>ies(<br>
     VkPhysicalDevice                            physicalDevice,<br>
     VkPhysicalDeviceMemoryProperti<wbr>es*           pMemoryProperties)<br>
@@ -727,6 +800,23 @@ void anv_<wbr>GetPhysicalDeviceMemoryPropert<wbr>ies(<br>
    };<br>
 }<br>
<br>
+void anv_<wbr>GetPhysicalDeviceMemoryPropert<wbr>ies2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    VkPhysicalDeviceMemoryProperti<wbr>es2KHR*       pMemoryProperties)<br>
+{<br>
+   anv_<wbr>GetPhysicalDeviceMemoryPropert<wbr>ies(physicalDevice,<br>
+                                         &pMemoryProperties-><wbr>memoryProperties);<br>
+<br>
+   for (struct anv_common *c = pMemoryProperties->pNext;<br>
+        c != NULL; c = c->pNext) {<br>
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+}<br>
+<br>
 PFN_vkVoidFunction anv_GetInstanceProcAddr(<br>
     VkInstance                                  instance,<br>
     const char*                                 pName)<br>
diff --git a/src/intel/vulkan/anv_<wbr>formats.c b/src/intel/vulkan/anv_<wbr>formats.c<br>
index b4ff9c7698..e7a04f313c 100644<br>
--- a/src/intel/vulkan/anv_<wbr>formats.c<br>
+++ b/src/intel/vulkan/anv_<wbr>formats.c<br>
@@ -450,6 +450,24 @@ void anv_<wbr>GetPhysicalDeviceFormatPropert<wbr>ies(<br>
                pFormatProperties);<br>
 }<br>
<br>
+void anv_<wbr>GetPhysicalDeviceFormatPropert<wbr>ies2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    VkFormat                                    format,<br>
+    VkFormatProperties2KHR*                     pFormatProperties)<br>
+{<br>
+   anv_<wbr>GetPhysicalDeviceFormatPropert<wbr>ies(physicalDevice, format,<br>
+                                         &pFormatProperties-><wbr>formatProperties);<br>
+<br>
+   for (struct anv_common *c = pFormatProperties->pNext;<br>
+        c != NULL; c = c->pNext) {<br>
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+}<br>
+<br>
 static VkResult<br>
 anv_get_image_format_<wbr>properties(<br>
    struct anv_physical_device *physical_device,<br>
@@ -625,6 +643,31 @@ VkResult anv_<wbr>GetPhysicalDeviceImageFormatPr<wbr>operties(<br>
                                           pImageFormatProperties);<br>
 }<br>
<br>
+VkResult vkGetPhysicalDeviceImageFormat<wbr>Properties2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    const VkPhysicalDeviceImageFormatInf<wbr>o2KHR*  pImageFormatInfo,<br>
+    VkImageFormatProperties2KHR*                pImageFormatProperties)<br>
+{<br>
+   ANV_FROM_HANDLE(anv_physical_<wbr>device, physical_device, physicalDevice);<br>
+   VkResult result;<br>
+<br>
+   result = anv_get_image_format_<wbr>properties(physical_device, pImageFormatInfo,<br>
+               &pImageFormatProperties-><wbr>imageFormatProperties);<br>
+   if (result != VK_SUCCESS)<br>
+      return result;<br>
+<br>
+   for (struct anv_common *c = pImageFormatProperties->pNext;<br>
+        c != NULL; c = c->pNext) {<br>
+      switch (c->sType) {<br>
+      default:<br>
+         anv_debug_ignored_stype(c-><wbr>sType);<br>
+         break;<br>
+      }<br>
+   }<br>
+<br>
+   return VK_SUCCESS;<br>
+}<br>
+<br>
 void anv_<wbr>GetPhysicalDeviceSparseImageFo<wbr>rmatProperties(<br>
     VkPhysicalDevice                            physicalDevice,<br>
     VkFormat                                    format,<br>
@@ -638,3 +681,13 @@ void anv_<wbr>GetPhysicalDeviceSparseImageFo<wbr>rmatProperties(<br>
    /* Sparse images are not yet supported. */<br>
    *pNumProperties = 0;<br>
 }<br>
+<br>
+void vkGetPhysicalDeviceSparseImage<wbr>FormatProperties2KHR(<br>
+    VkPhysicalDevice                            physicalDevice,<br>
+    const VkPhysicalDeviceSparseImageFor<wbr>matInfo2KHR* pFormatInfo,<br>
+    uint32_t*                                   pPropertyCount,<br>
+    VkSparseImageFormatProperties2<wbr>KHR*          pProperties)<br>
+{<br>
+   /* Sparse images are not yet supported. */<br>
+   *pPropertyCount = 0;<br>
+}<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index 2a071693ca..8b1ada29f8 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -206,6 +206,24 @@ VkResult __vk_errorf(VkResult error, const char *file, int line, const char *for<br>
 #define anv_debug(format, ...)<br>
 #endif<br>
<br>
+/**<br>
+ * Warn on ignored extension structs.<br>
+ *<br>
+ * The Vulkan spec requires us to ignore unsupported or unknown structs in<br>
+ * a pNext chain.  In debug mode, emitting warnings for ignored structs may<br>
+ * help us discover structs that we should not have ignored.<br>
+ *<br>
+ *<br>
+ * From the Vulkan 1.0.38 spec:<br>
+ *<br>
+ *    Any component of the implementation (the loader, any enabled layers,<br>
+ *    and drivers) must skip over, without processing (other than reading the<br>
+ *    sType and pNext members) any chained structures with sType values not<br>
+ *    defined by extensions supported by that component.<br>
+ */<br>
+#define anv_debug_ignored_stype(sType) \<br>
+   anv_debug("debug: %s: ignored VkStructureType %u\n", __func__, (sType))<br>
+<br>
 void __anv_finishme(const char *file, int line, const char *format, ...)<br>
    anv_printflike(3, 4);<br>
 void anv_loge(const char *format, ...) anv_printflike(1, 2);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.11.0<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>