|
|
|
@ -2123,19 +2123,19 @@ char** _glfwPlatformGetRequiredInstanceExtensions(int* count) |
|
|
|
|
|
|
|
|
|
*count = 0; |
|
|
|
|
|
|
|
|
|
if (!_glfw.vk.KHR_xlib_surface) |
|
|
|
|
if (!_glfw.vk.KHR_xcb_surface || !_glfw.x11.x11xcb.handle) |
|
|
|
|
{ |
|
|
|
|
if (!_glfw.vk.KHR_xcb_surface || !_glfw.x11.x11xcb.handle) |
|
|
|
|
if (!_glfw.vk.KHR_xlib_surface) |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
extensions = calloc(2, sizeof(char*)); |
|
|
|
|
extensions[0] = strdup("VK_KHR_surface"); |
|
|
|
|
|
|
|
|
|
if (_glfw.vk.KHR_xlib_surface) |
|
|
|
|
extensions[1] = strdup("VK_KHR_xlib_surface"); |
|
|
|
|
else |
|
|
|
|
if (_glfw.vk.KHR_xcb_surface) |
|
|
|
|
extensions[1] = strdup("VK_KHR_xcb_surface"); |
|
|
|
|
else |
|
|
|
|
extensions[1] = strdup("VK_KHR_xlib_surface"); |
|
|
|
|
|
|
|
|
|
*count = 2; |
|
|
|
|
return extensions; |
|
|
|
@ -2148,24 +2148,7 @@ int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance, |
|
|
|
|
VisualID visualID = XVisualIDFromVisual(DefaultVisual(_glfw.x11.display, |
|
|
|
|
_glfw.x11.screen)); |
|
|
|
|
|
|
|
|
|
if (_glfw.vk.KHR_xlib_surface) |
|
|
|
|
{ |
|
|
|
|
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = |
|
|
|
|
(PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); |
|
|
|
|
if (!vkGetPhysicalDeviceXlibPresentationSupportKHR) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_API_UNAVAILABLE, |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xlib_surface extension"); |
|
|
|
|
return GLFW_FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return vkGetPhysicalDeviceXlibPresentationSupportKHR(device, |
|
|
|
|
queuefamily, |
|
|
|
|
_glfw.x11.display, |
|
|
|
|
visualID); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
if (_glfw.vk.KHR_xcb_surface) |
|
|
|
|
{ |
|
|
|
|
PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR = |
|
|
|
|
(PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR) |
|
|
|
@ -2191,6 +2174,23 @@ int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance, |
|
|
|
|
connection, |
|
|
|
|
visualID); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR = |
|
|
|
|
(PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR"); |
|
|
|
|
if (!vkGetPhysicalDeviceXlibPresentationSupportKHR) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_API_UNAVAILABLE, |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xlib_surface extension"); |
|
|
|
|
return GLFW_FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return vkGetPhysicalDeviceXlibPresentationSupportKHR(device, |
|
|
|
|
queuefamily, |
|
|
|
|
_glfw.x11.display, |
|
|
|
|
visualID); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
VkResult _glfwPlatformCreateWindowSurface(VkInstance instance, |
|
|
|
@ -2198,31 +2198,40 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance, |
|
|
|
|
const VkAllocationCallbacks* allocator, |
|
|
|
|
VkSurfaceKHR* surface) |
|
|
|
|
{ |
|
|
|
|
if (_glfw.vk.KHR_xlib_surface) |
|
|
|
|
if (_glfw.vk.KHR_xcb_surface) |
|
|
|
|
{ |
|
|
|
|
VkResult err; |
|
|
|
|
VkXlibSurfaceCreateInfoKHR sci; |
|
|
|
|
PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; |
|
|
|
|
VkXcbSurfaceCreateInfoKHR sci; |
|
|
|
|
PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR; |
|
|
|
|
|
|
|
|
|
vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR"); |
|
|
|
|
if (!vkCreateXlibSurfaceKHR) |
|
|
|
|
xcb_connection_t* connection = |
|
|
|
|
_glfw.x11.x11xcb.XGetXCBConnection(_glfw.x11.display); |
|
|
|
|
if (!connection) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"X11: Failed to retrieve XCB connection"); |
|
|
|
|
return VK_ERROR_EXTENSION_NOT_PRESENT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR"); |
|
|
|
|
if (!vkCreateXcbSurfaceKHR) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_API_UNAVAILABLE, |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xlib_surface extension"); |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xcb_surface extension"); |
|
|
|
|
return VK_ERROR_EXTENSION_NOT_PRESENT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
memset(&sci, 0, sizeof(sci)); |
|
|
|
|
sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; |
|
|
|
|
sci.dpy = _glfw.x11.display; |
|
|
|
|
sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; |
|
|
|
|
sci.connection = connection; |
|
|
|
|
sci.window = window->x11.handle; |
|
|
|
|
|
|
|
|
|
err = vkCreateXlibSurfaceKHR(instance, &sci, allocator, surface); |
|
|
|
|
err = vkCreateXcbSurfaceKHR(instance, &sci, allocator, surface); |
|
|
|
|
if (err) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"X11: Failed to create Vulkan X11 surface: %s", |
|
|
|
|
"X11: Failed to create Vulkan XCB surface: %s", |
|
|
|
|
_glfwGetVulkanResultString(err)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2231,37 +2240,28 @@ VkResult _glfwPlatformCreateWindowSurface(VkInstance instance, |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
VkResult err; |
|
|
|
|
VkXcbSurfaceCreateInfoKHR sci; |
|
|
|
|
PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR; |
|
|
|
|
|
|
|
|
|
xcb_connection_t* connection = |
|
|
|
|
_glfw.x11.x11xcb.XGetXCBConnection(_glfw.x11.display); |
|
|
|
|
if (!connection) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"X11: Failed to retrieve XCB connection"); |
|
|
|
|
return VK_ERROR_EXTENSION_NOT_PRESENT; |
|
|
|
|
} |
|
|
|
|
VkXlibSurfaceCreateInfoKHR sci; |
|
|
|
|
PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR; |
|
|
|
|
|
|
|
|
|
vkCreateXcbSurfaceKHR = (PFN_vkCreateXcbSurfaceKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR"); |
|
|
|
|
if (!vkCreateXcbSurfaceKHR) |
|
|
|
|
vkCreateXlibSurfaceKHR = (PFN_vkCreateXlibSurfaceKHR) |
|
|
|
|
vkGetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR"); |
|
|
|
|
if (!vkCreateXlibSurfaceKHR) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_API_UNAVAILABLE, |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xcb_surface extension"); |
|
|
|
|
"X11: Vulkan instance missing VK_KHR_xlib_surface extension"); |
|
|
|
|
return VK_ERROR_EXTENSION_NOT_PRESENT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
memset(&sci, 0, sizeof(sci)); |
|
|
|
|
sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; |
|
|
|
|
sci.connection = connection; |
|
|
|
|
sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; |
|
|
|
|
sci.dpy = _glfw.x11.display; |
|
|
|
|
sci.window = window->x11.handle; |
|
|
|
|
|
|
|
|
|
err = vkCreateXcbSurfaceKHR(instance, &sci, allocator, surface); |
|
|
|
|
err = vkCreateXlibSurfaceKHR(instance, &sci, allocator, surface); |
|
|
|
|
if (err) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_PLATFORM_ERROR, |
|
|
|
|
"X11: Failed to create Vulkan XCB surface: %s", |
|
|
|
|
"X11: Failed to create Vulkan X11 surface: %s", |
|
|
|
|
_glfwGetVulkanResultString(err)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|