From d0a64d5438a7355df2918c5311ea1c320530234a Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sat, 31 Oct 2015 00:31:16 +0800 Subject: [PATCH] bug 15045: vkGetPhysicalDeviceImageFormatProperties for unsupported formats (WIP) Change the return type of vkGetPhysicalDeviceImageFormatProperties. https://cvs.khronos.org/bugzilla/show_bug.cgi?id=15045 --- icd/nulldrv/nulldrv.c | 3 ++- include/vulkan.h | 9 +++++---- layers/device_limits.cpp | 4 ++-- layers/param_checker.cpp | 18 ++++++++++++++---- loader/loader.c | 10 ++++++---- loader/loader.h | 3 ++- loader/trampoline.c | 4 ++-- vulkan.py | 2 +- 8 files changed, 34 insertions(+), 19 deletions(-) diff --git a/icd/nulldrv/nulldrv.c b/icd/nulldrv/nulldrv.c index c2a0402..dd995c8 100644 --- a/icd/nulldrv/nulldrv.c +++ b/icd/nulldrv/nulldrv.c @@ -2151,7 +2151,7 @@ ICD_EXPORT VkResult xcbQueuePresent(void *queue, void *image, void* fence) return VK_SUCCESS; } -ICD_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties( +ICD_EXPORT VkResult VKAPI vkGetPhysicalDeviceImageFormatProperties( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, @@ -2160,4 +2160,5 @@ ICD_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties( VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) { + return VK_SUCCESS; } 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 @@ typedef enum VkResult { 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 void (VKAPI *PFN_vkDestroyInstance)(VkInstance instance, const VkAllocat 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 @@ void VKAPI vkGetPhysicalDeviceFormatProperties( 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 @@ VK_LAYER_EXPORT void VKAPI vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice 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 @@ bool PostGetPhysicalDeviceImageFormatProperties( VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, - VkImageFormatProperties* pImageFormatProperties) + VkImageFormatProperties* pImageFormatProperties, + VkResult result) { if(format < VK_FORMAT_BEGIN_RANGE || @@ -1897,10 +1898,17 @@ bool PostGetPhysicalDeviceImageFormatProperties( { } + 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 @@ VK_LAYER_EXPORT void VKAPI vkGetPhysicalDeviceImageFormatProperties( 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 @@ void VKAPI loader_GetPhysicalDeviceFormatProperties( 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 @@ void VKAPI loader_GetPhysicalDeviceImageFormatProperties( 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 @@ void VKAPI loader_GetPhysicalDeviceFormatProperties( 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 @@ LOADER_EXPORT void VKAPI vkGetPhysicalDeviceFormatProperties( 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 @@ core = Extension( Param("VkFormat", "format"), Param("VkFormatProperties*", "pFormatProperties")]), - Proto("void", "GetPhysicalDeviceImageFormatProperties", + Proto("VkResult", "GetPhysicalDeviceImageFormatProperties", [Param("VkPhysicalDevice", "physicalDevice"), Param("VkFormat", "format"), Param("VkImageType", "type"), -- 2.7.4