我正试图让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);
}
这会导致以下错误:
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
如果您注释掉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
我试图解决此问题,但不幸的是,我不知道如何调试类似的X11错误。但是,根据the docs,“如果未使用对应于配置的视觉创建win,或者config
不支持向Windows渲染(即GLX_DRAWABLE_TYPE
不支持,则生成错误匹配包含GLX_WINDOW_BIT
)。”
我的一些尝试都失败了,
params.Bits
设置为16
,24
和32
。params.LoggingLevel = ELL_DEBUG;
,因为它有望打印出有关该问题的有用信息,但不会。params.IgnoreInput = true;
。SDL_WINDOW_OPENGL
中切换SDL_CreateWindow
标志。apitrace
来找出有关错误或至少显然是无效参数的详细信息,但我找不到它,尤其是因为它似乎不能简单地跟踪X11调用,而只能跟踪GLX和OpenGL调用。