101 lines
3.9 KiB
Plaintext
101 lines
3.9 KiB
Plaintext
This document is no longer up-to-date, but is a good start to
|
|
understanding how the OpenGL code works for non-filtered modes.
|
|
-------------------------------------------------------------------------
|
|
|
|
OpenGL is currently only available on Linux and via CVS. For the most
|
|
part, it works and fairly stable. Please send all comments, suggestions,
|
|
and bug fixes to hpsolo@my-deja.com. DO NOT EMAIL THE OTHER DEVELOPERS
|
|
SINCE THEY ARE not INVOLVED WITH THIS CODE. And please make sure you've
|
|
read through the list of known issues before sending your bug report.
|
|
|
|
|
|
HOW OPENGL RENDERS THE SNES VIDEO BUFFER
|
|
|
|
The SNES video buffer has dimensions 288x224 (sometimes 288x239 for
|
|
certain games; however I have not come across any). The first 16 and last
|
|
16 column of pixels are not displayed (perhaps used as a scrolling
|
|
buffer?), so the only important part of the video buffer is the middle
|
|
256x224 pixels. The SNES video buffer pointer is vidbuffer. With OpenGL,
|
|
only the visible 256x224 pixels are needed and they are cropped into
|
|
glvidbuffer. glvidbuffer is then turned into a texture that gets bound to
|
|
a QUAD whose size depends on whether ZSNES uses aspect ratio to display
|
|
each frame.
|
|
|
|
|
|
HI-RES FILTERS WITH OPENGL
|
|
|
|
The video mode selection is taken care of by SDL, including full
|
|
screen mode. The current code does not allow for many hi-res filter
|
|
options. While it is not difficult to implement the hi-res features using
|
|
the current filtering code (in copyvwin.asm), it appears that the code for
|
|
copy640x480x16bwin() causes memory corruption and sometimes segfaults when
|
|
you exit ZSNES. For this reason, the filters have been left out. You can,
|
|
however, add it in yourself by:
|
|
|
|
1. allocating enough memory space for glvidbuffer (use realloc)
|
|
2. assign glvidbuffer to the destination pointer SurfBufD (instead of
|
|
surface->pixels)
|
|
3. setting Temp1 to surface->pitch, i.e. Temp1 = 2*SurfaceX
|
|
4. calling copy640x480x16bwin()
|
|
5. correctly binding the glvidbuffer as a texture to a QUAD
|
|
|
|
There is a old patch that enables these filters and it is located at:
|
|
http://www.students.uiuc.edu/~handuong/opengl.patch2
|
|
|
|
|
|
3DFX USERS (VOODOO2 AND OLDER HARDWARE)
|
|
|
|
Lord_Nightmare managed to get OpenGL to work on a Voodoo2. Some
|
|
things you'll need to do in order to get ZSNES OpenGL to work on your
|
|
Voodoo:
|
|
|
|
1. Make sure to have the latest Mesa drivers and compile it with
|
|
the following option:
|
|
|
|
make -f Makefile.X11 linux-386-glide
|
|
|
|
Voodoo2 users might want to use:
|
|
|
|
make -f Makefile.X11 linux-386-opt-glide
|
|
|
|
since that is optimized for Voodoo2 cards. According the the
|
|
XFree86 website, Voodoo3 users (and later) should have DRI
|
|
support via the tdfx driver so this might not be needed.
|
|
|
|
2. When you run ZSNES, make sure to set the environment variable
|
|
MESA_GLX_FX to either w or f (window/full screen). E.g. use
|
|
|
|
export MESA_GLX_FX=f
|
|
|
|
if you use a bash shell. Theoretically using the w option
|
|
should work, but it not only is slow (5fps) but seems
|
|
broken. Voodoo Rush users might be able to get by.
|
|
|
|
Note that only the 640x480 full screen mode works on the Voodoo2 cards
|
|
so please do not email me about the other video modes. Files which
|
|
might be useful to have before compiling anything:
|
|
|
|
Device3Dfx, Glide_SDK, Glide_V2 (or Glide_XXXX depending on your card)
|
|
|
|
I believe Glide 2 is what you want, as Glide 3 doesn't work for older
|
|
hardware. Also Device3Dfx may not be implemented the same way for 2.4.x
|
|
kernels.
|
|
|
|
|
|
KNOWN ISSUES (AND SOME WORK-AROUNDS)
|
|
|
|
- after many video mode switches (all windowed), switching to full screen
|
|
then back to window mode cases an SDL parachute exit; try not to use too
|
|
many video mode changes, and restart ZSNES every once in a while if you
|
|
are just testing out video modes
|
|
|
|
- segfault after having compiled the source -- this might be due to an old
|
|
zguicfg.dat file; delete this and see if the problem gets fixed
|
|
|
|
|
|
TODO
|
|
|
|
- use something like SDL_GL_UpdateRects with hi-res filters
|
|
|
|
-- hpsolo --
|