Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions loader/generated/vk_layer_dispatch_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
34 changes: 33 additions & 1 deletion loader/generated/vk_loader_extensions.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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; }

Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions loader/generated/vk_loader_extensions.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions loader/loader.rc
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
96 changes: 48 additions & 48 deletions loader/wsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion scripts/known_good.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions tests/framework/layer/generated/vk_dispatch_table_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down