diff --git a/renderdoc/driver/vulkan/CMakeLists.txt b/renderdoc/driver/vulkan/CMakeLists.txt index a38d843e4..c2af17bd4 100644 --- a/renderdoc/driver/vulkan/CMakeLists.txt +++ b/renderdoc/driver/vulkan/CMakeLists.txt @@ -55,7 +55,7 @@ elseif(UNIX) list(APPEND sources vk_posix.cpp vk_linux.cpp) if(ENABLE_XLIB) - add_definitions(-DVK_USE_PLATFORM_XLIB_KHR) + add_definitions(-DVK_USE_PLATFORM_XLIB_KHR -DVK_USE_PLATFORM_XLIB_XRANDR_EXT) endif() if(ENABLE_XCB) diff --git a/renderdoc/driver/vulkan/official/vulkan.h b/renderdoc/driver/vulkan/official/vulkan.h index 669ca945b..c06644321 100644 --- a/renderdoc/driver/vulkan/official/vulkan.h +++ b/renderdoc/driver/vulkan/official/vulkan.h @@ -4605,7 +4605,12 @@ VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( #ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT #define VK_EXT_acquire_xlib_display 1 -#include + +// RenderDoc modification +// Don't want to depend on Xrandr for this +//#include + +typedef unsigned int RROutput; #define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1 #define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display" diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index d4198e640..e6f54618d 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -710,9 +710,17 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME, VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION, }, +#ifdef VK_EXT_acquire_xlib_display + { + VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME, VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION, + }, +#endif { VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION, }, + { + VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, VK_EXT_DIRECT_MODE_DISPLAY_SPEC_VERSION, + }, { VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME, VK_EXT_DISPLAY_CONTROL_SPEC_VERSION, }, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index fa39762b7..836b7632b 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1324,6 +1324,7 @@ public: const VkAllocationCallbacks *pAllocator); #if defined(VK_USE_PLATFORM_WIN32_KHR) + // VK_KHR_win32_surface VkResult vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); @@ -1337,12 +1338,14 @@ public: #endif #if defined(VK_USE_PLATFORM_ANDROID_KHR) + // VK_KHR_android_surface VkResult vkCreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); #endif #if defined(VK_USE_PLATFORM_XCB_KHR) + // VK_KHR_xcb_surface VkResult vkCreateXcbSurfaceKHR(VkInstance instance, const VkXcbSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); @@ -1353,12 +1356,20 @@ public: #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) + // VK_KHR_xlib_surface VkResult vkCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display *dpy, VisualID visualID); + + // VK_EXT_acquire_xlib_display + VkResult vkAcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, + VkDisplayKHR display); + VkResult vkGetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, + RROutput rrOutput, VkDisplayKHR *pDisplay); + #endif // VK_KHR_display and VK_KHR_display_swapchain. These have no library or include dependencies so @@ -1441,4 +1452,7 @@ public: const VkAllocationCallbacks *pAllocator, VkFence *pFence); VkResult vkGetSwapchainCounterEXT(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t *pCounterValue); + + // VK_EXT_direct_mode_display + VkResult vkReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display); }; diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 11588b9e4..7bb0e7e56 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -81,16 +81,22 @@ #if defined(VK_USE_PLATFORM_XLIB_KHR) -#define HookInitInstance_PlatformSpecific_Xlib() \ - HookInitExtension(VK_KHR_xlib_surface, CreateXlibSurfaceKHR); \ - HookInitExtension(VK_KHR_xlib_surface, GetPhysicalDeviceXlibPresentationSupportKHR); +#define HookInitInstance_PlatformSpecific_Xlib() \ + HookInitExtension(VK_KHR_xlib_surface, CreateXlibSurfaceKHR); \ + HookInitExtension(VK_KHR_xlib_surface, GetPhysicalDeviceXlibPresentationSupportKHR); \ + HookInitExtension(VK_EXT_acquire_xlib_display, AcquireXlibDisplayEXT); \ + HookInitExtension(VK_EXT_acquire_xlib_display, GetRandROutputDisplayEXT); -#define HookDefine_PlatformSpecific_Xlib() \ - HookDefine4(VkResult, vkCreateXlibSurfaceKHR, VkInstance, instance, \ - const VkXlibSurfaceCreateInfoKHR *, pCreateInfo, const VkAllocationCallbacks *, \ - pAllocator, VkSurfaceKHR *, pSurface); \ - HookDefine4(VkBool32, vkGetPhysicalDeviceXlibPresentationSupportKHR, VkPhysicalDevice, \ - physicalDevice, uint32_t, queueFamilyIndex, Display *, dpy, VisualID, visualID); +#define HookDefine_PlatformSpecific_Xlib() \ + HookDefine4(VkResult, vkCreateXlibSurfaceKHR, VkInstance, instance, \ + const VkXlibSurfaceCreateInfoKHR *, pCreateInfo, const VkAllocationCallbacks *, \ + pAllocator, VkSurfaceKHR *, pSurface); \ + HookDefine4(VkBool32, vkGetPhysicalDeviceXlibPresentationSupportKHR, VkPhysicalDevice, \ + physicalDevice, uint32_t, queueFamilyIndex, Display *, dpy, VisualID, visualID); \ + HookDefine3(VkResult, vkAcquireXlibDisplayEXT, VkPhysicalDevice, physicalDevice, Display *, dpy, \ + VkDisplayKHR, display); \ + HookDefine4(VkResult, vkGetRandROutputDisplayEXT, VkPhysicalDevice, physicalDevice, Display *, \ + dpy, RROutput, rrOutput, VkDisplayKHR *, pDisplay); #else @@ -259,7 +265,9 @@ CheckExt(VK_KHR_display); \ CheckExt(VK_NV_external_memory_capabilities); \ CheckExt(VK_KHR_get_physical_device_properties2); \ - CheckExt(VK_EXT_display_surface_counter); + CheckExt(VK_EXT_display_surface_counter); \ + CheckExt(VK_EXT_direct_mode_display); \ + CheckExt(VK_EXT_acquire_xlib_display); #define CheckDeviceExts() \ CheckExt(VK_EXT_debug_marker); \ @@ -700,6 +708,8 @@ pAllocator, VkFence *, pFence); \ HookDefine4(VkResult, vkGetSwapchainCounterEXT, VkDevice, device, VkSwapchainKHR, swapchain, \ VkSurfaceCounterFlagBitsEXT, counter, uint64_t *, pCounterValue); \ + HookDefine2(VkResult, vkReleaseDisplayEXT, VkPhysicalDevice, physicalDevice, VkDisplayKHR, \ + display); \ HookDefine_PlatformSpecific() struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable diff --git a/renderdoc/driver/vulkan/vk_posix.cpp b/renderdoc/driver/vulkan/vk_posix.cpp index d208f3919..468b526b9 100644 --- a/renderdoc/driver/vulkan/vk_posix.cpp +++ b/renderdoc/driver/vulkan/vk_posix.cpp @@ -226,6 +226,21 @@ VkResult WrappedVulkan::vkCreateXlibSurfaceKHR(VkInstance instance, return ret; } +VkResult WrappedVulkan::vkAcquireXlibDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, + VkDisplayKHR display) +{ + // display is not wrapped so we can pass straight through + return ObjDisp(physicalDevice)->AcquireXlibDisplayEXT(Unwrap(physicalDevice), dpy, display); +} + +VkResult WrappedVulkan::vkGetRandROutputDisplayEXT(VkPhysicalDevice physicalDevice, Display *dpy, + RROutput rrOutput, VkDisplayKHR *pDisplay) +{ + // display is not wrapped so we can pass straight through + return ObjDisp(physicalDevice) + ->GetRandROutputDisplayEXT(Unwrap(physicalDevice), dpy, rrOutput, pDisplay); +} + #endif #if defined(VK_USE_PLATFORM_ANDROID_KHR) diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 1ce019c33..6747ef541 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -868,4 +868,10 @@ VkResult WrappedVulkan::vkCreateSharedSwapchainsKHR(VkDevice device, uint32_t sw } return ret; -} \ No newline at end of file +} + +VkResult WrappedVulkan::vkReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display) +{ + // displays are not wrapped + return ObjDisp(physicalDevice)->ReleaseDisplayEXT(Unwrap(physicalDevice), display); +}