aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2016-03-08 09:30:30 -0700
committerJon Ashburn <jon@lunarg.com>2016-03-08 09:57:05 -0700
commit5a7389ed345e3aaf769470201453bc22f82fde90 (patch)
treea227bf65c78d514541d86c405fdb51010e5ee28e /loader
parent3b6297ef6ecf88cd8291491534c089dfe48f380d (diff)
downloadusermoji-5a7389ed345e3aaf769470201453bc22f82fde90.tar.xz
loader: gllvl #50, Add support for the WSI extension KHR_display
Change-Id: I8d5ecc7500beba3042a6b9147b2f3fd3055b3b1d
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c27
-rw-r--r--loader/loader.h16
-rw-r--r--loader/table_ops.h44
-rw-r--r--loader/wsi.c318
-rw-r--r--loader/wsi.h41
5 files changed, 435 insertions, 11 deletions
diff --git a/loader/loader.c b/loader/loader.c
index 383336d3..310cd0bf 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -152,6 +152,20 @@ const VkLayerInstanceDispatchTable instance_disp = {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
.CreateAndroidSurfaceKHR = terminator_CreateAndroidSurfaceKHR,
#endif
+ .GetPhysicalDeviceDisplayPropertiesKHR =
+ terminator_GetPhysicalDeviceDisplayPropertiesKHR,
+ .GetPhysicalDeviceDisplayPlanePropertiesKHR =
+ terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR,
+ .GetDisplayPlaneSupportedDisplaysKHR =
+ terminator_GetDisplayPlaneSupportedDisplaysKHR,
+ .GetDisplayModePropertiesKHR =
+ terminator_GetDisplayModePropertiesKHR,
+ .CreateDisplayModeKHR =
+ terminator_CreateDisplayModeKHR,
+ .GetDisplayPlaneCapabilitiesKHR =
+ terminator_GetDisplayPlaneCapabilitiesKHR,
+ .CreateDisplayPlaneSurfaceKHR =
+ terminator_CreateDisplayPlaneSurfaceKHR,
};
LOADER_PLATFORM_THREAD_ONCE_DECLARATION(once_init);
@@ -2602,15 +2616,16 @@ loader_gpa_instance_internal(VkInstance inst, const char *pName) {
if (disp_table == NULL)
return NULL;
- addr = loader_lookup_instance_dispatch_table(disp_table, pName);
- if (addr) {
+ bool found_name;
+ addr = loader_lookup_instance_dispatch_table(disp_table, pName, &found_name);
+ if (found_name) {
return addr;
}
- if (disp_table->GetInstanceProcAddr == NULL) {
- return NULL;
- }
- return disp_table->GetInstanceProcAddr(inst, pName);
+ // Don't call down the chain, this would be an infinite loop
+ loader_log(NULL, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0,
+ "loader_gpa_instance_internal() unrecognized name %s", pName);
+ return NULL;
}
/**
diff --git a/loader/loader.h b/loader/loader.h
index 23449663..ff7ab112 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -247,7 +247,20 @@ struct loader_icd {
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR
GetPhysicalDeviceXlibPresentationSupportKHR;
#endif
-
+ PFN_vkGetPhysicalDeviceDisplayPropertiesKHR
+ GetPhysicalDeviceDisplayPropertiesKHR;
+ PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR
+ GetPhysicalDeviceDisplayPlanePropertiesKHR;
+ PFN_vkGetDisplayPlaneSupportedDisplaysKHR
+ GetDisplayPlaneSupportedDisplaysKHR;
+ PFN_vkGetDisplayModePropertiesKHR
+ GetDisplayModePropertiesKHR;
+ PFN_vkCreateDisplayModeKHR
+ CreateDisplayModeKHR;
+ PFN_vkGetDisplayPlaneCapabilitiesKHR
+ GetDisplayPlaneCapabilitiesKHR;
+ PFN_vkCreateDisplayPlaneSurfaceKHR
+ CreateDisplayPlaneSurfaceKHR;
struct loader_icd *next;
};
@@ -304,6 +317,7 @@ struct loader_instance {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
bool wsi_android_surface_enabled;
#endif
+ bool wsi_display_enabled;
};
/* VkPhysicalDevice requires special treatment by loader. Firstly, terminator
diff --git a/loader/table_ops.h b/loader/table_ops.h
index 4bf8b410..a216e938 100644
--- a/loader/table_ops.h
+++ b/loader/table_ops.h
@@ -626,14 +626,38 @@ static inline void loader_init_instance_extension_dispatch_table(
(PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)gpa(
inst, "vkGetPhysicalDeviceXlibPresentationSupportKHR");
#endif
+ table->GetPhysicalDeviceDisplayPropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPropertiesKHR) gpa(inst,
+ "vkGetPhysicalDeviceDisplayPropertiesKHR");
+ table->GetPhysicalDeviceDisplayPlanePropertiesKHR =
+ (PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR) gpa(inst,
+ "vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
+ table->GetDisplayPlaneSupportedDisplaysKHR =
+ (PFN_vkGetDisplayPlaneSupportedDisplaysKHR) gpa(inst,
+ "vkGetDisplayPlaneSupportedDisplaysKHR");
+ table->GetDisplayModePropertiesKHR =
+ (PFN_vkGetDisplayModePropertiesKHR) gpa(inst,
+ "vkGetDisplayModePropertiesKHR");
+ table->CreateDisplayModeKHR =
+ (PFN_vkCreateDisplayModeKHR) gpa(inst,
+ "vkCreateDisplayModeKHR");
+ table->GetDisplayPlaneCapabilitiesKHR =
+ (PFN_vkGetDisplayPlaneCapabilitiesKHR) gpa(inst,
+ "vkGetDisplayPlaneCapabilitiesKHR");
+ table->CreateDisplayPlaneSurfaceKHR =
+ (PFN_vkCreateDisplayPlaneSurfaceKHR) gpa(inst,
+ "vkCreateDisplayPlaneSurfaceKHR");
}
static inline void *
loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table,
- const char *name) {
- if (!name || name[0] != 'v' || name[1] != 'k')
+ const char *name, bool *found_name) {
+ if (!name || name[0] != 'v' || name[1] != 'k') {
+ *found_name = false;
return NULL;
+ }
+ *found_name = true;
name += 2;
if (!strcmp(name, "DestroyInstance"))
return (void *)table->DestroyInstance;
@@ -699,6 +723,21 @@ loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table,
if (!strcmp(name, "GetPhysicalDeviceXlibPresentationSupportKHR"))
return (void *)table->GetPhysicalDeviceXlibPresentationSupportKHR;
#endif
+ if (!strcmp(name, "GetPhysicalDeviceDisplayPropertiesKHR"))
+ return (void *)table->GetPhysicalDeviceDisplayPropertiesKHR;
+ if (!strcmp(name, "GetPhysicalDeviceDisplayPlanePropertiesKHR"))
+ return (void *)table->GetPhysicalDeviceDisplayPlanePropertiesKHR;
+ if (!strcmp(name, "GetDisplayPlaneSupportedDisplaysKHR"))
+ return (void *)table->GetDisplayPlaneSupportedDisplaysKHR;
+ if (!strcmp(name, "GetDisplayModePropertiesKHR"))
+ return (void *)table->GetDisplayModePropertiesKHR;
+ if (!strcmp(name, "CreateDisplayModeKHR"))
+ return (void *)table->CreateDisplayModeKHR;
+ if (!strcmp(name, "GetDisplayPlaneCapabilitiesKHR"))
+ return (void *)table->GetDisplayPlaneCapabilitiesKHR;
+ if (!strcmp(name, "CreateDisplayPlaneSurfaceKHR"))
+ return (void *)table->CreateDisplayPlaneSurfaceKHR;
+
if (!strcmp(name, "CreateDebugReportCallbackEXT"))
return (void *)table->CreateDebugReportCallbackEXT;
if (!strcmp(name, "DestroyDebugReportCallbackEXT"))
@@ -706,5 +745,6 @@ loader_lookup_instance_dispatch_table(const VkLayerInstanceDispatchTable *table,
if (!strcmp(name, "DebugReportMessageEXT"))
return (void *)table->DebugReportMessageEXT;
+ *found_name = false;
return NULL;
}
diff --git a/loader/wsi.c b/loader/wsi.c
index 4d63f41a..d53ce4a9 100644
--- a/loader/wsi.c
+++ b/loader/wsi.c
@@ -84,6 +84,9 @@ static const VkExtensionProperties wsi_android_surface_extension_info = {
};
#endif // VK_USE_PLATFORM_ANDROID_KHR
+// Note for VK_DISPLAY_KHR don't advertise support since we really need support
+// to come from ICD, although the loader supplements the support from ICD
+
void wsi_add_instance_extensions(const struct loader_instance *inst,
struct loader_extension_list *ext_list) {
loader_add_to_ext_list(inst, ext_list, 1, &wsi_surface_extension_info);
@@ -115,7 +118,7 @@ void wsi_create_instance(struct loader_instance *ptr_instance,
ptr_instance->wsi_surface_enabled = false;
#ifdef VK_USE_PLATFORM_WIN32_KHR
- ptr_instance->wsi_win32_surface_enabled = true;
+ ptr_instance->wsi_win32_surface_enabled = false;
#endif // VK_USE_PLATFORM_WIN32_KHR
#ifdef VK_USE_PLATFORM_MIR_KHR
ptr_instance->wsi_mir_surface_enabled = false;
@@ -133,6 +136,8 @@ void wsi_create_instance(struct loader_instance *ptr_instance,
ptr_instance->wsi_android_surface_enabled = false;
#endif // VK_USE_PLATFORM_ANDROID_KHR
+ ptr_instance->wsi_display_enabled = false;
+
for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i],
VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
@@ -181,6 +186,11 @@ void wsi_create_instance(struct loader_instance *ptr_instance,
continue;
}
#endif // VK_USE_PLATFORM_ANDROID_KHR
+ if (strcmp(pCreateInfo->ppEnabledExtensionNames[i],
+ VK_KHR_DISPLAY_EXTENSION_NAME) == 0) {
+ ptr_instance->wsi_display_enabled = true;
+ continue;
+ }
}
}
@@ -200,6 +210,7 @@ vkDestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface,
disp->DestroySurfaceKHR(instance, surface, pAllocator);
}
+// TODO probably need to lock around all the loader_get_instance() calls.
/*
* This is the instance chain terminator function
* for DestroySurfaceKHR
@@ -940,6 +951,264 @@ terminator_CreateAndroidSurfaceKHR(VkInstance instance, Window window,
#endif // VK_USE_PLATFORM_ANDROID_KHR
+
+/*
+ * Functions for the VK_KHR_display instance extension:
+ */
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkGetPhysicalDeviceDisplayPropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPropertiesKHR* pProperties)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->GetPhysicalDeviceDisplayPropertiesKHR(
+ unwrapped_phys_dev, pPropertyCount, pProperties);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetPhysicalDeviceDisplayPropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPropertiesKHR* pProperties)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->GetPhysicalDeviceDisplayPropertiesKHR &&
+ "loader: null GetPhysicalDeviceDisplayPropertiesKHR ICD pointer");
+
+ return icd->GetPhysicalDeviceDisplayPropertiesKHR(
+ phys_dev->phys_dev, pPropertyCount, pProperties);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPlanePropertiesKHR* pProperties)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->GetPhysicalDeviceDisplayPlanePropertiesKHR(
+ unwrapped_phys_dev, pPropertyCount, pProperties);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPlanePropertiesKHR* pProperties)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->GetPhysicalDeviceDisplayPlanePropertiesKHR &&
+ "loader: null GetPhysicalDeviceDisplayPlanePropertiesKHR ICD pointer");
+
+ return icd->GetPhysicalDeviceDisplayPlanePropertiesKHR(
+ phys_dev->phys_dev, pPropertyCount, pProperties);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkGetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->GetDisplayPlaneSupportedDisplaysKHR(
+ unwrapped_phys_dev, planeIndex, pDisplayCount, pDisplays);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->GetDisplayPlaneSupportedDisplaysKHR &&
+ "loader: null GetDisplayPlaneSupportedDisplaysKHR ICD pointer");
+
+ return icd->GetDisplayPlaneSupportedDisplaysKHR(
+ phys_dev->phys_dev, planeIndex, pDisplayCount, pDisplays);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkGetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->GetDisplayModePropertiesKHR(
+ unwrapped_phys_dev, display, pPropertyCount, pProperties);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->GetDisplayModePropertiesKHR &&
+ "loader: null GetDisplayModePropertiesKHR ICD pointer");
+
+ return icd->GetDisplayModePropertiesKHR(
+ phys_dev->phys_dev, display, pPropertyCount, pProperties);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkCreateDisplayModeKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ const VkDisplayModeCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkDisplayModeKHR* pMode)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->CreateDisplayModeKHR(
+ unwrapped_phys_dev, display, pCreateInfo, pAllocator, pMode);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_CreateDisplayModeKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ const VkDisplayModeCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkDisplayModeKHR* pMode)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->CreateDisplayModeKHR &&
+ "loader: null CreateDisplayModeKHR ICD pointer");
+
+ return icd->CreateDisplayModeKHR(
+ phys_dev->phys_dev, display, pCreateInfo, pAllocator, pMode);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkGetDisplayPlaneCapabilitiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayModeKHR mode,
+ uint32_t planeIndex,
+ VkDisplayPlaneCapabilitiesKHR* pCapabilities)
+{
+ VkPhysicalDevice unwrapped_phys_dev =
+ loader_unwrap_physical_device(physicalDevice);
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(physicalDevice);
+ VkResult res = disp->GetDisplayPlaneCapabilitiesKHR(
+ unwrapped_phys_dev, mode, planeIndex, pCapabilities);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayPlaneCapabilitiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayModeKHR mode,
+ uint32_t planeIndex,
+ VkDisplayPlaneCapabilitiesKHR* pCapabilities)
+{
+ struct loader_physical_device *phys_dev =
+ (struct loader_physical_device *)physicalDevice;
+ struct loader_icd *icd = phys_dev->this_icd;
+
+ assert(
+ icd->GetDisplayPlaneCapabilitiesKHR &&
+ "loader: null GetDisplayPlaneCapabilitiesKHR ICD pointer");
+
+ return icd->GetDisplayPlaneCapabilitiesKHR(
+ phys_dev->phys_dev, mode, planeIndex, pCapabilities);
+}
+
+LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
+vkCreateDisplayPlaneSurfaceKHR(
+ VkInstance instance,
+ const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface)
+{
+ const VkLayerInstanceDispatchTable *disp;
+ disp = loader_get_instance_dispatch(instance);
+ VkResult res;
+
+ res = disp->CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator,
+ pSurface);
+ return res;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_CreateDisplayPlaneSurfaceKHR(
+ VkInstance instance,
+ const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface)
+{
+ struct loader_instance *inst = loader_get_instance(instance);
+ VkIcdSurfaceDisplay *pIcdSurface = NULL;
+
+ pIcdSurface = loader_heap_alloc(inst, sizeof(VkIcdSurfaceDisplay),
+ VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
+ if (pIcdSurface == NULL) {
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+ }
+
+ pIcdSurface->base.platform = VK_ICD_WSI_PLATFORM_DISPLAY;
+ pIcdSurface->displayMode = pCreateInfo->displayMode;
+ pIcdSurface->planeIndex = pCreateInfo->planeIndex;
+ pIcdSurface->planeStackIndex = pCreateInfo->planeStackIndex;
+ pIcdSurface->transform = pCreateInfo->transform;
+ pIcdSurface->globalAlpha = pCreateInfo->globalAlpha;
+ pIcdSurface->alphaMode = pCreateInfo->alphaMode;
+ pIcdSurface->imageExtent = pCreateInfo->imageExtent;
+
+ *pSurface = (VkSurfaceKHR)pIcdSurface;
+
+ return VK_SUCCESS;
+}
+
bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
const char *name, void **addr) {
*addr = NULL;
@@ -1103,5 +1372,50 @@ bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
}
#endif // VK_USE_PLATFORM_ANDROID_KHR
+ /*
+ * Functions for VK_KHR_display extension:
+ */
+ if (!strcmp("vkGetPhysicalDeviceDisplayPropertiesKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkGetPhysicalDeviceDisplayPropertiesKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkGetPhysicalDeviceDisplayPlanePropertiesKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkGetPhysicalDeviceDisplayPlanePropertiesKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkGetDisplayPlaneSupportedDisplaysKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkGetDisplayPlaneSupportedDisplaysKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkGetDisplayModePropertiesKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkGetDisplayModePropertiesKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkCreateDisplayModeKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkCreateDisplayModeKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkGetDisplayPlaneCapabilitiesKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkGetDisplayPlaneCapabilitiesKHR
+ : NULL;
+ return true;
+ }
+ if (!strcmp("vkCreateDisplayPlaneSurfaceKHR", name)) {
+ *addr = ptr_instance->wsi_display_enabled
+ ? (void *)vkCreateDisplayPlaneSurfaceKHR
+ : NULL;
+ return true;
+ }
return false;
-}
+} \ No newline at end of file
diff --git a/loader/wsi.h b/loader/wsi.h
index aac9f99d..88540f5d 100644
--- a/loader/wsi.h
+++ b/loader/wsi.h
@@ -114,3 +114,44 @@ terminator_GetPhysicalDeviceXlibPresentationSupportKHR(
VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display *dpy,
VisualID visualID);
#endif
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetPhysicalDeviceDisplayPropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPropertiesKHR* pProperties);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetPhysicalDeviceDisplayPlanePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t* pPropertyCount,
+ VkDisplayPlanePropertiesKHR* pProperties);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_CreateDisplayModeKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ const VkDisplayModeCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkDisplayModeKHR* pMode);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_GetDisplayPlaneCapabilitiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayModeKHR mode,
+ uint32_t planeIndex,
+ VkDisplayPlaneCapabilitiesKHR* pCapabilities);
+VKAPI_ATTR VkResult VKAPI_CALL
+terminator_CreateDisplayPlaneSurfaceKHR(
+ VkInstance instance,
+ const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface); \ No newline at end of file