Since I tend to forget things once they are solved I decided to write a short primer on how to run sdlmame on a hardware accelerated framebuffer device supporting YUV-overlays. This is really not a trivial task and this document only covers the last steps in detail.
Please take this warning serious. You are in root's realm and executing low level drivers.
There are a couple of things you need before the steps outlined below will actually work:
A working framebuffer device (i.e. /dev/fb0
) largely depends on your distribution. The first obstacle in my case was persuading ubuntu to load the radeonfb driver at boot. It involved messing around with initramfs-tools and modifying scripts - only to find out that my R480 based card was not supported. On the net I found a patch for a later kernel which I had to modify for the stock 2.6.20 ubuntu-feisty kernel. For gutsy, the situation has not improved. Still the same driver issues - no r480 support - and consequently modifications.
The stock sdl 1.2.11 directfb driver simply did not work with my radeon card. I could not get YUV-overlays to work although they are supported in the code. I would guess the reason is that it has not seen attention for a while. Consequently I started work on an enhanced directfb driver a while ago. It is now kindly hosted at Arbee's WIP Emporium » SDLHome x.y.z.
In order to install a modified SDL library, you have to replace the directfb driver source with the modified one. On ubuntu you would do the following:
core:/tmp$ apt-get source libsdl1.2debian ... core:/tmp$ wget -U firefox http://rbelmont.mameworld.info/directfb.tar.gz ... core:/tmp$ cd libsdl1.2-1.2.11/ core:/tmp/libsdl1.2-1.2.11$ tar xfz ../directfb.tar.gz core:/tmp/libsdl1.2-1.2.11$ dch -i DirectFB Replacement core:/tmp/libsdl1.2-1.2.11$ debuild -us -uc
The Ubuntu edgy/feisty developers did a nice job here since no further package configuration was necessary.
Finally you need install the package as root:
core:/libsdl1.2-1.2.11$ sudo dpkg -i ../libsdl1.2debian-alsa_1.2.11-7ubuntu2_amd64.deb ...
Other distributions may require more work or basic ./configure; make; make install
with appropriate configure tweaking. If you are putting together an X-less system, –without-x –disable-video-x11
will be your friends.
Still here? Good. You should now have a framebuffer device:
core:~$ cat /proc/fb 0 ATI Radeon ]O core:~$ ls -l /dev/fb0 crw-rw---- 1 root video 29, 0 2007-07-20 19:59 /dev/fb0
If this is not the case, try
core:~$ sudo modprobe fbcon core:~$ sudo modprobe radeonfb # for radeon cards
dfbinfo should contain something like the following:
Screen (00) FBDev Primary Screen (primary screen) Caps: VSYNC POWER_MANAGEMENT Layer (00) FBDev Primary Layer (primary layer) Type: GRAPHICS Caps: SURFACE BRIGHTNESS CONTRAST SATURATION Layer (01) Radeon CRTC1's Overlay Type: GRAPHICS VIDEO STILL_PICTURE Caps: SURFACE OPACITY SCREEN_LOCATION DEINTERLACING DST_COLORKEY BRIGHTNESS CONTRAST HUE SATURATION SCREEN_POSITION SCREEN_SIZE
Layer (01) is important. If this layer does not exist or does not support “VIDEO” type there is no chance for hardware accelerated YUV overlays. We now need the following lines in /etc/directfbrc:
mode=1024x768 depth=16 disable-module=joystick disable-module=linux_input
The last two lines will make sure that joysticks work. The first two lines define the “startup” video mode. You should have a corresponding entry in /etc/fb.modes. Now is the time: Execute the following as root.
You are now acting on your own and declared will. All sorts of strange things may happen - including loosing all your data!
export SDL_VIDEO_YUV_DIRECT=1 export SDL_VIDEODRIVER=directfb mamepm -video soft -scalemode yuy2 -verbose galaga
If everything worked a game like galaga will show a performance of 250 to 300% in comparison to ”-video soft”.
I was able to get this to work on the following platforms:
Finally here is a screenshot of what you will get:
DirectFB does not support taking screenshots of YUV overlays. The screenshot is therefore taken with ”-video soft -ym none”.
The procedure described above should work for stock sdlmess/sdlmame. If you intend to set up a system without X, you have to compile sdlmess and sdlmame with the following command:
make NO_X11=1 NO_OPENGL=1
This will compile a binary with support only for software rendering and yuv-overlays.