Falcon BMS on GNU/Linux
-
alsa
-
alsa
Yep - I’m pretty sure the alsa development libs must be installed… It was certainly not mentioned in the config step of wine as far as I remember, but I will double check when I am back on that computer.
-
When in doubt, run winecfg and click ‘test sound’.
-
-
Yes. Sound worked from there no prob.
OK - so the problem was, I had sound working in 64 bit but not 32 bit. I installed asoundlib-dev (i386) and it now works with sound and starts up. However, when I launch into instant action, the screen stays black, and I get this:
fixme:win:EnumDisplayDevicesW ((null),0,0x33f588,0x00000000), stub!
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:swapchain_init The application requested more than one back buffer, this is not properly supported.
Please configure the application to use double buffering (1 back buffer) if possible.
err:d3d:context_create wglSwapIntervalEXT failed to set swap interval 0 for context 0x14f4baf0, last error 0x591
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
err:d3d:context_create wglSwapIntervalEXT failed to set swap interval 0 for context 0x14ed8760, last error 0x591
fixme:d3d:query_init Unhandled query type 0x4.
err:d3d:resource_unload Resource 0x14edc2b0 is being unloaded while mapped.
err:d3d:resource_unload Resource 0x71b428a8 is being unloaded while mapped.
err:d3d:resource_unload Resource 0x71b6fe10 is being unloaded while mapped.
err:d3d:resource_unload Resource 0x71b9c3e0 is being unloaded while mapped.
fixme:d3d:wined3d_buffer_preload Too many declaration changes or converting dynamic buffer, stopping converting
fixme:d3d_draw:draw_primitive Using software emulation because manual fog coordinates are provided.
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x1cf030 is being unloaded while mapped.
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x1cf2e0 is being unloaded while mapped.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:wined3d_buffer_preload Too many declaration changes or converting dynamic buffer, stopping converting
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
fixme:d3d:resource_check_usage Unhandled usage flags 0x8.
err:d3d:context_create wglSwapIntervalEXT failed to set swap interval 0 for context 0x671198a0, last error 0x591
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x154a6f30 is being unloaded while mapped.
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x158b0390 is being unloaded while mapped.
err:d3d:context_create wglSwapIntervalEXT failed to set swap interval 0 for context 0x735bd318, last error 0x591
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x1cee98 is being unloaded while mapped.
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x73396308 is being unloaded while mapped.
err:d3d:wined3d_buffer_map >>>>>>>>>>>>>>>>> GL_INVALID_OPERATION (0x502) from glUnmapBufferARB @ buffer.c / 1079
err:d3d:resource_unload Resource 0x158afd68 is being unloaded while mapped.
^CI tried entering the registry values in (as you suggested), but to no avail.
-
OK… Think I’ve fixed it now. Seems like it was some settings within BMS that I hadn’t set correctly - maybe triple buffering switched on? Not sure. Need more testing, but at least I got it to get into the game with vanilla wine built by me - now to test your patch!
-
Cheers! Yes, triple buffering needs to be disabled.
Once you get it done get ftnoir-posix
-
Cheers! Yes, triple buffering needs to be disabled.
Once you get it done get ftnoir-posix
Don’t have the kit for that yet… Don’t even have a joystick!!! (any recommendations?)
But - with your patch I am now getting 35 fps in instant action!!! Woohoo!
-
Saitek X65F or Warthog.
Disable GLSL and HDR and anisotropy.
-
On the contrary, BMS is one of only 2 reasons I still have a Windows install in the house at all.
I agree, its the same at our house.
-
With Catalyst driver it’s possible to play with HDR. The only thing that needs to be off is triple buffering.
-
Have you tried out playing online under Wine?
-
Yes. It works.
-
Hi,
Sorry to bring this old thread back, but I’d like to say big thanks to all that made possible to run this new incarnation of Falcon 4 on Linux, be it the Wine team or the BMS team themselves. I’ve been playing around a bit with it and everything seems to work fine so, again, bg kudos to anyone involved.Just as a reference, in case it might help anyone, I’m using it on a Fedora 18 system, using Wine 1.5.24 and an nVidia card (using the propietary drivers). The program was installed through excellent PlayOnLinux tool, with no specific quirks. On F4-BMS side, I only had to disable “Triple Buffering” in Config tool, as otherwise I was getting a completely black screen (although the program was indeed responsible).
By the way, I’ve been working for some time in a new joystick programming tool for Linux, which includes complete support for modes & shift buttons, axis programming through bands, etc… In case anyone muight be interested in using it (I’m using it right now with my old Saitek X-45), the link is in my sig.
Kind regards,
Eduard Huguet -
@Eduard
Are you using TrackIR, or any other track? -
Nope, sorry. I don’t have TrackIR, only the X-45 HOTAS.
I do have a webcam, however. Is there any webcam-based head tracking solution on Linux that I could try?
Eduard -
Shameless plug:
https://github.com/opentrack/opentrack
Builds and runs fine under Linux with TrackIR emulation.
-
Looks promising. I’ll give it a try, thanks
Regards,
Eduard Huguet -
Quite frankly, I don’t like the kernel module approach you chose. It’d be better to do a userland driver, stability-wise. Especially if you parse XML and do other fancy stuff. Look at xboxdrv, there’s some overlap and it’s done pure-userland.
-
Quite frankly, I don’t like the kernel module approach you chose. It’d be better to do a userland driver, stability-wise. Especially if you parse XML and do other fancy stuff. Look at xboxdrv, there’s some overlap and it’s done pure-userland.
Hi,
Thank you very much for your feedback, I really appreciate it. As for the comments you do, first of all let me make clear that the XML parsing is not done at all at kernel level, that definitely would be a very bad idea. This part is handled by the helper C/C++ library, which is used by the userspace tools. The assignments are then loaded into the driver using a fairly simple IOCTL-based API, similar to that of standard joydev module. The kernel module does some “fancy” things, as you put it ;), but definitely nothing very complicated.As for the userland vs in-kernel model, let me explain why I choosed the second path: when I started the project, I tried first the userland way, by implementing a daemon that read events from the joystick (using joydev’s standard JS API), then inject mouse & keyboard events into graphical stack by using XTEST X server extension. Although this part mainly worked, it had a main drawback, which is the impossibility to deny the target game (or program) the access to the source joystick event that originating the event. I mean, not all games allow you to “deassign” a button or an axis so it does nothing on the game, so if you program a button to issue a keyboard shortcut when it’s pressed, you can’t stop the game from performing also the action it had assigned internally to that button, in addition to the programmed shortcut’s one. IMHO, this was a serious limitation.
Instead, by implementing a a kernel-level filter you do have a very early access to the events sent by the joystick driver, in fact right before joydev itself receives them, and you have the ability to filter them out and generate your own from an internal virtual input generator. That renders the kernel approach very powerful, as you can map a button event to a shortcut without userspace ever knowing about the original event.
Regarding xboxdrv (a project I wasn’t aware of, frankly, but I’ve been thoroughly reading the documentation so I could at least know how it is implemented) it uses a different approach, which is directly reading RAW device data sent through libusb, then mapping source events to generated events that get injected through uinput extension (a kernel extension that allows to inject events into kernel input subsystem from userspace). Although it seems a valid approach, IMVHO it might have some flaws:
- It needs to decode the RAW data sent by the device, which is something that should definitely be done by the low level hardware driver, not from userspace. The input subsystem in Linux kernel is very cleverly designed, so all input devices transform the data sent by the hardware into a “normalized” set of events, so userspace does not need to know about device specifics. By re-doing this from userspace, your are definitely going an step back.
- I can’t clearly see if you can “hide” original events sent from the joystick. I suspect you can’t, as it suggests you to remove the “/dev/js0” created by joydev module so your game use the one created by xboxdrv. Again, this doesn’t look very good…
- It’s limited to USB devices. OK, this might not be an issue, as most game devices available are USB, but still.
That said, there are things I like from it, like the fact they use “uinput” to inject the events from userspace. This is something definitively worth looking at it, as I could take part of the mapping code out from the kernel and move it to userspace, but I’m sure I’d still need to use kernel module in order to provide the low level filtering.
Anyway, the approach used by JSMapper renders it quite universal, as it operates on the “normalized” set of events injected into the input subystem, so it didn’t need to care about any device specifics, it should work out-of-the-box on all of them. Obviosly, there still a lot of work to do, specially on the userland side, like i.e. providing a graphical UI to load profiles into the driver, or even a graphical UI to create profiles so you don’t need to mess around with XML format.
Hope this helps, and don’t hesitate to contact me if you have any other question
Kind regards,
Eduard HuguetPS: and sorry for the lengthy post…