bug 15045: vkGetPhysicalDeviceImageFormatProperties for unsupported formats (WIP)

Change the return type of vkGetPhysicalDeviceImageFormatProperties.

https://cvs.khronos.org/bugzilla/show_bug.cgi?id=15045
diff --git a/include/vulkan.h b/include/vulkan.h
index b980e11..322ca2a 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -124,9 +124,10 @@
     VK_ERROR_FEATURE_NOT_PRESENT = -8,
     VK_ERROR_INCOMPATIBLE_DRIVER = -9,
     VK_ERROR_TOO_MANY_OBJECTS = -10,
-    VK_RESULT_BEGIN_RANGE = VK_ERROR_TOO_MANY_OBJECTS,
+    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,
+    VK_RESULT_BEGIN_RANGE = VK_ERROR_FORMAT_NOT_SUPPORTED,
     VK_RESULT_END_RANGE = VK_INCOMPLETE,
-    VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_TOO_MANY_OBJECTS + 1),
+    VK_RESULT_RANGE_SIZE = (VK_INCOMPLETE - VK_ERROR_FORMAT_NOT_SUPPORTED + 1),
     VK_RESULT_MAX_ENUM = 0x7FFFFFFF
 } VkResult;
 
@@ -2140,7 +2141,7 @@
 typedef VkResult (VKAPI *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
 typedef void (VKAPI *PFN_vkGetPhysicalDeviceFeatures)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures);
 typedef void (VKAPI *PFN_vkGetPhysicalDeviceFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties);
-typedef void (VKAPI *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);
+typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceImageFormatProperties)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties);
 typedef void (VKAPI *PFN_vkGetPhysicalDeviceProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties);
 typedef void (VKAPI *PFN_vkGetPhysicalDeviceQueueFamilyProperties)(VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties);
 typedef void (VKAPI *PFN_vkGetPhysicalDeviceMemoryProperties)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties);
@@ -2297,7 +2298,7 @@
     VkFormat                                    format,
     VkFormatProperties*                         pFormatProperties);
 
-void VKAPI vkGetPhysicalDeviceImageFormatProperties(
+VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties(
     VkPhysicalDevice                            physicalDevice,
     VkFormat                                    format,
     VkImageType                                 type,
diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp
index 257a669..4f9e1b0 100644
--- a/layers/device_limits.cpp
+++ b/layers/device_limits.cpp
@@ -257,9 +257,9 @@
                                      physicalDevice, format, pFormatProperties);
 }
 
-VK_LAYER_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
+VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
 {
-    get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map)->instance_dispatch_table->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    return get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map)->instance_dispatch_table->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
 }
 
 VK_LAYER_EXPORT void VKAPI vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties)
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index dfb1f44..44f57e6 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -1865,7 +1865,8 @@
     VkImageTiling tiling,
     VkImageUsageFlags usage,
     VkImageCreateFlags flags,
-    VkImageFormatProperties* pImageFormatProperties)
+    VkImageFormatProperties* pImageFormatProperties,
+    VkResult result)
 {
 
     if(format < VK_FORMAT_BEGIN_RANGE ||
@@ -1897,10 +1898,17 @@
     {
     }
 
+    if(result < VK_SUCCESS)
+    {
+        std::string reason = "vkGetPhysicalDeviceImageFormatProperties parameter, VkResult result, is " + EnumeratorString(result);
+        log_msg(mdd(physicalDevice), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "PARAMCHECK", reason.c_str());
+        return false;
+    }
+
     return true;
 }
 
-VK_LAYER_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties(
+VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties(
     VkPhysicalDevice physicalDevice,
     VkFormat format,
     VkImageType type,
@@ -1909,9 +1917,11 @@
     VkImageCreateFlags flags,
     VkImageFormatProperties* pImageFormatProperties)
 {
-    get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    VkResult result = get_dispatch_table(pc_instance_table_map, physicalDevice)->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
 
-    PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    PostGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties, result);
+
+    return result;
 }
 
 bool PostGetPhysicalDeviceProperties(
diff --git a/loader/loader.c b/loader/loader.c
index 13dd90f..3062da0 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2916,7 +2916,7 @@
         icd->GetPhysicalDeviceFormatProperties(phys_dev->phys_dev, format, pFormatInfo);
 }
 
-void VKAPI loader_GetPhysicalDeviceImageFormatProperties(
+VkResult VKAPI loader_GetPhysicalDeviceImageFormatProperties(
         VkPhysicalDevice                        physicalDevice,
         VkFormat                                format,
         VkImageType                             type,
@@ -2928,9 +2928,11 @@
     struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
     struct loader_icd *icd = phys_dev->this_icd;
 
-    if (icd->GetPhysicalDeviceImageFormatProperties)
-        icd->GetPhysicalDeviceImageFormatProperties(phys_dev->phys_dev, format,
-                                type, tiling, usage, flags, pImageFormatProperties);
+    if (!icd->GetPhysicalDeviceImageFormatProperties)
+        return VK_ERROR_INITIALIZATION_FAILED;
+
+    return icd->GetPhysicalDeviceImageFormatProperties(phys_dev->phys_dev, format,
+            type, tiling, usage, flags, pImageFormatProperties);
 }
 
 void VKAPI loader_GetPhysicalDeviceSparseImageFormatProperties(
diff --git a/loader/loader.h b/loader/loader.h
index f356a79..f91e86c 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -290,7 +290,8 @@
         VkFormat                                format,
         VkFormatProperties*                     pFormatInfo);
 
-void VKAPI loader_GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice                        physicalDevice,
+VkResult VKAPI loader_GetPhysicalDeviceImageFormatProperties(
+        VkPhysicalDevice                        physicalDevice,
         VkFormat                                format,
         VkImageType                             type,
         VkImageTiling                           tiling,
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 99c5279..1186b27 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -226,12 +226,12 @@
     disp->GetPhysicalDeviceFormatProperties(gpu, format, pFormatInfo);
 }
 
-LOADER_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
+LOADER_EXPORT VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
 {
     const VkLayerInstanceDispatchTable *disp;
 
     disp = loader_get_instance_dispatch(physicalDevice);
-    disp->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    return disp->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
 }
 
 LOADER_EXPORT void VKAPI vkGetPhysicalDeviceProperties(
diff --git a/vulkan.py b/vulkan.py
index d7d7c2f..ed2f4a7 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -233,7 +233,7 @@
              Param("VkFormat", "format"),
              Param("VkFormatProperties*", "pFormatProperties")]),
 
-        Proto("void", "GetPhysicalDeviceImageFormatProperties",
+        Proto("VkResult", "GetPhysicalDeviceImageFormatProperties",
             [Param("VkPhysicalDevice", "physicalDevice"),
              Param("VkFormat", "format"),
              Param("VkImageType", "type"),