Add support for direct mode display extensions

* Minor change made to vulkan.h to avoid including Xrandr.h directly and
  adding a new dependency, when all we need is the RROutput typedef
This commit is contained in:
baldurk
2017-02-13 19:20:19 +00:00
parent 4cb9fb4fe3
commit 4a9b5ae60c
7 changed files with 71 additions and 13 deletions
+1 -1
View File
@@ -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)
+6 -1
View File
@@ -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 <X11/extensions/Xrandr.h>
// RenderDoc modification
// Don't want to depend on Xrandr for this
//#include <X11/extensions/Xrandr.h>
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"
+8
View File
@@ -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,
},
+14
View File
@@ -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);
};
+20 -10
View File
@@ -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
+15
View File
@@ -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)
@@ -868,4 +868,10 @@ VkResult WrappedVulkan::vkCreateSharedSwapchainsKHR(VkDevice device, uint32_t sw
}
return ret;
}
}
VkResult WrappedVulkan::vkReleaseDisplayEXT(VkPhysicalDevice physicalDevice, VkDisplayKHR display)
{
// displays are not wrapped
return ObjDisp(physicalDevice)->ReleaseDisplayEXT(Unwrap(physicalDevice), display);
}