From bd2d34404063f51c7eb7970fd4d5591a7788774c Mon Sep 17 00:00:00 2001 From: crueter Date: Sun, 31 May 2026 04:19:49 +0200 Subject: [PATCH] [desktop] Restore metal layer search (#4033) This was cut out in #3916 by accident. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4033 --- src/qt_common/qt_common.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/qt_common/qt_common.cpp b/src/qt_common/qt_common.cpp index 7550e931af..98de0a6317 100644 --- a/src/qt_common/qt_common.cpp +++ b/src/qt_common/qt_common.cpp @@ -87,8 +87,37 @@ Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) // Our Win32 Qt external doesn't have the private API. wsi.render_surface = reinterpret_cast(window->winId()); #elif defined(__APPLE__) - wsi.render_surface = reinterpret_cast(objc_msgSend)( + id layer = reinterpret_cast(objc_msgSend)( reinterpret_cast(window->winId()), sel_registerName("layer")); + + // In Qt 6, the layer of the NSView might be a QContainerLayer. + // MoltenVK needs a CAMetalLayer. We search for it in sublayers. + Class metal_layer_class = objc_getClass("CAMetalLayer"); + id metal_layer = nullptr; + + if (layer) { + if (reinterpret_cast(objc_msgSend)( + layer, sel_registerName("isKindOfClass:"), metal_layer_class)) { + metal_layer = layer; + } else { + id sublayers = reinterpret_cast(objc_msgSend)( + layer, sel_registerName("sublayers")); + if (sublayers) { + unsigned long count = reinterpret_cast(objc_msgSend)( + sublayers, sel_registerName("count")); + for (unsigned long i = 0; i < count; ++i) { + id sublayer = reinterpret_cast(objc_msgSend)( + sublayers, sel_registerName("objectAtIndex:"), i); + if (reinterpret_cast(objc_msgSend)( + sublayer, sel_registerName("isKindOfClass:"), metal_layer_class)) { + metal_layer = sublayer; + break; + } + } + } + } + } + wsi.render_surface = reinterpret_cast(metal_layer ? metal_layer : layer); #else QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface(); wsi.display_connection = pni->nativeResourceForWindow("display", window);