Skip to content

Commit 20ffe83

Browse files
committed
vulkaninfo: On X11 use default visual
If the visual passed to XCreateWindow is not the default one, it can cause a BadMatch error. Usually the first one returned does work, but in certain cases we need to search through all the visuals to find one that matches the default visual. This was seen on an xrdp session on Rocky 9.
1 parent 2030a5b commit 20ffe83

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

vulkaninfo/vulkaninfo.h

+9-3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
#endif // _WIN32
7272

7373
#if defined(VK_USE_PLATFORM_XLIB_KHR) || defined(VK_USE_PLATFORM_XCB_KHR)
74+
#include <X11/Xlib.h>
7475
#include <X11/Xutil.h>
7576
#endif
7677

@@ -772,7 +773,7 @@ static void AppDestroyXcbWindow(AppInstance &inst) {
772773
#ifdef VK_USE_PLATFORM_XLIB_KHR
773774
static void AppCreateXlibWindow(AppInstance &inst) {
774775
long visualMask = VisualScreenMask;
775-
int numberOfVisuals;
776+
int numberOfVisuals{};
776777

777778
inst.xlib_display = XOpenDisplay(nullptr);
778779
if (inst.xlib_display == nullptr) {
@@ -781,12 +782,17 @@ static void AppCreateXlibWindow(AppInstance &inst) {
781782

782783
XVisualInfo vInfoTemplate = {};
783784
vInfoTemplate.screen = DefaultScreen(inst.xlib_display);
784-
XVisualInfo *visualInfo = XGetVisualInfo(inst.xlib_display, visualMask, &vInfoTemplate, &numberOfVisuals);
785+
XVisualInfo *visualInfoBegin = XGetVisualInfo(inst.xlib_display, visualMask, &vInfoTemplate, &numberOfVisuals);
786+
XVisualInfo *visualInfoEnd = visualInfoBegin + numberOfVisuals;
787+
const Visual *rootVisual = DefaultVisual(inst.xlib_display, vInfoTemplate.screen);
788+
const XVisualInfo *foundVisualInfo =
789+
std::find_if(visualInfoBegin, visualInfoEnd, [rootVisual](const XVisualInfo &vi) { return vi.visual == rootVisual; });
790+
const XVisualInfo *visualInfo = foundVisualInfo == visualInfoEnd ? visualInfoBegin : foundVisualInfo;
785791
inst.xlib_window = XCreateWindow(inst.xlib_display, RootWindow(inst.xlib_display, vInfoTemplate.screen), 0, 0, inst.width,
786792
inst.height, 0, visualInfo->depth, InputOutput, visualInfo->visual, 0, nullptr);
787793

788794
XSync(inst.xlib_display, false);
789-
XFree(visualInfo);
795+
XFree(visualInfoBegin);
790796
}
791797

792798
static VkSurfaceKHR AppCreateXlibSurface(AppInstance &inst) {

0 commit comments

Comments
 (0)