276 lines
9.5 KiB
Plaintext
276 lines
9.5 KiB
Plaintext
|
Mesa 6.5 DOS/DJGPP Port v1.8
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
|
||
|
|
||
|
Description:
|
||
|
~~~~~~~~~~~~
|
||
|
|
||
|
Well, guess what... this is the DOS port of Mesa 6.5, for DJGPP fans... Whoa!
|
||
|
The driver uses OSMesa to draw off screen, and then blits the buffer. This is
|
||
|
not terribly efficient, and has some drawbacks, but saves maintenance costs.
|
||
|
|
||
|
|
||
|
|
||
|
Legal:
|
||
|
~~~~~~
|
||
|
|
||
|
Mesa copyright applies.
|
||
|
|
||
|
|
||
|
|
||
|
Installation:
|
||
|
~~~~~~~~~~~~~
|
||
|
|
||
|
Unzip and type:
|
||
|
|
||
|
make -f Makefile.DJ [OPTIONS...]
|
||
|
|
||
|
Available options:
|
||
|
|
||
|
Environment variables:
|
||
|
CPU optimize for the given processor.
|
||
|
default = pentium
|
||
|
GLIDE path to Glide3 SDK; used with FX.
|
||
|
default = $(TOP)/glide3
|
||
|
FX=1 build for 3dfx Glide3. Note that this disables
|
||
|
compilation of most DMesa code and requires fxMesa.
|
||
|
As a consequence, you'll need the DJGPP Glide3
|
||
|
library to build any application.
|
||
|
default = no
|
||
|
X86=1 optimize for x86 (if possible, use MMX, SSE, 3DNow).
|
||
|
default = no
|
||
|
|
||
|
Targets:
|
||
|
all: build everything
|
||
|
libgl: build GL
|
||
|
libglu: build GLU
|
||
|
libglut: build GLUT
|
||
|
clean: remove object files
|
||
|
realclean: remove all generated files
|
||
|
|
||
|
|
||
|
|
||
|
Tested on:
|
||
|
Video card: Radeon 9500
|
||
|
DJGPP: djdev 2.04 + gcc v4.1.0 + make v3.80
|
||
|
OS: DOS, Win98SE, WinXP (using Videoport driver)
|
||
|
|
||
|
|
||
|
|
||
|
FAQ:
|
||
|
~~~~
|
||
|
|
||
|
1. Compilation
|
||
|
|
||
|
Q) `make' barfs and exits because it cannot find some stupid file.
|
||
|
A) You need LFN support.
|
||
|
A) When compiling for Glide (FX=1), pay attention to Glide path.
|
||
|
|
||
|
Q) Libraries built OK, but linker complains about `vsnprintf' every time I
|
||
|
compile some demo.
|
||
|
A) Upgrade to DJGPP 2.04.
|
||
|
A) Add `vsnprintf.c' to the CORE_SOURCES in `src/Makefile.DJ' (untested!).
|
||
|
A) Patch `src/mesa/main/imports.c' with the following line:
|
||
|
#define vsnprintf(buf, max, fmt, arg) vsprintf(buf, fmt, arg)
|
||
|
This hack should be safe in 90% of the cases, but if anything goes wrong,
|
||
|
don't come back to me crying.
|
||
|
|
||
|
Q) `make' complains about DXE3 or something, yet it builds the libraries.
|
||
|
A) DXE3 refers to the DJGPP dynamic modules. You'll need either the latest
|
||
|
DJGPP distro, or download the separate package from my web page. Read the
|
||
|
DXE3 documentation on how to use them.
|
||
|
A) When compiling for Glide (FX=1), make sure `glide3x.dxe' can be found in
|
||
|
LD_LIBRARY_PATH (or top `lib' directory).
|
||
|
|
||
|
2. Using Mesa for DJGPP
|
||
|
|
||
|
Q) Every test I tried crashes badly.
|
||
|
A) If you have compiled with SSE and you're running under plain DOS, you
|
||
|
have to disable SSE at run-time. See environment variables below.
|
||
|
|
||
|
Q) DMesa is so SLOOOW! The Win32 OpenGL performs so much better...
|
||
|
A) Is that a question? If you have a 3dfx Voodoo (any model), you're
|
||
|
lucky (check http://sourceforge.net/projects/glide for the DJGPP port).
|
||
|
If you haven't, sorry; everything is done in software.
|
||
|
|
||
|
Q) I tried to set refresh rate w/ DMesa, but without success.
|
||
|
A) Refresh rate control works only for VESA 3.0 and the 3dfx driver (in
|
||
|
which case FX_GLIDE_REFRESH will be overwritten if it is defined and
|
||
|
is not 0).
|
||
|
|
||
|
Q) I made a simple application and it does nothing. It exits right away. Not
|
||
|
even a blank screen.
|
||
|
A) Software drivers (VESA/VGA/NUL) must to be constructed as single-buffered
|
||
|
visuals. However, DMesaSwapBuffers must be called to get any output.
|
||
|
A) Another weird "feature" is that buffer width must be multiple of 8 (I'm a
|
||
|
lazy programmer and I found that the easiest way to keep buffer handling
|
||
|
at peak performance ;-).
|
||
|
|
||
|
Q) I'm getting a "bad font!" fatal error.
|
||
|
A) Always use GLUT_STROKE_* and GLUT_BITMAP_* constants when dealing with
|
||
|
GLUT fonts. If you're using `glut.dxe', then make sure GLUT_STROKE_* and
|
||
|
GLUT_BITMAP_* are mapped to integer constants, not to the actual font
|
||
|
address (same mechanism used for Win32 _DLL).
|
||
|
|
||
|
Q) What is NUL driver good for, if I don't get any output at all?
|
||
|
A) For debugging. The NUL driver is very much like OSMesa. Everything is
|
||
|
done just the same as VESA/VGA drivers, only it doesn't touch your video
|
||
|
hardware. You can query the actual buffer by issuing:
|
||
|
DMesaGetIntegerv(DMESA_GET_BUFFER_ADDR, &buffer);
|
||
|
and dump it to a file.
|
||
|
|
||
|
Q) How do I query for a list of available video modes to choose as a visual?
|
||
|
A) This is an ugly hack, for which I'm sure I'll burn in hell.
|
||
|
First, query for a list of modes:
|
||
|
n = DMesaGetIntegerv(DMESA_GET_VIDEO_MODES, NULL);
|
||
|
If `n' is strictly positive, you allocate an array of pointers to a given
|
||
|
struct (which is guaranteed to be extended only - not changed in future):
|
||
|
struct {
|
||
|
int xres, yres;
|
||
|
int bpp;
|
||
|
} **l = malloc(n * sizeof(void *));
|
||
|
Now pass the newly allocated buffer to fill in:
|
||
|
DMesaGetIntegerv(DMESA_GET_VIDEO_MODES, (GLint *)l);
|
||
|
And collect the info:
|
||
|
for (i = 0; i < n; i++) {
|
||
|
printf("%dx%d:%d\n", l[i]->xres, l[i]->yres, l[i]->bpp);
|
||
|
}
|
||
|
|
||
|
Q) The GLUT is incomplete.
|
||
|
A) See below.
|
||
|
|
||
|
|
||
|
|
||
|
libGLUT (the toolkit):
|
||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
Well, this "skeletal" GLUT implementation was taken from AllegGL project and
|
||
|
heavily changed. Thanks should go to Bernhard Tschirren, Mark Kilgard, Brian
|
||
|
Paul and probably others (or probably not ;-). GLUT functionality will be
|
||
|
extended only on an "as needed" basis.
|
||
|
|
||
|
GLUT talks to hardware via PC_HW package which was put together from various
|
||
|
pieces I wrote long time ago. It consists from the keyboard, mouse and timer
|
||
|
drivers.
|
||
|
|
||
|
My keyboard driver used only scancodes; as GLUT requires ASCII values for keys,
|
||
|
I borrowed the translation tables (and maybe more) from Allegro -- many thanks
|
||
|
to Shawn Hargreaves et co. Ctrl-Alt-Del (plus Ctrl-Alt-End, for Windows users)
|
||
|
will shut down the GLUT engine unconditionally: it will raise SIGINT, which in
|
||
|
turn will (hopefully) call the destructors, thus cleaning up your/my mess ;-)
|
||
|
NB: since the DJGPP guys ensured signal handlers won't go beyond program's
|
||
|
space (and since dynamic modules shall) the SIGINT can't be hooked (well, it
|
||
|
can, but it is useless), therefore you must live with the 'Exiting due to
|
||
|
signal SIGINT' message...
|
||
|
|
||
|
The mouse driver is far from complete (lack of drawing, etc), but is enough to
|
||
|
make almost all the demos work. Supports the CuteMouse WheelAPI.
|
||
|
|
||
|
The timer is pretty versatile for it supports multiple timers with different
|
||
|
frequencies. While not being the most accurate timer in the known universe, I
|
||
|
think it's OK. Take this example: you have timer A with a very high rate, and
|
||
|
then you have timer B with very low rate compared to A; now, A ticks OK, but
|
||
|
timer B will probably loose precision!
|
||
|
|
||
|
As an addition, stdout and stderr are redirected and dumped upon exit. This
|
||
|
means that `printf' can be safely called during graphics. A bit of a hack, I
|
||
|
know, because all messages come in bulk, but I think it's better than nothing.
|
||
|
"Borrowed" from LIBRHUTI (Robert Hoehne).
|
||
|
|
||
|
Window creating defaults: (0, 0, 300, 300), 16bpp. However, the video mode is
|
||
|
chosen in such a way that first window will fit. If you need high resolution
|
||
|
with small windows, set initial position far to the right (or way down); then
|
||
|
you can move them back to any position right before the main loop.
|
||
|
|
||
|
|
||
|
|
||
|
Environment variables:
|
||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||
|
DMESA_NULDRV - (any value) force NUL driver
|
||
|
GLUT_FPS - print frames/second statistics to stderr
|
||
|
MESA_NO_SSE - (any value) safe option under pure DOS
|
||
|
DMESA_GLUT_REFRESH - set vertical screen refresh rate (VESA3)
|
||
|
DMESA_GLUT_BPP - set default bits per pixel (VGA needs 8)
|
||
|
DMESA_GLUT_ALPHA - set default alpha bits (8)
|
||
|
DMESA_GLUT_DEPTH - set default depth bits (16)
|
||
|
DMESA_GLUT_STENCIL - set default stencil bits (8)
|
||
|
DMESA_GLUT_ACCUM - set default accum bits (16)
|
||
|
|
||
|
|
||
|
|
||
|
History:
|
||
|
~~~~~~~~
|
||
|
|
||
|
v1.0 (mar-2002)
|
||
|
initial release
|
||
|
|
||
|
v1.1 (sep-2002)
|
||
|
+ added 3dfx Glide3 support
|
||
|
+ added refresh rate control
|
||
|
+ added fonts in GLUT
|
||
|
* lots of minor changes
|
||
|
|
||
|
v1.2 (nov-2002)
|
||
|
* synced w/ Mesa-4.1
|
||
|
- removed dmesadxe.h
|
||
|
|
||
|
v1.3 (mar-2003)
|
||
|
+ enabled OpenGL 1.4 support
|
||
|
+ added MMX clear/blit routines
|
||
|
+ enabled SGI's GLU compilation
|
||
|
+ added samples makefile
|
||
|
+ added new GLUT functions
|
||
|
+ added color-index modes
|
||
|
+ added Matrox Millennium MGA2064W driver
|
||
|
+ added 8bit FakeColor (thanks to Neil Funk)
|
||
|
+ added VGA support (to keep Ben Decker happy)
|
||
|
! fixed some compilation errors (reported by Chan Kar Heng)
|
||
|
* optimized driver for faster callback access... yeah, right :)
|
||
|
* overhauled virtual buffer and internal video drivers
|
||
|
* better fxMesa integration
|
||
|
* revamped GLUT
|
||
|
* switched to DXE3
|
||
|
|
||
|
v1.4 (dec-2003)
|
||
|
+ enabled GLUT fonts with DXE
|
||
|
+ truly added multi-window support in GLUT (for Adrian Woodward)
|
||
|
* accomodated makefiles with the new sourcetree
|
||
|
* fixed some ALPHA issues
|
||
|
* minor changes to PC_HW/timer interface
|
||
|
x hacked and slashed the 3dfx driver (w/ help from Hiroshi Morii)
|
||
|
|
||
|
v1.5 (jan-2004)
|
||
|
+ added interface to query available "visuals" (GLFW - Marcus Geelnard)
|
||
|
+ added GLUT timer callback
|
||
|
- removed Matrox Millennium MGA2064W driver
|
||
|
x more changes to the 3dfx driver
|
||
|
|
||
|
v1.6 (aug-2004)
|
||
|
+ implemented NUL driver
|
||
|
+ added DMesaGetProcAddress and glutGetProcAddress
|
||
|
* reorganized fxMesa wrapper to handle multiple contexts
|
||
|
! fixed a horrible bug in VGA initialization routine
|
||
|
! fixed partial clears
|
||
|
|
||
|
v1.7 (???-2005)
|
||
|
+ enabled OpenGL 2.0 support
|
||
|
+ added support for sw texture compression
|
||
|
+ added FreeGLUT specific functions
|
||
|
* no more GLX sources in DOS GLUT
|
||
|
* made GLUT timer callbacks less accurate but safer
|
||
|
|
||
|
v1.8 (apr-2006)
|
||
|
* killed lots of code, the driver is now a front-end to OSMesa
|
||
|
* fixed problem with WinNT (http://www.volny.cz/martin.sulak/)
|
||
|
- removed 3dfx Glide3 support (temporarily?)
|
||
|
|
||
|
|
||
|
|
||
|
Contact:
|
||
|
~~~~~~~~
|
||
|
|
||
|
Name: Daniel Borca
|
||
|
E-mail: dborca@users.sourceforge.net
|
||
|
WWW: http://www.geocities.com/dborca/
|