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);