通过 SDL 呈现 QtQuick GUI

Render QtQuick GUI over SDL

正在尝试将 QML 用户界面渲染到 SDL window。

有一款 SDL 1.2 游戏通过 SDL_SetVideoModeSDL_OPENGLBLIT 标志创建 OpenGL 上下文。

我们的想法是获取 OpenGL 上下文句柄并将其传递给将在场景上绘制 GUI 的 QQuickRenderControl。

获取本机上下文(X11 示例):

GLXContext currentContext;
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
if (SDL_GetWMInfo(&wmInfo))
{
    Display *display = wmInfo.info.x11.gfxdisplay;
    currentContext = glXGetCurrentContext();
    assert(currentContext);
}

在 Qt 中采用它:

QOpenGLContext *ctx = new QOpenGLContext;
ctx->setNativeHandle(QVariant::fromValue<QGLXNativeContext>(
    QGLXNativeContext(currentContext, wmInfo.info.x11.display, wmInfo.info.x11.window)
));

并创建 QQuickRenderControl:

QQuickRenderControl *renderControl = new QQuickRenderControl;
renderControl->initialize(ctx);

但是QQuickRenderControl没有QWindow就无法启动:

QQuickRenderControl::initialize called with no associated window

还有 ctx->isValid()ctx->makeCurrent() return 错误。

如何让它发挥作用?

至少 SDL2 是可能的。

Qt 应用程序单例必须运行,window 必须从本机句柄中提取并传递给 RenderControl。