sdl2
sdl2 copied to clipboard
Cannot create renderer when compiled using nix
I'm running into a funny error where I'm not able to create a renderer. This error only happens when building using nix (and I'm fairly new to nix so this could be a simple dependency gotcha). The same program compiled with stack builds and runs just fine. Here's the error that I'm getting:
SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Couldn't find matching render driver"}
And for debugging, given this code:
let rcfg = SDL.RendererConfig
{ SDL.rendererType = SDL.AcceleratedVSyncRenderer
, SDL.rendererTargetTexture = True
}
liftIO $ do
print rcfg
putStrLn ""
SDL.getRenderDriverInfo
>>= liftIO . mapM (\i -> print i >> putStrLn "")
r <- SDL.createRenderer win (-1) rcfg
...
I get this output:
RendererConfig {rendererType = AcceleratedVSyncRenderer, rendererTargetTexture = True}
RendererInfo {rendererInfoName = "opengl", rendererInfoFlags = RendererConfig {rendererType = AcceleratedVSyncRenderer, rendererTargetTexture = True}, rendererInfoNumTextureFormats = 1, rendererInfoTextureFormats = [ARGB8888,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown], rendererInfoMaxTextureWidth = 0, rendererInfoMaxTextureHeight = 0}
RendererInfo {rendererInfoName = "opengles2", rendererInfoFlags = RendererConfig {rendererType = AcceleratedVSyncRenderer, rendererTargetTexture = True}, rendererInfoNumTextureFormats = 4, rendererInfoTextureFormats = [ARGB8888,ABGR8888,RGB888,BGR888,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown], rendererInfoMaxTextureWidth = 0, rendererInfoMaxTextureHeight = 0}
RendererInfo {rendererInfoName = "opengles", rendererInfoFlags = RendererConfig {rendererType = AcceleratedVSyncRenderer, rendererTargetTexture = False}, rendererInfoNumTextureFormats = 1, rendererInfoTextureFormats = [ABGR8888,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown], rendererInfoMaxTextureWidth = 0, rendererInfoMaxTextureHeight = 0}
RendererInfo {rendererInfoName = "software", rendererInfoFlags = RendererConfig {rendererType = SoftwareRenderer, rendererTargetTexture = True}, rendererInfoNumTextureFormats = 8, rendererInfoTextureFormats = [ARGB8888,ABGR8888,RGBA8888,BGRA8888,RGB888,BGR888,RGB565,RGB555,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown,Unknown], rendererInfoMaxTextureWidth = 0, rendererInfoMaxTextureHeight = 0}
Furthermore, if I try to specify that the window use OpenGL by supplying defaultWindow{ windowOpenGL = Just defaultOpenGL }
I get a different error:
SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Invalid window"}
Thanks for any help, it's much appreciated - even just spit balling.
I guess SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Couldn't find matching render driver"}
just means, that an appropriate driver could not be loaded, but the reason is masked by that.
Maybe try calling createRenderer win 0 defaultRenderer
. The index of 0
means the first driver reported by getRenderDriverInfo
is used and defaultRenderer
simply ignored.
For me (on Debian unstable) my Haskell project builds with nix build
(never the problem) but I still get the following error with nix run
:
SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Couldn't find matching render driver"}
... and with SDL_DEBUG=1 SDL_VIDEODRIVER=wayland nix run
SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Parameter 'window' is invalid"}
Index of 0
If, as @typetetris suggests, I change my code to simply work with being built in a Nix env or through Nix build, as you suggest (using "the index of 0") I instead get this error:
SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Couldn't find matching GLX visual"}
... but I can set the variable and get an error like this:
$ SDL_VIDEODRIVER=wayland cabal run
myapp-exe: SDLCallFailed {sdlExceptionCaller = "SDL.Video.createRenderer", sdlFunction = "SDL_CreateRenderer", sdlExceptionError = "Parameter 'window' is invalid"}
Workaround
I'm using SDL_RENDER_DRIVER=software nix run
as a workaround for now.
Other notes
If I don't use Nix at all (no environment or building) everything works fine.
Even if I use cabal build
inside the Nix environment the build will produce the same errors above even outside the env.