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"),