diff --git a/CMakeLists.txt b/CMakeLists.txt index 944a8f673..a30752492 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ # ~~~ cmake_minimum_required(VERSION 3.22.1) -project(VULKAN_LOADER VERSION 1.4.320 LANGUAGES C) +project(VULKAN_LOADER VERSION 1.4.321 LANGUAGES C) option(CODE_COVERAGE "Enable Code Coverage" OFF) if (CODE_COVERAGE) diff --git a/loader/generated/vk_layer_dispatch_table.h b/loader/generated/vk_layer_dispatch_table.h index ce2a6ddeb..b7c806ee4 100644 --- a/loader/generated/vk_layer_dispatch_table.h +++ b/loader/generated/vk_layer_dispatch_table.h @@ -729,6 +729,9 @@ typedef struct VkLayerDispatchTable_ { PFN_vkGetPipelineBinaryDataKHR GetPipelineBinaryDataKHR; PFN_vkReleaseCapturedPipelineDataKHR ReleaseCapturedPipelineDataKHR; + // ---- VK_KHR_swapchain_maintenance1 extension commands + PFN_vkReleaseSwapchainImagesKHR ReleaseSwapchainImagesKHR; + // ---- VK_KHR_line_rasterization extension commands PFN_vkCmdSetLineStippleKHR CmdSetLineStippleKHR; diff --git a/loader/generated/vk_loader_extensions.c b/loader/generated/vk_loader_extensions.c index dc80940a8..4e4b9ad76 100644 --- a/loader/generated/vk_loader_extensions.c +++ b/loader/generated/vk_loader_extensions.c @@ -767,6 +767,9 @@ VKAPI_ATTR void VKAPI_CALL loader_init_device_extension_dispatch_table(struct lo table->GetPipelineBinaryDataKHR = (PFN_vkGetPipelineBinaryDataKHR)gdpa(dev, "vkGetPipelineBinaryDataKHR"); table->ReleaseCapturedPipelineDataKHR = (PFN_vkReleaseCapturedPipelineDataKHR)gdpa(dev, "vkReleaseCapturedPipelineDataKHR"); + // ---- VK_KHR_swapchain_maintenance1 extension commands + table->ReleaseSwapchainImagesKHR = (PFN_vkReleaseSwapchainImagesKHR)gdpa(dev, "vkReleaseSwapchainImagesKHR"); + // ---- VK_KHR_line_rasterization extension commands table->CmdSetLineStippleKHR = (PFN_vkCmdSetLineStippleKHR)gdpa(dev, "vkCmdSetLineStippleKHR"); @@ -2726,6 +2729,9 @@ VKAPI_ATTR void* VKAPI_CALL loader_lookup_device_dispatch_table(const VkLayerDis if (!strcmp(name, "GetPipelineBinaryDataKHR")) return (void *)table->GetPipelineBinaryDataKHR; if (!strcmp(name, "ReleaseCapturedPipelineDataKHR")) return (void *)table->ReleaseCapturedPipelineDataKHR; + // ---- VK_KHR_swapchain_maintenance1 extension commands + if (!strcmp(name, "ReleaseSwapchainImagesKHR")) return (void *)table->ReleaseSwapchainImagesKHR; + // ---- VK_KHR_line_rasterization extension commands if (!strcmp(name, "CmdSetLineStippleKHR")) return (void *)table->CmdSetLineStippleKHR; @@ -5291,6 +5297,22 @@ VKAPI_ATTR VkResult VKAPI_CALL ReleaseCapturedPipelineDataKHR( } +// ---- VK_KHR_swapchain_maintenance1 extension trampoline/terminators + +VKAPI_ATTR VkResult VKAPI_CALL ReleaseSwapchainImagesKHR( + VkDevice device, + const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo) { + const VkLayerDispatchTable *disp = loader_get_dispatch(device); + if (NULL == disp) { + loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, + "vkReleaseSwapchainImagesKHR: Invalid device " + "[VUID-vkReleaseSwapchainImagesKHR-device-parameter]"); + abort(); /* Intentionally fail so user can correct issue. */ + } + return disp->ReleaseSwapchainImagesKHR(device, pReleaseInfo); +} + + // ---- VK_KHR_cooperative_matrix extension trampoline/terminators VKAPI_ATTR VkResult VKAPI_CALL GetPhysicalDeviceCooperativeMatrixPropertiesKHR( @@ -7736,7 +7758,7 @@ VKAPI_ATTR void VKAPI_CALL GetImageSubresourceLayout2EXT( VKAPI_ATTR VkResult VKAPI_CALL ReleaseSwapchainImagesEXT( VkDevice device, - const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) { + const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo) { const VkLayerDispatchTable *disp = loader_get_dispatch(device); if (NULL == disp) { loader_log(NULL, VULKAN_LOADER_FATAL_ERROR_BIT | VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0, @@ -11742,6 +11764,12 @@ bool extension_instance_gpa(struct loader_instance *ptr_instance, const char *na return true; } + // ---- VK_KHR_swapchain_maintenance1 extension commands + if (!strcmp("vkReleaseSwapchainImagesKHR", name)) { + *addr = (void *)ReleaseSwapchainImagesKHR; + return true; + } + // ---- VK_KHR_cooperative_matrix extension commands if (!strcmp("vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR", name)) { *addr = (void *)GetPhysicalDeviceCooperativeMatrixPropertiesKHR; @@ -13534,6 +13562,9 @@ void fill_out_enabled_instance_extensions(uint32_t extension_count, const char * // ---- VK_KHR_portability_enumeration extension commands else if (0 == strcmp(extension_list[i], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) { enables->khr_portability_enumeration = 1; } + // ---- VK_KHR_surface_maintenance1 extension commands + else if (0 == strcmp(extension_list[i], VK_KHR_SURFACE_MAINTENANCE_1_EXTENSION_NAME)) { enables->khr_surface_maintenance1 = 1; } + // ---- VK_EXT_debug_report extension commands else if (0 == strcmp(extension_list[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) { enables->ext_debug_report = 1; } @@ -14023,6 +14054,7 @@ const char *const LOADER_INSTANCE_EXTENSIONS[] = { VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME, VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, + VK_KHR_SURFACE_MAINTENANCE_1_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_EXTENSION_NAME, #if defined(VK_USE_PLATFORM_GGP) VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME, diff --git a/loader/generated/vk_loader_extensions.h b/loader/generated/vk_loader_extensions.h index 9bb6d3b41..b8c55aa49 100644 --- a/loader/generated/vk_loader_extensions.h +++ b/loader/generated/vk_loader_extensions.h @@ -526,6 +526,7 @@ struct loader_instance_extension_enable_list { uint8_t khr_get_display_properties2; uint8_t khr_surface_protected_capabilities; uint8_t khr_portability_enumeration; + uint8_t khr_surface_maintenance1; uint8_t ext_debug_report; #if defined(VK_USE_PLATFORM_GGP) uint8_t ggp_stream_descriptor_surface; diff --git a/loader/loader.rc b/loader/loader.rc index 705e8dc60..242a54f79 100644 --- a/loader/loader.rc +++ b/loader/loader.rc @@ -22,8 +22,8 @@ #include "winres.h" // All set through CMake -#define VER_FILE_VERSION 1, 4, 320, 0 -#define VER_FILE_DESCRIPTION_STR "1.4.320.Dev Build" +#define VER_FILE_VERSION 1, 4, 321, 0 +#define VER_FILE_DESCRIPTION_STR "1.4.321.Dev Build" #define VER_FILE_VERSION_STR "Vulkan Loader - Dev Build" #define VER_COPYRIGHT_STR "Copyright (C) 2015-2025" diff --git a/loader/wsi.c b/loader/wsi.c index 6308c5f5b..af821361b 100644 --- a/loader/wsi.c +++ b/loader/wsi.c @@ -2585,58 +2585,54 @@ vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice physicalDevice, cons return disp->GetPhysicalDeviceSurfaceCapabilities2KHR(unwrapped_phys_dev, pSurfaceInfo, pSurfaceCapabilities); } -void emulate_VK_EXT_surface_maintenance1(struct loader_icd_term *icd_term, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, +void emulate_VK_KHR_surface_maintenance1(const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, VkSurfaceCapabilities2KHR *pSurfaceCapabilities) { - // Because VK_EXT_surface_maintenance1 is an instance extension, applications will use it to query info on drivers which do + // Because VK_KHR_surface_maintenance1 is an instance extension, applications will use it to query info on drivers which do // not support the extension. Thus we need to emulate the driver filling out the structs in that case. - if (!icd_term->enabled_instance_extensions.ext_surface_maintenance1) { - VkPresentModeKHR present_mode = VK_PRESENT_MODE_MAX_ENUM_KHR; - const void *void_pNext = pSurfaceInfo->pNext; - while (void_pNext) { - VkBaseOutStructure out_structure = {0}; - memcpy(&out_structure, void_pNext, sizeof(VkBaseOutStructure)); - if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT) { - VkSurfacePresentModeEXT *surface_present_mode = (VkSurfacePresentModeEXT *)void_pNext; - present_mode = surface_present_mode->presentMode; - } - void_pNext = out_structure.pNext; - } - // If no VkSurfacePresentModeEXT was present, return - if (present_mode == VK_PRESENT_MODE_MAX_ENUM_KHR) { - return; + VkPresentModeKHR present_mode = VK_PRESENT_MODE_MAX_ENUM_KHR; + const void *void_pNext = pSurfaceInfo->pNext; + while (void_pNext) { + VkBaseOutStructure out_structure = {0}; + memcpy(&out_structure, void_pNext, sizeof(VkBaseOutStructure)); + if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_KHR) { + VkSurfacePresentModeKHR *surface_present_mode = (VkSurfacePresentModeKHR *)void_pNext; + present_mode = surface_present_mode->presentMode; } - - void_pNext = pSurfaceCapabilities->pNext; - while (void_pNext) { - VkBaseOutStructure out_structure = {0}; - memcpy(&out_structure, void_pNext, sizeof(VkBaseOutStructure)); - if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT) { - VkSurfacePresentModeCompatibilityEXT *surface_present_mode_compatibility = - (VkSurfacePresentModeCompatibilityEXT *)void_pNext; - if (surface_present_mode_compatibility->pPresentModes) { - if (surface_present_mode_compatibility->presentModeCount != 0) { - surface_present_mode_compatibility->pPresentModes[0] = present_mode; - surface_present_mode_compatibility->presentModeCount = 1; - } - } else { + void_pNext = out_structure.pNext; + } + // If no VkSurfacePresentModeKHR was present, return + if (present_mode == VK_PRESENT_MODE_MAX_ENUM_KHR) { + return; + } + + void_pNext = pSurfaceCapabilities->pNext; + while (void_pNext) { + VkBaseOutStructure out_structure = {0}; + memcpy(&out_structure, void_pNext, sizeof(VkBaseOutStructure)); + if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_KHR) { + VkSurfacePresentModeCompatibilityKHR *surface_present_mode_compatibility = + (VkSurfacePresentModeCompatibilityKHR *)void_pNext; + if (surface_present_mode_compatibility->pPresentModes) { + if (surface_present_mode_compatibility->presentModeCount != 0) { + surface_present_mode_compatibility->pPresentModes[0] = present_mode; surface_present_mode_compatibility->presentModeCount = 1; } - - } else if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT) { - // Because there is no way to fill out the information faithfully, set scaled max/min image extent to the - // surface capabilities max/min extent and the rest to zero. - VkSurfacePresentScalingCapabilitiesEXT *surface_present_scaling_capabilities = - (VkSurfacePresentScalingCapabilitiesEXT *)void_pNext; - surface_present_scaling_capabilities->supportedPresentScaling = 0; - surface_present_scaling_capabilities->supportedPresentGravityX = 0; - surface_present_scaling_capabilities->supportedPresentGravityY = 0; - surface_present_scaling_capabilities->maxScaledImageExtent = - pSurfaceCapabilities->surfaceCapabilities.maxImageExtent; - surface_present_scaling_capabilities->minScaledImageExtent = - pSurfaceCapabilities->surfaceCapabilities.minImageExtent; + } else { + surface_present_mode_compatibility->presentModeCount = 1; } - void_pNext = out_structure.pNext; + + } else if (out_structure.sType == VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_KHR) { + // Because there is no way to fill out the information faithfully, set scaled max/min image extent to the + // surface capabilities max/min extent and the rest to zero. + VkSurfacePresentScalingCapabilitiesKHR *surface_present_scaling_capabilities = + (VkSurfacePresentScalingCapabilitiesKHR *)void_pNext; + surface_present_scaling_capabilities->supportedPresentScaling = 0; + surface_present_scaling_capabilities->supportedPresentGravityX = 0; + surface_present_scaling_capabilities->supportedPresentGravityY = 0; + surface_present_scaling_capabilities->maxScaledImageExtent = pSurfaceCapabilities->surfaceCapabilities.maxImageExtent; + surface_present_scaling_capabilities->minScaledImageExtent = pSurfaceCapabilities->surfaceCapabilities.minImageExtent; } + void_pNext = out_structure.pNext; } } @@ -2684,8 +2680,9 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilities2K // Because VK_EXT_surface_maintenance1 is an instance extension, applications will use it to query info on drivers which do // not support the extension. Thus we need to emulate the driver filling out the structs in that case. - if (!icd_term->enabled_instance_extensions.ext_surface_maintenance1) { - emulate_VK_EXT_surface_maintenance1(icd_term, pSurfaceInfo, pSurfaceCapabilities); + if (!icd_term->enabled_instance_extensions.khr_surface_maintenance1 && + !icd_term->enabled_instance_extensions.ext_surface_maintenance1) { + emulate_VK_KHR_surface_maintenance1(pSurfaceInfo, pSurfaceCapabilities); } return res; @@ -2708,7 +2705,10 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceSurfaceCapabilities2K VkResult res = icd_term->dispatch.GetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev_term->phys_dev, surface, &pSurfaceCapabilities->surfaceCapabilities); - emulate_VK_EXT_surface_maintenance1(icd_term, pSurfaceInfo, pSurfaceCapabilities); + if (!icd_term->enabled_instance_extensions.khr_surface_maintenance1 && + !icd_term->enabled_instance_extensions.ext_surface_maintenance1) { + emulate_VK_KHR_surface_maintenance1(pSurfaceInfo, pSurfaceCapabilities); + } return res; } } diff --git a/scripts/known_good.json b/scripts/known_good.json index a69f843e5..836385048 100644 --- a/scripts/known_good.json +++ b/scripts/known_good.json @@ -7,7 +7,7 @@ "sub_dir": "Vulkan-Headers", "build_dir": "Vulkan-Headers/build", "install_dir": "Vulkan-Headers/build/install", - "commit": "v1.4.320" + "commit": "v1.4.321" }, { "name": "googletest", diff --git a/tests/framework/layer/generated/vk_dispatch_table_helper.h b/tests/framework/layer/generated/vk_dispatch_table_helper.h index f8379812b..498352781 100644 --- a/tests/framework/layer/generated/vk_dispatch_table_helper.h +++ b/tests/framework/layer/generated/vk_dispatch_table_helper.h @@ -361,6 +361,7 @@ static inline void layer_init_device_dispatch_table(VkDevice device, VkLayerDisp table->GetPipelineKeyKHR = (PFN_vkGetPipelineKeyKHR)gpa(device, "vkGetPipelineKeyKHR"); table->GetPipelineBinaryDataKHR = (PFN_vkGetPipelineBinaryDataKHR)gpa(device, "vkGetPipelineBinaryDataKHR"); table->ReleaseCapturedPipelineDataKHR = (PFN_vkReleaseCapturedPipelineDataKHR)gpa(device, "vkReleaseCapturedPipelineDataKHR"); + table->ReleaseSwapchainImagesKHR = (PFN_vkReleaseSwapchainImagesKHR)gpa(device, "vkReleaseSwapchainImagesKHR"); table->CmdSetLineStippleKHR = (PFN_vkCmdSetLineStippleKHR)gpa(device, "vkCmdSetLineStippleKHR"); table->GetCalibratedTimestampsKHR = (PFN_vkGetCalibratedTimestampsKHR)gpa(device, "vkGetCalibratedTimestampsKHR"); table->CmdBindDescriptorSets2KHR = (PFN_vkCmdBindDescriptorSets2KHR)gpa(device, "vkCmdBindDescriptorSets2KHR");