传递SDL2创建的窗口时,Irrlicht无法创建GLX上下文

Asu*_*Asu 7 x11 opengl irrlicht sdl-2

我试图让Irrlicht使用我在X11下使用SDL2创建的窗口,但它在Irrlicht中失败了GLXCreateWindow.

在我的方框中,以下MCVE再现了该问题:

#include <irrlicht/irrlicht.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_syswm.h>

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow("Hello",
        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        800, 600,
        SDL_WINDOW_OPENGL);

    if (!window)
    {
        return false;
    }

    SDL_SysWMinfo wm_info;
    SDL_VERSION(&wm_info.version);

    if (!SDL_GetWindowWMInfo(window, &wm_info))
    {
        return false;
    }

    irr::SIrrlichtCreationParameters params;
    params.DeviceType = irr::EIDT_BEST;
    params.DriverType = irr::video::EDT_OPENGL;
    params.WindowSize = { 800, 600 };
    params.WindowId = reinterpret_cast<void*>(wm_info.info.x11.window);
    irr::createDeviceEx(params);
}
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

Irrlicht Engine version 1.9.0
Linux 4.16.16-1-ck #1 SMP PREEMPT Tue Jun 19 20:30:54 CEST 2018 x86_64
X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  152 (GLX)
  Minor opcode of failed request:  31 (X_GLXCreateWindow)
  Serial number of failed request:  364
  Current serial number in output stream:  365
Run Code Online (Sandbox Code Playgroud)

如果您注释掉该WindowId集合,Irrlicht将创建自己的窗口,该窗口成功.

Irrlicht Engine version 1.9.0
Linux 4.16.16-1-ck #1 SMP PREEMPT Tue Jun 19 20:30:54 CEST 2018 x86_64
Using renderer: OpenGL 4.4
Radeon RX 580 Series (POLARIS10, DRM 3.23.0, 4.16.16-1-ck, LLVM 7.0.0): X.Org
OpenGL driver version is 1.2 or better.
GLSL version: 4.4
Run Code Online (Sandbox Code Playgroud)

我试图解决这个问题,但不幸的是我不知道如何调试X11这样的错误.但是,根据文档,"如果没有使用与config对应的视觉创建win,或者如果config不支持渲染到窗口(即,GLX_DRAWABLE_TYPE不包含GLX_WINDOW_BIT),则会生成BadMatch ."

我的一些尝试包括但无济于事:

  • 设置params.Bits16,2432.
  • 使用Irrlicht 1.7和1.9.0 SVN(现在建立).
  • 将Irrlicht渲染后端设置为软件渲染工作,因为它不会尝试创建GLX上下文.
  • 设置,params.LoggingLevel = ELL_DEBUG;因为它有望打印有关问题的有用信息,但没有.
  • 设定params.IgnoreInput = true;.
  • 切换SDL_WINDOW_OPENGL旗帜SDL_CreateWindow.
  • 使用apitrace以揣摩细节上的错误,或者至少明显无效的参数,但我无法找到它,特别是因为它似乎并没有简单地跟踪X11调用,只有GLX和OpenGL调用.