DOS updates from Daniel Borca.
This commit is contained in:
+73
-69
@@ -1,4 +1,4 @@
|
||||
Mesa 4.1 DOS/DJGPP Port v1.2
|
||||
Mesa 5.0 DOS/DJGPP Port v1.3
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
Description:
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Well, guess what... this is the DOS port of Mesa 4.1, for DJGPP fans... Whoa!
|
||||
Well, guess what... this is the DOS port of Mesa 5.0, for DJGPP fans... Whoa!
|
||||
The driver has its origins in ddsample.c, written by Brian Paul and found by me
|
||||
in Mesa 3.4.2.
|
||||
|
||||
@@ -34,6 +34,8 @@ Available options:
|
||||
default = k6
|
||||
BIG_OPT=1 crazy optimizations; not very useful, though...
|
||||
default = no
|
||||
SGI_GLU=1 build SGI's GLU instead of Mesa's.
|
||||
default = no
|
||||
GLIDE absolute path to Glide library; used with FX.
|
||||
default = $(TOP)/include/glide3
|
||||
FX=1 build for 3dfx Glide3; use it if you have the Glide
|
||||
@@ -65,8 +67,9 @@ Available options:
|
||||
Tested on:
|
||||
CPU: K6-2 (CXT) @500(412.5) MHz
|
||||
Mainboard: ViA Apollo VP2/97 w/ 128 MB SDRAM
|
||||
Video card: PowerColor Evil King3 (Voodoo3 3000) w/ 16384 kB SDRAM
|
||||
Video card: PowerColor EvilKing3 (Voodoo3 3000 PCI) w/ 16 MB SDRAM
|
||||
DJGPP: djdev 2.04 + gcc v3.2 + make v3.79.1
|
||||
OS: DOS and Win9x
|
||||
|
||||
|
||||
|
||||
@@ -83,46 +86,34 @@ FAQ:
|
||||
2. Dynamic modules
|
||||
|
||||
Q) What are you mumbling about dynamic modules?
|
||||
A) You must have the DXE2 package (available on SimTel.Net, courtesy of
|
||||
Andrew Zabolotny) installed in order to build the dynamic modules.
|
||||
A) You must have the DXE3 package (available on my site) installed in order
|
||||
to build the dynamic modules.
|
||||
|
||||
Q) I have DXE2, but I couldn't build the `dxe2gen.exe'.
|
||||
Q) I built `dxe2gen.exe', but it doesn't do the job right.
|
||||
A) There is a patched version on my web page.
|
||||
|
||||
Q) DXE2 modules give me headaches...
|
||||
A) The DXE2 modules are not compulsory. The static libraries are still built
|
||||
Q) DXE3 modules give me headaches...
|
||||
A) The DXE3 modules are not compulsory. The static libraries are still built
|
||||
and you can use them in the old-fashioned, classic way... and learn to
|
||||
live with your ~2MB executable size. For example:
|
||||
live with your huge executable size. For example:
|
||||
gcc -o OUT.exe IN.c -lglut -lglu -lgl
|
||||
|
||||
Q) Okay, DXE2 modules are built. How can I use them?
|
||||
Q) Okay, DXE3 modules are built. How can I use them?
|
||||
A) Build your export object file; then link it with your application.
|
||||
For example:
|
||||
dxe2res -o dmesadxe.c gl.dxe glu.dxe glut.dxe
|
||||
gcc -o dmesadxe.o dmesadxe.c
|
||||
dxe3res -o dmesadxe.c gl.dxe glu.dxe glut.dxe
|
||||
gcc -o dmesadxe.o -c -fno-builtin dmesadxe.c
|
||||
gcc -o OUT.exe dmesadxe.o IN.c -liglut -liglu -ligl -ldl
|
||||
|
||||
Q) What is that `dxe2res.exe' thing?
|
||||
A) That is an utility that generates the export file for a given set of
|
||||
modules. If you can't find it in the DXE2 package, you must be looking at
|
||||
the wrong archive :)
|
||||
|
||||
3. Using Mesa for DJGPP
|
||||
|
||||
Q) Does this build work in Win9x?
|
||||
A) Yes.
|
||||
|
||||
Q) Does it work under NT (W2k, XP) core?
|
||||
A) Uh... probably not!
|
||||
Q) DMesa is so SLOOOW! The Win32 OpenGL performs so much better...
|
||||
A) Is that a question? If you have a Voodoo3/Banshee card, you're lucky. The
|
||||
Glide port is on my web page. If you haven't, sorry; everything is done
|
||||
in software. Suggestions?
|
||||
|
||||
Q) I made a simple application and it does nothing. It exits right away. Not
|
||||
even a blank screen.
|
||||
A) The current version supports only RGB[A] modes, for it made no sense to
|
||||
me to endorse color-index (aka palette) modes.
|
||||
A) Single-buffered is not allowed at all. Until I can find a way to use
|
||||
*REAL* hardware acceleration, it won't get implemented.
|
||||
A) Another weird "feature" is that buffer width must be multiple of 4 (I'm a
|
||||
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 ;-).
|
||||
|
||||
@@ -132,18 +123,12 @@ FAQ:
|
||||
GLUT took this into account for _WIN32 DLL's only; I don't want to modify
|
||||
his headers. The only workaround is to link GLUT the old way :-(
|
||||
|
||||
Q) DMesa is so SLOOOW! The Win32 OpenGL performs so much
|
||||
better...
|
||||
A) Is that a question? If you have a Voodoo3/Banshee card, you're lucky. The
|
||||
Glide port is on my web page. If you haven't, sorry; everything is done
|
||||
in software. Suggestions?
|
||||
Q) I tried to set refresh rate w/ DMesa, but without success.
|
||||
A) Refresh rate control works only for VESA 3.0. If you were compiling for
|
||||
Glide, see Glide info. If not, sorry!
|
||||
|
||||
Q) I have a super/mega/ultra monitor and all you can do is 60Hz? My eyes are
|
||||
leaking from the orbits...
|
||||
A) If you were compiling for Glide, see Glide info. If not, be aware that
|
||||
refresh rate control works only for VESA 3.0. The environment variable
|
||||
DMESA_REFRESH sets the default screen refresh. For example:
|
||||
set DMESA_REFRESH=75
|
||||
Q) The GLUT is incomplete.
|
||||
A) See below.
|
||||
|
||||
|
||||
|
||||
@@ -152,52 +137,71 @@ libGLUT (the toolkit):
|
||||
|
||||
Well, this "skeletal" GLUT implementation is not mine. Thanks should go to
|
||||
Bernhard Tschirren, Mark Kilgard, Brian Paul and probably others (or probably
|
||||
not ;-). I only changed it to be self-standing (Allegro-free). The keyboard,
|
||||
mouse and timer drivers were inspired from an old project of mine (D3Xl) and
|
||||
fixed with many Allegro "infusions"; I deeply thank to Shawn Hargreaves et co.
|
||||
not ;-). GLUT functionality will be extended only on an "as needed" basis.
|
||||
|
||||
My keyboard driver used only scancodes, but since GLUT requires ASCII values
|
||||
for keys, I borrowed the translation tables (and maybe more) from Allegro.
|
||||
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 call the
|
||||
destructors (let's hope), 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...
|
||||
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 positioning, drawing, etc),
|
||||
but is enough to make almost all the demos work.
|
||||
The mouse driver is far from complete (lack of positioning, drawing, etc), but
|
||||
is enough to make almost all the demos work.
|
||||
|
||||
The timer is pretty versatile for it supports multiple timers with different
|
||||
frequencies. It may not be the most accurate timer in the known universe, but
|
||||
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!
|
||||
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, but all messages come
|
||||
in bulk! A bit of a hack, I know, but I think it's better than to miss them
|
||||
at all. "Borrowed" from RHIDE (Robert Hoehne) or SETEDIT (Salvador Eduardo
|
||||
Tropea)... I'm not sure.
|
||||
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: 640x480x16 at (0,0), 8-bit stencil, 16-bit accum.
|
||||
However, the video mode is chosen in such a way that first window will fit.
|
||||
However, the video mode is chosen in such a way that first window will fit. If
|
||||
you need high resolution with small windows, try to place them far to the right
|
||||
(or way down).
|
||||
|
||||
The following environment variables can customize GLUT behaviour:
|
||||
DMESA_GLUT_REFRESH - set vertical screen refresh rate
|
||||
DMESA_GLUT_BPP - set default bits per pixel
|
||||
|
||||
|
||||
|
||||
History:
|
||||
~~~~~~~~
|
||||
|
||||
v1.0 mar-2002 initial release
|
||||
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.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.2 (nov-2002)
|
||||
* synced w/ Mesa-4.1
|
||||
- removed dmesadxe.h
|
||||
|
||||
v1.3 (dec-2002)
|
||||
+ enabled OpenGL 1.4 support
|
||||
+ added MMX clear/blit routines
|
||||
+ enabled SGI's GLU compilation
|
||||
+ added color-index modes
|
||||
+ added 8bit FakeColor (thanks to Neil Funk)
|
||||
+ added VGA support (to keep Ben Decker happy)
|
||||
* fixed GLUT compilation error (reported by Chan Kar Heng)
|
||||
* overhauled virtual buffer and internal video drivers
|
||||
* better fxMesa integration
|
||||
* extended GLUT functionality
|
||||
* switched to DXE3
|
||||
|
||||
|
||||
|
||||
|
||||
+70
-12
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.2 for Mesa 4.1
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -37,6 +37,17 @@
|
||||
#define DMESA_MAJOR_VERSION 5
|
||||
#define DMESA_MINOR_VERSION 0
|
||||
|
||||
/* Sample Usage:
|
||||
*
|
||||
* 1. Call DMesaCreateVisual() to initialize graphics.
|
||||
* 2. Call DMesaCreateContext() to create a DMesa rendering context.
|
||||
* 3. Call DMesaCreateBuffer() to define the window.
|
||||
* 4. Call DMesaMakeCurrent() to bind the DMesaBuffer to a DMesaContext.
|
||||
* 5. Make gl* calls to render your graphics.
|
||||
* 6. Use DMesaSwapBuffers() when double buffering to swap front/back buffers.
|
||||
* 7. Before exiting, destroy DMesaBuffer, DMesaContext and DMesaVisual.
|
||||
*/
|
||||
|
||||
typedef struct dmesa_context *DMesaContext;
|
||||
typedef struct dmesa_visual *DMesaVisual;
|
||||
typedef struct dmesa_buffer *DMesaBuffer;
|
||||
@@ -45,32 +56,79 @@ typedef struct dmesa_buffer *DMesaBuffer;
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
DMesaVisual DMesaCreateVisual (GLint width, GLint height,
|
||||
GLint colDepth,
|
||||
GLboolean dbFlag,
|
||||
GLint depthSize,
|
||||
GLint stencilSize,
|
||||
GLint accumSize);
|
||||
/*
|
||||
* Create a new Visual and set graphics mode.
|
||||
*/
|
||||
DMesaVisual DMesaCreateVisual (GLint width, /* X res */
|
||||
GLint height, /* Y res */
|
||||
GLint colDepth, /* BPP */
|
||||
GLint refresh, /* refresh rate: 0=default */
|
||||
GLboolean dbFlag, /* double-buffered */
|
||||
GLboolean rgbFlag, /* RGB mode */
|
||||
GLboolean alphaFlag,/* alpha buffer requested */
|
||||
GLint depthSize, /* requested bits/depth */
|
||||
GLint stencilSize, /* requested bits/stencil */
|
||||
GLint accumSize); /* requested bits/accum */
|
||||
|
||||
/*
|
||||
* Destroy Visual and restore screen.
|
||||
*/
|
||||
void DMesaDestroyVisual (DMesaVisual v);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Create a new Context for rendering.
|
||||
*/
|
||||
DMesaContext DMesaCreateContext (DMesaVisual visual, DMesaContext share);
|
||||
|
||||
/*
|
||||
* Destroy Context.
|
||||
*/
|
||||
void DMesaDestroyContext (DMesaContext c);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Create a new Buffer (window).
|
||||
*/
|
||||
DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
|
||||
GLint xpos, GLint ypos,
|
||||
GLint width, GLint height);
|
||||
|
||||
/*
|
||||
* Destroy Buffer.
|
||||
*/
|
||||
void DMesaDestroyBuffer (DMesaBuffer b);
|
||||
|
||||
DMesaContext DMesaCreateContext (DMesaVisual visual, DMesaContext share);
|
||||
|
||||
void DMesaDestroyContext (DMesaContext c);
|
||||
|
||||
/*
|
||||
* Bind Buffer to Context and make the Context the current one.
|
||||
*/
|
||||
GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Swap the front and back buffers for the given Buffer.
|
||||
* No action is taken if the buffer is not double buffered.
|
||||
*/
|
||||
void DMesaSwapBuffers (DMesaBuffer b);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Move/Resize Buffer.
|
||||
*/
|
||||
GLboolean DMesaViewport (DMesaBuffer b,
|
||||
GLint xpos, GLint ypos,
|
||||
GLint width, GLint height);
|
||||
|
||||
GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b);
|
||||
|
||||
void DMesaSwapBuffers (DMesaBuffer b);
|
||||
/*
|
||||
* Set CI color using normalized values.
|
||||
*/
|
||||
void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# DOS/DJGPP glu makefile v1.1 for Mesa 4.0
|
||||
# DOS/DJGPP glu makefile v1.3 for Mesa 5.0
|
||||
#
|
||||
# Copyright (C) 2002 - Borca Daniel
|
||||
# Email : dborca@yahoo.com
|
||||
@@ -52,10 +52,10 @@ CC = gcc
|
||||
CFLAGS += -I$(TOP)/include
|
||||
|
||||
AR = ar
|
||||
ARFLAGS = ru
|
||||
ARFLAGS = rus
|
||||
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
|
||||
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe3.ld),)
|
||||
DXE3GEN = $(wildcard $(addsuffix /dxe3gen.exe,$(subst ;, ,$(PATH))))
|
||||
endif
|
||||
|
||||
RM = del
|
||||
@@ -78,7 +78,7 @@ SOURCES = $(CORE_SOURCES)
|
||||
OBJECTS = $(SOURCES:.c=.o)
|
||||
|
||||
.c.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) $<
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
|
||||
all: $(LIBDIR)/$(GLU_LIB) $(LIBDIR)/$(GLU_DXE) $(LIBDIR)/$(GLU_IMP)
|
||||
|
||||
@@ -86,11 +86,11 @@ $(LIBDIR)/$(GLU_LIB): $(OBJECTS)
|
||||
$(AR) $(ARFLAGS) $(LIBDIR)/$(GLU_LIB) $(OBJECTS)
|
||||
|
||||
$(LIBDIR)/$(GLU_DXE) $(LIBDIR)/$(GLU_IMP): $(OBJECTS)
|
||||
ifeq ($(DXE2GEN),)
|
||||
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
|
||||
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
|
||||
ifeq ($(DXE3GEN),)
|
||||
$(warning Missing DXE3GEN and/or DXE3.LD! You must have DXE3GEN)
|
||||
$(warning somewhere in PATH, and DXE3.LD in DJGPP/LIB directory.)
|
||||
else
|
||||
-dxe2gen -o $(LIBDIR)/$(GLU_DXE) -I $(LIBDIR)/$(GLU_IMP) $(OBJECTS) -E djgpp_ -E glu -D "Mesa DJGPP GLU" -U
|
||||
-dxe3gen -o $(LIBDIR)/$(GLU_DXE) -I $(LIBDIR)/$(GLU_IMP) -D "MesaGLU DJGPP" -E glu -X -P gl.dxe -U $(OBJECTS)
|
||||
endif
|
||||
|
||||
clean:
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 4.0
|
||||
#
|
||||
# Copyright (C) 1999 Brian Paul All Rights Reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
# and/or sell copies of the Software, and to permit persons to whom the
|
||||
# Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# DOS/DJGPP glu makefile v1.3 for Mesa 5.0
|
||||
#
|
||||
# Copyright (C) 2002 - Borca Daniel
|
||||
# Email : dborca@yahoo.com
|
||||
# Web : http://www.geocities.com/dborca
|
||||
|
||||
|
||||
#
|
||||
# Available options:
|
||||
#
|
||||
# Environment variables:
|
||||
# CFLAGS
|
||||
#
|
||||
# Targets:
|
||||
# all: build GLU
|
||||
# clean: remove object files
|
||||
#
|
||||
|
||||
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
TOP = ..
|
||||
LIBDIR = $(TOP)/lib
|
||||
GLU_LIB = libglu.a
|
||||
GLU_DXE = glu.dxe
|
||||
GLU_IMP = libiglu.a
|
||||
|
||||
CC = gcc
|
||||
CFLAGS += -DNDEBUG -DLIBRARYBUILD -I$(TOP)/include -Iinclude
|
||||
CXX = gxx
|
||||
CXXFLAGS = $(CFLAGS) -Ilibnurbs/internals -Ilibnurbs/interface -Ilibnurbs/nurbtess
|
||||
|
||||
AR = ar
|
||||
ARFLAGS = rus
|
||||
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe3.ld),)
|
||||
DXE3GEN = $(wildcard $(addsuffix /dxe3gen.exe,$(subst ;, ,$(PATH))))
|
||||
endif
|
||||
|
||||
RM = del
|
||||
|
||||
C_SOURCES = \
|
||||
libutil/error.c \
|
||||
libutil/glue.c \
|
||||
libutil/mipmap.c \
|
||||
libutil/project.c \
|
||||
libutil/quad.c \
|
||||
libutil/registry.c \
|
||||
libtess/dict.c \
|
||||
libtess/geom.c \
|
||||
libtess/memalloc.c \
|
||||
libtess/mesh.c \
|
||||
libtess/normal.c \
|
||||
libtess/priorityq.c \
|
||||
libtess/render.c \
|
||||
libtess/sweep.c \
|
||||
libtess/tess.c \
|
||||
libtess/tessmono.c
|
||||
|
||||
CC_SOURCES = \
|
||||
libnurbs/interface/bezierEval.cc \
|
||||
libnurbs/interface/bezierPatch.cc \
|
||||
libnurbs/interface/bezierPatchMesh.cc \
|
||||
libnurbs/interface/glcurveval.cc \
|
||||
libnurbs/interface/glinterface.cc \
|
||||
libnurbs/interface/glrenderer.cc \
|
||||
libnurbs/interface/glsurfeval.cc \
|
||||
libnurbs/interface/incurveeval.cc \
|
||||
libnurbs/interface/insurfeval.cc \
|
||||
libnurbs/internals/arc.cc \
|
||||
libnurbs/internals/arcsorter.cc \
|
||||
libnurbs/internals/arctess.cc \
|
||||
libnurbs/internals/backend.cc \
|
||||
libnurbs/internals/basiccrveval.cc \
|
||||
libnurbs/internals/basicsurfeval.cc \
|
||||
libnurbs/internals/bin.cc \
|
||||
libnurbs/internals/bufpool.cc \
|
||||
libnurbs/internals/cachingeval.cc \
|
||||
libnurbs/internals/ccw.cc \
|
||||
libnurbs/internals/coveandtiler.cc \
|
||||
libnurbs/internals/curve.cc \
|
||||
libnurbs/internals/curvelist.cc \
|
||||
libnurbs/internals/curvesub.cc \
|
||||
libnurbs/internals/dataTransform.cc \
|
||||
libnurbs/internals/displaylist.cc \
|
||||
libnurbs/internals/flist.cc \
|
||||
libnurbs/internals/flistsorter.cc \
|
||||
libnurbs/internals/hull.cc \
|
||||
libnurbs/internals/intersect.cc \
|
||||
libnurbs/internals/knotvector.cc \
|
||||
libnurbs/internals/mapdesc.cc \
|
||||
libnurbs/internals/mapdescv.cc \
|
||||
libnurbs/internals/maplist.cc \
|
||||
libnurbs/internals/mesher.cc \
|
||||
libnurbs/internals/monoTriangulationBackend.cc \
|
||||
libnurbs/internals/monotonizer.cc \
|
||||
libnurbs/internals/mycode.cc \
|
||||
libnurbs/internals/nurbsinterfac.cc \
|
||||
libnurbs/internals/nurbstess.cc \
|
||||
libnurbs/internals/patch.cc \
|
||||
libnurbs/internals/patchlist.cc \
|
||||
libnurbs/internals/quilt.cc \
|
||||
libnurbs/internals/reader.cc \
|
||||
libnurbs/internals/renderhints.cc \
|
||||
libnurbs/internals/slicer.cc \
|
||||
libnurbs/internals/sorter.cc \
|
||||
libnurbs/internals/splitarcs.cc \
|
||||
libnurbs/internals/subdivider.cc \
|
||||
libnurbs/internals/tobezier.cc \
|
||||
libnurbs/internals/trimline.cc \
|
||||
libnurbs/internals/trimregion.cc \
|
||||
libnurbs/internals/trimvertpool.cc \
|
||||
libnurbs/internals/uarray.cc \
|
||||
libnurbs/internals/varray.cc \
|
||||
libnurbs/nurbtess/directedLine.cc \
|
||||
libnurbs/nurbtess/gridWrap.cc \
|
||||
libnurbs/nurbtess/monoChain.cc \
|
||||
libnurbs/nurbtess/monoPolyPart.cc \
|
||||
libnurbs/nurbtess/monoTriangulation.cc \
|
||||
libnurbs/nurbtess/partitionX.cc \
|
||||
libnurbs/nurbtess/partitionY.cc \
|
||||
libnurbs/nurbtess/polyDBG.cc \
|
||||
libnurbs/nurbtess/polyUtil.cc \
|
||||
libnurbs/nurbtess/primitiveStream.cc \
|
||||
libnurbs/nurbtess/quicksort.cc \
|
||||
libnurbs/nurbtess/rectBlock.cc \
|
||||
libnurbs/nurbtess/sampleComp.cc \
|
||||
libnurbs/nurbtess/sampleCompBot.cc \
|
||||
libnurbs/nurbtess/sampleCompRight.cc \
|
||||
libnurbs/nurbtess/sampleCompTop.cc \
|
||||
libnurbs/nurbtess/sampleMonoPoly.cc \
|
||||
libnurbs/nurbtess/sampledLine.cc \
|
||||
libnurbs/nurbtess/searchTree.cc
|
||||
|
||||
SOURCES = $(C_SOURCES) $(CC_SOURCES)
|
||||
|
||||
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||
|
||||
.c.o:
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
.cc.o:
|
||||
$(CXX) -o $@ $(CXXFLAGS) -c $<
|
||||
|
||||
all: $(LIBDIR)/$(GLU_LIB) $(LIBDIR)/$(GLU_DXE) $(LIBDIR)/$(GLU_IMP)
|
||||
|
||||
$(LIBDIR)/$(GLU_LIB): $(OBJECTS)
|
||||
$(AR) $(ARFLAGS) $(LIBDIR)/$(GLU_LIB) $(OBJECTS)
|
||||
|
||||
$(LIBDIR)/$(GLU_DXE) $(LIBDIR)/$(GLU_IMP): $(OBJECTS)
|
||||
ifeq ($(DXE3GEN),)
|
||||
$(warning Missing DXE3GEN and/or DXE3.LD! You must have DXE3GEN)
|
||||
$(warning somewhere in PATH, and DXE3.LD in DJGPP/LIB directory.)
|
||||
else
|
||||
-dxe3gen -o $(LIBDIR)/$(GLU_DXE) -I $(LIBDIR)/$(GLU_IMP) -D "MesaGLU/SGI DJGPP" -E glu -X -P gl.dxe -U $(OBJECTS)
|
||||
endif
|
||||
|
||||
clean:
|
||||
-$(RM) $(subst /,\,libutil/*.o)
|
||||
-$(RM) $(subst /,\,libtess/*.o)
|
||||
-$(RM) $(subst /,\,libnurbs/interface/*.o)
|
||||
-$(RM) $(subst /,\,libnurbs/internals/*.o)
|
||||
-$(RM) $(subst /,\,libnurbs/nurbtess/*.o)
|
||||
|
||||
-include depend
|
||||
+23
-33
@@ -20,7 +20,7 @@
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# DOS/DJGPP glut makefile v1.1 for Mesa 4.0
|
||||
# DOS/DJGPP glut makefile v1.3 for Mesa 5.0
|
||||
#
|
||||
# Copyright (C) 2002 - Borca Daniel
|
||||
# Email : dborca@yahoo.com
|
||||
@@ -33,14 +33,7 @@
|
||||
# Environment variables:
|
||||
# CFLAGS
|
||||
#
|
||||
# GLIDE absolute path to Glide SDK; used with FX.
|
||||
# default = $(TOP)/include/glide3
|
||||
# FX=1 build for 3dfx Glide3; use it if you have the glide
|
||||
# SDK (designed for your platform), and, of course, a
|
||||
# 3dfx card... Note that this disables compilation of
|
||||
# actual DMesa code, as Glide does all the stuff!
|
||||
# default = no
|
||||
# MARK absolute path to original GLUT.
|
||||
# MKGLUT absolute path to original GLUT.
|
||||
# default = $(TOP)/src-glut
|
||||
#
|
||||
# Targets:
|
||||
@@ -54,23 +47,20 @@
|
||||
|
||||
TOP = ..
|
||||
GLIDE ?= $(TOP)/include/glide3
|
||||
MARK ?= $(TOP)/src-glut
|
||||
MKGLUT ?= $(TOP)/src-glut
|
||||
LIBDIR = $(TOP)/lib
|
||||
GLUT_LIB = libglut.a
|
||||
GLUT_DXE = glut.dxe
|
||||
GLUT_IMP = libiglut.a
|
||||
|
||||
CC = gcc
|
||||
CFLAGS += -I$(TOP)/include -I$(MARK)
|
||||
ifdef FX
|
||||
CFLAGS += -D__DOS__ -I$(GLIDE) -DFX -DFX_GLIDE3 -DFXMESA_USE_ARGB
|
||||
endif
|
||||
CFLAGS += -I$(TOP)/include -I$(MKGLUT)
|
||||
|
||||
AR = ar
|
||||
ARFLAGS = ru
|
||||
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
|
||||
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe3.ld),)
|
||||
DXE3GEN = $(wildcard $(addsuffix /dxe3gen.exe,$(subst ;, ,$(PATH))))
|
||||
endif
|
||||
|
||||
RM = del
|
||||
@@ -95,25 +85,25 @@ PC_HW_SOURCES = \
|
||||
PC_HW/pc_timer.c \
|
||||
PC_HW/pc_irq.S
|
||||
|
||||
MARK_SOURCES = \
|
||||
$(MARK)/glut_8x13.c \
|
||||
$(MARK)/glut_9x15.c \
|
||||
$(MARK)/glut_hel10.c \
|
||||
$(MARK)/glut_hel12.c \
|
||||
$(MARK)/glut_hel18.c \
|
||||
$(MARK)/glut_tr10.c \
|
||||
$(MARK)/glut_tr24.c
|
||||
MKGLUT_SOURCES = \
|
||||
$(MKGLUT)/glut_8x13.c \
|
||||
$(MKGLUT)/glut_9x15.c \
|
||||
$(MKGLUT)/glut_hel10.c \
|
||||
$(MKGLUT)/glut_hel12.c \
|
||||
$(MKGLUT)/glut_hel18.c \
|
||||
$(MKGLUT)/glut_tr10.c \
|
||||
$(MKGLUT)/glut_tr24.c
|
||||
|
||||
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES) $(MARK_SOURCES)
|
||||
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES) $(MKGLUT_SOURCES)
|
||||
|
||||
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||
|
||||
.c.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) $<
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
.S.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) $<
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
.s.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) -x assembler-with-cpp $<
|
||||
$(CC) -o $@ $(CFLAGS) -x assembler-with-cpp -c $<
|
||||
|
||||
all: $(LIBDIR)/$(GLUT_LIB) $(LIBDIR)/$(GLUT_DXE) $(LIBDIR)/$(GLUT_IMP)
|
||||
|
||||
@@ -121,16 +111,16 @@ $(LIBDIR)/$(GLUT_LIB): $(OBJECTS)
|
||||
$(AR) $(ARFLAGS) $(LIBDIR)/$(GLUT_LIB) $(OBJECTS)
|
||||
|
||||
$(LIBDIR)/$(GLUT_DXE) $(LIBDIR)/$(GLUT_IMP): $(OBJECTS)
|
||||
ifeq ($(DXE2GEN),)
|
||||
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
|
||||
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
|
||||
ifeq ($(DXE3GEN),)
|
||||
$(warning Missing DXE3GEN and/or DXE3.LD! You must have DXE3GEN)
|
||||
$(warning somewhere in PATH, and DXE3.LD in DJGPP/LIB directory.)
|
||||
else
|
||||
-dxe2gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) $(OBJECTS) -E djgpp_ -E glut -D "Mesa DJGPP GLUT" -U
|
||||
-dxe3gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) -D "MesaGLUT DJGPP" -E glut -X -P gl.dxe -P glu.dxe -U $(OBJECTS)
|
||||
endif
|
||||
|
||||
clean:
|
||||
-$(RM) $(subst /,\,*.o)
|
||||
-$(RM) $(subst /,\,PC_HW/*.o)
|
||||
-$(RM) $(subst /,\,$(MARK)/*.o)
|
||||
-$(RM) $(subst /,\,$(MKGLUT)/*.o)
|
||||
|
||||
-include depend
|
||||
|
||||
+42
-42
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.2 for DOS/DJGPP
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -73,21 +73,25 @@ void *pc_malloc (size_t size)
|
||||
/*
|
||||
* standard redirection
|
||||
*/
|
||||
static int h_out, h_outbak, h_err, h_errbak;
|
||||
#define STDOUT 1
|
||||
#define STDERR 2
|
||||
|
||||
static char outname[L_tmpnam];
|
||||
static int h_out, h_outbak;
|
||||
static char errname[L_tmpnam];
|
||||
static int h_err, h_errbak;
|
||||
|
||||
int pc_open_stdout (void)
|
||||
{
|
||||
if ((h_out=open(tmpnam(NULL), O_WRONLY | O_CREAT | O_TRUNC | O_TEXT | O_TEMPORARY, S_IRUSR | S_IWUSR)) >= 0) {
|
||||
if ((h_outbak=dup(1)) != -1) {
|
||||
fflush(stdout);
|
||||
if (dup2(h_out, 1) != -1) {
|
||||
return 0;
|
||||
}
|
||||
close(h_outbak);
|
||||
}
|
||||
close(h_out);
|
||||
tmpnam(outname);
|
||||
|
||||
if ((h_out=open(outname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
|
||||
h_outbak = dup(STDOUT);
|
||||
fflush(stdout);
|
||||
dup2(h_out, STDOUT);
|
||||
}
|
||||
return (h_out = -1);
|
||||
|
||||
return h_out;
|
||||
}
|
||||
|
||||
void pc_close_stdout (void)
|
||||
@@ -95,35 +99,32 @@ void pc_close_stdout (void)
|
||||
FILE *f;
|
||||
char *line = alloca(512);
|
||||
|
||||
if (h_out >= 0) {
|
||||
dup2(h_outbak, 1);
|
||||
if (h_out > 0) {
|
||||
dup2(h_outbak, STDOUT);
|
||||
close(h_out);
|
||||
close(h_outbak);
|
||||
|
||||
if ((f=fdopen(h_out, "r")) != NULL) {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stdout);
|
||||
}
|
||||
fclose(f);
|
||||
} else {
|
||||
close(h_out);
|
||||
f = fopen(outname, "rt");
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stdout);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
remove(outname);
|
||||
}
|
||||
}
|
||||
|
||||
int pc_open_stderr (void)
|
||||
{
|
||||
if ((h_err=open(tmpnam(NULL), O_WRONLY | O_CREAT | O_TRUNC | O_TEXT | O_TEMPORARY, S_IRUSR | S_IWUSR)) >= 0) {
|
||||
if ((h_errbak=dup(2)) != -1) {
|
||||
fflush(stderr);
|
||||
if (dup2(h_err, 2) != -1) {
|
||||
return 0;
|
||||
}
|
||||
close(h_errbak);
|
||||
}
|
||||
close(h_err);
|
||||
tmpnam(errname);
|
||||
|
||||
if ((h_err=open(errname, O_WRONLY | O_CREAT | O_TEXT | O_TRUNC, S_IREAD | S_IWRITE)) > 0) {
|
||||
h_errbak = dup(STDERR);
|
||||
fflush(stderr);
|
||||
dup2(h_err, STDERR);
|
||||
}
|
||||
return (h_err = -1);
|
||||
|
||||
return h_err;
|
||||
}
|
||||
|
||||
void pc_close_stderr (void)
|
||||
@@ -131,18 +132,17 @@ void pc_close_stderr (void)
|
||||
FILE *f;
|
||||
char *line = alloca(512);
|
||||
|
||||
if (h_err >= 0) {
|
||||
dup2(h_errbak, 2);
|
||||
if (h_err > 0) {
|
||||
dup2(h_errbak, STDERR);
|
||||
close(h_err);
|
||||
close(h_errbak);
|
||||
|
||||
if ((f=fdopen(h_err, "r")) != NULL) {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stderr);
|
||||
}
|
||||
fclose(f);
|
||||
} else {
|
||||
close(h_err);
|
||||
f = fopen(errname, "rt");
|
||||
while (fgets(line, 512, f)) {
|
||||
fputs(line, stderr);
|
||||
}
|
||||
fclose(f);
|
||||
|
||||
remove(errname);
|
||||
}
|
||||
}
|
||||
|
||||
+13
-1
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -28,19 +28,31 @@
|
||||
|
||||
|
||||
#include "GL/glut.h"
|
||||
#include "GL/dmesa.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
|
||||
#define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))
|
||||
|
||||
|
||||
|
||||
void APIENTRY glutSetColor (int ndx, GLfloat red, GLfloat green, GLfloat blue)
|
||||
{
|
||||
if (g_display_mode & GLUT_INDEX) {
|
||||
DMesaSetCI(ndx, CLAMP(red), CLAMP(green), CLAMP(blue));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
GLfloat APIENTRY glutGetColor (int ndx, int component)
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void APIENTRY glutCopyColormap (int win)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -30,10 +30,12 @@
|
||||
#include "GL/glut.h"
|
||||
#include "internal.h"
|
||||
|
||||
GLenum g_display_mode = 0;
|
||||
GLuint g_display_mode = 0;
|
||||
GLuint g_width = DEFAULT_WIDTH;
|
||||
GLuint g_height = DEFAULT_HEIGHT;
|
||||
GLint g_mouse = GL_FALSE;
|
||||
GLuint g_bpp = DEFAULT_BPP;
|
||||
GLuint g_refresh = 0;
|
||||
GLuint g_mouse = 0;
|
||||
GLboolean g_redisplay = GL_FALSE;
|
||||
GLint g_xpos = 0;
|
||||
GLint g_ypos = 0;
|
||||
|
||||
+10
-1
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -33,6 +33,15 @@
|
||||
|
||||
void APIENTRY glutInit (int *argcp, char **argv)
|
||||
{
|
||||
const char *env;
|
||||
|
||||
if ((env = getenv("DMESA_GLUT_BPP")) != NULL) {
|
||||
g_bpp = atoi(env);
|
||||
}
|
||||
if ((env = getenv("DMESA_GLUT_REFRESH")) != NULL) {
|
||||
g_refresh = atoi(env);
|
||||
}
|
||||
|
||||
glutGet(GLUT_ELAPSED_TIME);
|
||||
}
|
||||
|
||||
|
||||
@@ -45,10 +45,12 @@
|
||||
#define STENCIL_SIZE 8
|
||||
#define ACCUM_SIZE 16
|
||||
|
||||
extern GLenum g_display_mode;
|
||||
extern GLuint g_display_mode;
|
||||
extern GLuint g_width;
|
||||
extern GLuint g_height;
|
||||
extern GLint g_mouse;
|
||||
extern GLuint g_bpp;
|
||||
extern GLuint g_refresh;
|
||||
extern GLuint g_mouse;
|
||||
extern GLboolean g_redisplay;
|
||||
extern GLint g_xpos;
|
||||
extern GLint g_ypos;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -48,8 +48,10 @@ static void ticks_timer (void *p)
|
||||
int APIENTRY glutGet (GLenum type)
|
||||
{
|
||||
switch (type) {
|
||||
case GLUT_WINDOW_COLORMAP_SIZE:
|
||||
return (g_display_mode & GLUT_INDEX) ? 256 : 0;
|
||||
case GLUT_WINDOW_RGBA:
|
||||
return 1;
|
||||
return !(g_display_mode & GLUT_INDEX);
|
||||
case GLUT_ELAPSED_TIME:
|
||||
if (!timer_installed) {
|
||||
timer_installed = !timer_installed;
|
||||
|
||||
+4
-59
@@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP glut driver v1.2 for Mesa 4.1
|
||||
* DOS/DJGPP glut driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -28,26 +28,16 @@
|
||||
|
||||
|
||||
#include "GL/glut.h"
|
||||
#ifndef FX
|
||||
#include "GL/dmesa.h"
|
||||
#else
|
||||
#include "GL/fxmesa.h"
|
||||
#endif
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
|
||||
static int window;
|
||||
|
||||
#ifndef FX
|
||||
static DMesaVisual visual = NULL;
|
||||
static DMesaContext context = NULL;
|
||||
static DMesaBuffer buffer[MAX_WINDOWS];
|
||||
#else
|
||||
static void *visual = NULL;
|
||||
static fxMesaContext context = NULL;
|
||||
static int fx_attrib[32];
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -58,12 +48,8 @@ static void clean (void)
|
||||
for (i=0; i<MAX_WINDOWS; i++) {
|
||||
glutDestroyWindow(i+1);
|
||||
}
|
||||
#ifndef FX
|
||||
if (context) DMesaDestroyContext(context);
|
||||
if (visual) DMesaDestroyVisual(visual);
|
||||
#else
|
||||
if (context) fxMesaDestroyContext(context);
|
||||
#endif
|
||||
|
||||
pc_close_stdout();
|
||||
pc_close_stderr();
|
||||
@@ -76,23 +62,10 @@ int APIENTRY glutCreateWindow (const char *title)
|
||||
int i;
|
||||
|
||||
if (!visual) {
|
||||
int screen_w = DEFAULT_WIDTH;
|
||||
int screen_h = DEFAULT_HEIGHT;
|
||||
|
||||
if ((g_width<=640) && (g_height<=480)) {
|
||||
screen_w = 640;
|
||||
screen_h = 480;
|
||||
} else if ((g_width<=800) && (g_height<=600)) {
|
||||
screen_w = 800;
|
||||
screen_h = 600;
|
||||
} else if ((g_width<=1024) && (g_height<=768)) {
|
||||
screen_w = 1024;
|
||||
screen_h = 768;
|
||||
}
|
||||
|
||||
#ifndef FX
|
||||
if ((visual=DMesaCreateVisual(screen_w, screen_h, DEFAULT_BPP,
|
||||
if ((visual=DMesaCreateVisual(g_xpos + g_width, g_ypos + g_height, g_bpp, g_refresh,
|
||||
g_display_mode & GLUT_DOUBLE,
|
||||
!(g_display_mode & GLUT_INDEX),
|
||||
g_display_mode & GLUT_ALPHA,
|
||||
g_display_mode & GLUT_DEPTH ?DEPTH_SIZE :0,
|
||||
g_display_mode & GLUT_STENCIL?STENCIL_SIZE:0,
|
||||
g_display_mode & GLUT_ACCUM ?ACCUM_SIZE :0))==NULL) {
|
||||
@@ -103,25 +76,12 @@ int APIENTRY glutCreateWindow (const char *title)
|
||||
DMesaDestroyVisual(visual);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
i = 0;
|
||||
if (g_display_mode & GLUT_DOUBLE) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
|
||||
if (g_display_mode & GLUT_DEPTH) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = DEPTH_SIZE; }
|
||||
if (g_display_mode & GLUT_STENCIL) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = STENCIL_SIZE; }
|
||||
if (g_display_mode & GLUT_ACCUM) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = ACCUM_SIZE; }
|
||||
fx_attrib[i] = FXMESA_NONE;
|
||||
if ((context=fxMesaCreateBestContext(-1, screen_w, screen_h, fx_attrib))==NULL) {
|
||||
return 0;
|
||||
}
|
||||
visual = context;
|
||||
#endif
|
||||
|
||||
pc_open_stdout();
|
||||
pc_open_stderr();
|
||||
pc_atexit(clean);
|
||||
}
|
||||
|
||||
#ifndef FX
|
||||
for (i=0; i<MAX_WINDOWS; i++) {
|
||||
if (!buffer[i]) {
|
||||
DMesaBuffer b;
|
||||
@@ -143,11 +103,6 @@ int APIENTRY glutCreateWindow (const char *title)
|
||||
}
|
||||
|
||||
return 0;
|
||||
#else
|
||||
fxMesaMakeCurrent(context);
|
||||
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -159,12 +114,10 @@ int APIENTRY glutCreateSubWindow (int win, int x, int y, int width, int height)
|
||||
|
||||
void APIENTRY glutDestroyWindow (int win)
|
||||
{
|
||||
#ifndef FX
|
||||
if (buffer[win-1]) {
|
||||
DMesaDestroyBuffer(buffer[win-1]);
|
||||
buffer[win-1] = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -177,11 +130,7 @@ void APIENTRY glutPostRedisplay (void)
|
||||
void APIENTRY glutSwapBuffers (void)
|
||||
{
|
||||
if (g_mouse) pc_scare_mouse();
|
||||
#ifndef FX
|
||||
DMesaSwapBuffers(buffer[window]);
|
||||
#else
|
||||
fxMesaSwapBuffers();
|
||||
#endif
|
||||
if (g_mouse) pc_unscare_mouse();
|
||||
}
|
||||
|
||||
@@ -210,18 +159,15 @@ void APIENTRY glutSetIconTitle (const char *title)
|
||||
|
||||
void APIENTRY glutPositionWindow (int x, int y)
|
||||
{
|
||||
#ifndef FX
|
||||
if (DMesaViewport(buffer[window], x, y, g_width, g_height)) {
|
||||
g_xpos = x;
|
||||
g_ypos = y;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void APIENTRY glutReshapeWindow (int width, int height)
|
||||
{
|
||||
#ifndef FX
|
||||
if (DMesaViewport(buffer[window], g_xpos, g_ypos, width, height)) {
|
||||
g_width = width;
|
||||
g_height = height;
|
||||
@@ -231,7 +177,6 @@ void APIENTRY glutReshapeWindow (int width, int height)
|
||||
glViewport(0, 0, width, height);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
+425
-170
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.1 for Mesa 4.0
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
#include <dpmi.h>
|
||||
|
||||
#include "dpmiint.h"
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 4.0
|
||||
*
|
||||
* Copyright (C) 1999 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
#ifndef INTERNAL_H_included
|
||||
#define INTERNAL_H_included
|
||||
|
||||
#include "../mmath.h"
|
||||
|
||||
/*
|
||||
* general purpose defines, etc.
|
||||
*/
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#define TRUE !FALSE
|
||||
#endif
|
||||
|
||||
#define __PACKED__ __attribute__((packed))
|
||||
|
||||
typedef unsigned char word8;
|
||||
typedef unsigned short word16;
|
||||
typedef unsigned long word32;
|
||||
|
||||
#define _16_ *(word16 *)&
|
||||
#define _32_ *(word32 *)&
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* video mode structure
|
||||
*/
|
||||
typedef struct vl_mode {
|
||||
int mode;
|
||||
int xres, yres;
|
||||
int scanlen;
|
||||
int bpp;
|
||||
|
||||
int sel;
|
||||
int gran;
|
||||
} vl_mode;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* video driver structure
|
||||
*/
|
||||
typedef struct {
|
||||
vl_mode *(*init) (void);
|
||||
int (*entermode) (vl_mode *p, int refresh);
|
||||
void (*blit) (void);
|
||||
void (*setCI_f) (int index, float red, float green, float blue);
|
||||
void (*setCI_i) (int index, int red, int green, int blue);
|
||||
int (*getCIprec) (void);
|
||||
void (*restore) (void);
|
||||
void (*finit) (void);
|
||||
} vl_driver;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* memory mapping
|
||||
*/
|
||||
int _create_selector (int *segment, unsigned long base, int size);
|
||||
void _remove_selector (int *segment);
|
||||
|
||||
/*
|
||||
* system routines
|
||||
*/
|
||||
int vl_can_mmx (void);
|
||||
|
||||
/*
|
||||
* asm routines to deal with virtual buffering
|
||||
*/
|
||||
extern void v_clear8 (int color);
|
||||
#define v_clear15 v_clear16
|
||||
extern void v_clear16 (int color);
|
||||
extern void v_clear24 (int color);
|
||||
extern void v_clear32 (int color);
|
||||
|
||||
extern void v_clear8_mmx (int color);
|
||||
#define v_clear15_mmx v_clear16_mmx
|
||||
extern void v_clear16_mmx (int color);
|
||||
extern void v_clear24_mmx (int color);
|
||||
extern void v_clear32_mmx (int color);
|
||||
|
||||
extern void v_rect8 (int x, int y, int width, int height, int color);
|
||||
#define v_rect15 v_rect16
|
||||
extern void v_rect16 (int x, int y, int width, int height, int color);
|
||||
extern void v_rect24 (int x, int y, int width, int height, int color);
|
||||
extern void v_rect32 (int x, int y, int width, int height, int color);
|
||||
|
||||
extern void v_putpixel8 (unsigned int offset, int color);
|
||||
#define v_putpixel15 v_putpixel16
|
||||
extern void v_putpixel16 (unsigned int offset, int color);
|
||||
extern void v_putpixel24 (unsigned int offset, int color);
|
||||
extern void v_putpixel32 (unsigned int offset, int color);
|
||||
|
||||
#endif
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.2 for Mesa 4.1
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
|
||||
#include <dpmi.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stubinfo.h>
|
||||
#include <sys/exceptn.h>
|
||||
#include <sys/segments.h>
|
||||
@@ -40,7 +40,6 @@
|
||||
#include <sys/movedata.h>
|
||||
|
||||
#include "vesa.h"
|
||||
#include "../dpmiint.h"
|
||||
|
||||
|
||||
|
||||
@@ -50,6 +49,11 @@ static word16 vesa_ver;
|
||||
static int banked_selector, linear_selector;
|
||||
static int oldmode = -1;
|
||||
|
||||
static int vesa_color_precision = 6;
|
||||
|
||||
static void *vesa_pmcode;
|
||||
unsigned int vesa_gran_mask, vesa_gran_shift;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@@ -100,11 +104,14 @@ typedef struct CRTCInfoBlock {
|
||||
|
||||
|
||||
|
||||
/* vesa_init:
|
||||
* Attempts to detect VESA, check video modes and create selectors.
|
||||
* Returns 0 if error.
|
||||
/* Desc: Attempts to detect VESA, check video modes and create selectors.
|
||||
*
|
||||
* In : -
|
||||
* Out : mode array
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static word16 vesa_init (void)
|
||||
static vl_mode *vesa_init (void)
|
||||
{
|
||||
__dpmi_regs r;
|
||||
word16 *p;
|
||||
@@ -114,7 +121,7 @@ static word16 vesa_init (void)
|
||||
word32 linearfb = 0;
|
||||
|
||||
if (vesa_ver) {
|
||||
return vesa_ver;
|
||||
return modes;
|
||||
}
|
||||
|
||||
_farpokel(_stubinfo->ds_selector, 0, 0x32454256);
|
||||
@@ -124,7 +131,7 @@ static word16 vesa_init (void)
|
||||
__dpmi_int(0x10, &r);
|
||||
movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512);
|
||||
if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) {
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS]));
|
||||
@@ -144,6 +151,7 @@ static word16 vesa_init (void)
|
||||
case 16:
|
||||
q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE];
|
||||
break;
|
||||
case 8:
|
||||
case 15:
|
||||
case 24:
|
||||
case 32:
|
||||
@@ -175,54 +183,74 @@ static word16 vesa_init (void)
|
||||
} while (TRUE);
|
||||
|
||||
if (q==modes) {
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
if (linearfb) {
|
||||
maxsize = ((maxsize+0xfffUL)&~0xfffUL);
|
||||
if (_create_selector(&linear_selector, linearfb, maxsize)) {
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
|
||||
_remove_selector(&linear_selector);
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (q=modes; q->mode!=0xffff; q++) {
|
||||
q->sel = (q->mode&0x4000) ? linear_selector : banked_selector;
|
||||
}
|
||||
|
||||
return (vesa_ver = _16_ vesa_info[V_MINOR]);
|
||||
if (vesa_info[V_MAJOR] >= 2) {
|
||||
r.x.ax = 0x4f0a;
|
||||
r.h.bl = 0;
|
||||
__dpmi_int(0x10, &r);
|
||||
if (r.x.ax == 0x004f) {
|
||||
vesa_pmcode = malloc(r.x.cx);
|
||||
movedata(__djgpp_dos_sel, (r.x.es << 4) + r.x.di, _my_ds(), (unsigned)vesa_pmcode, r.x.cx);
|
||||
p = (word16 *)((long)vesa_pmcode + ((word16 *)vesa_pmcode)[3]);
|
||||
while (*p++ != 0xffff) ;
|
||||
if (*p != 0xffff) {
|
||||
free(vesa_pmcode);
|
||||
vesa_pmcode = NULL;
|
||||
} else {
|
||||
vesa_swbank = (char *)vesa_pmcode + ((word16 *)vesa_pmcode)[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vesa_ver = _16_ vesa_info[V_MINOR];
|
||||
return modes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vesa_finit:
|
||||
* Frees all resources allocated by VESA init code.
|
||||
/* Desc: Frees all resources allocated by VESA init code.
|
||||
*
|
||||
* In : -
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static void vesa_finit (void)
|
||||
{
|
||||
if (vesa_ver) {
|
||||
_remove_selector(&linear_selector);
|
||||
_remove_selector(&banked_selector);
|
||||
if (vesa_pmcode != NULL) {
|
||||
free(vesa_pmcode);
|
||||
vesa_pmcode = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vesa_getmodes:
|
||||
* Returns ptr to mode array.
|
||||
*/
|
||||
static vl_mode *vesa_getmodes (void)
|
||||
{
|
||||
return (vesa_init() == 0) ? NULL : modes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* _closest_pixclk:
|
||||
* Uses VESA 3.0 function 0x4F0B to find the closest pixel clock to the
|
||||
* requested value.
|
||||
/* Desc: Uses VESA 3.0 function 0x4F0B to find the closest pixel clock to the requested value.
|
||||
*
|
||||
* In : mode, clock
|
||||
* Out : desired clock
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static unsigned long _closest_pixclk (int mode_no, unsigned long vclk)
|
||||
{
|
||||
@@ -239,8 +267,12 @@ static unsigned long _closest_pixclk (int mode_no, unsigned long vclk)
|
||||
|
||||
|
||||
|
||||
/* _crtc_timing:
|
||||
* Calculates CRTC mode timings.
|
||||
/* Desc: Calculates CRTC mode timings.
|
||||
*
|
||||
* In : crtc block, geometry, adjust
|
||||
* Out :
|
||||
*
|
||||
* Note:
|
||||
*/
|
||||
static void _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust)
|
||||
{
|
||||
@@ -318,16 +350,28 @@ static void _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust,
|
||||
|
||||
|
||||
|
||||
/* vesa_entermode:
|
||||
* Attempts to enter specified video mode.
|
||||
/* Desc: Attempts to enter specified video mode.
|
||||
*
|
||||
* success: 0
|
||||
* failure: !0
|
||||
* In : ptr to mode structure, refresh rate
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int vesa_entermode (vl_mode *p, int refresh)
|
||||
{
|
||||
__dpmi_regs r;
|
||||
|
||||
if (p->mode & 0x4000) {
|
||||
VESA.blit = vl_can_mmx() ? vesa_l_dump_virtual_mmx : vesa_l_dump_virtual;
|
||||
} else {
|
||||
VESA.blit = vesa_b_dump_virtual;
|
||||
{ int n; for (vesa_gran_shift=0, n=p->gran; n; vesa_gran_shift++, n>>=1) ; }
|
||||
vesa_gran_mask = (1<<(--vesa_gran_shift)) - 1;
|
||||
if ((unsigned)p->gran != (vesa_gran_mask+1)) {
|
||||
return !0;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldmode == -1) {
|
||||
r.x.ax = 0x4f03;
|
||||
__dpmi_int(0x10, &r);
|
||||
@@ -364,14 +408,33 @@ static int vesa_entermode (vl_mode *p, int refresh)
|
||||
}
|
||||
|
||||
__dpmi_int(0x10, &r);
|
||||
if (r.x.ax != 0x004f) {
|
||||
return !0;
|
||||
}
|
||||
|
||||
return (r.x.ax != 0x004f);
|
||||
if (p->bpp == 8) {
|
||||
r.x.ax = 0x4f08;
|
||||
r.x.bx = 0x0800;
|
||||
__dpmi_int(0x10, &r);
|
||||
if (r.x.ax == 0x004f) {
|
||||
r.x.ax = 0x4f08;
|
||||
r.h.bl = 0x01;
|
||||
__dpmi_int(0x10, &r);
|
||||
vesa_color_precision = r.h.bh;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vesa_restore:
|
||||
* Restores to the mode prior to first call to vesa_entermode.
|
||||
/* Desc: Restores to the mode prior to first call to vesa_entermode.
|
||||
*
|
||||
* In : -
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static void vesa_restore (void)
|
||||
{
|
||||
@@ -386,12 +449,74 @@ static void vesa_restore (void)
|
||||
|
||||
|
||||
|
||||
/* Desc: set one palette entry
|
||||
*
|
||||
* In : color index, R, G, B
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses normalized values
|
||||
*/
|
||||
static void vesa_setCI_f (int index, float red, float green, float blue)
|
||||
{
|
||||
float max = (1 << vesa_color_precision) - 1;
|
||||
|
||||
int _red = red * max;
|
||||
int _green = green * max;
|
||||
int _blue = blue * max;
|
||||
|
||||
__asm("\n\
|
||||
movw $0x1010, %%ax \n\
|
||||
movb %1, %%dh \n\
|
||||
movb %2, %%ch \n\
|
||||
int $0x10 \n\
|
||||
"::"b"(index), "m"(_red), "m"(_green), "c"(_blue):"%eax", "%edx");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: set one palette entry
|
||||
*
|
||||
* In : color index, R, G, B
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses integer values
|
||||
*/
|
||||
static void vesa_setCI_i (int index, int red, int green, int blue)
|
||||
{
|
||||
__asm("\n\
|
||||
movw $0x1010, %%ax \n\
|
||||
movb %1, %%dh \n\
|
||||
movb %2, %%ch \n\
|
||||
int $0x10 \n\
|
||||
"::"b"(index), "m"(red), "m"(green), "c"(blue):"%eax", "%edx");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: retrieve CI precision
|
||||
*
|
||||
* In : -
|
||||
* Out : precision in bits
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int vesa_getCIprec (void)
|
||||
{
|
||||
return vesa_color_precision;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* the driver
|
||||
*/
|
||||
vl_driver VESA = {
|
||||
vesa_getmodes,
|
||||
vesa_init,
|
||||
vesa_entermode,
|
||||
NULL,
|
||||
vesa_setCI_f,
|
||||
vesa_setCI_i,
|
||||
vesa_getCIprec,
|
||||
vesa_restore,
|
||||
vesa_finit
|
||||
};
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.1 for Mesa 4.0
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -34,9 +34,13 @@
|
||||
#ifndef VESA_H_included
|
||||
#define VESA_H_included
|
||||
|
||||
#include "../videoint.h"
|
||||
#include "../internal.h"
|
||||
|
||||
extern void *vesa_swbank;
|
||||
|
||||
extern void vesa_b_dump_virtual (void);
|
||||
extern void vesa_l_dump_virtual (void);
|
||||
extern void vesa_l_dump_virtual_mmx (void);
|
||||
|
||||
extern vl_driver VESA;
|
||||
|
||||
|
||||
+281
-81
@@ -23,32 +23,33 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.1 for Mesa 4.0
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*
|
||||
* Thanks to CrazyPyro (Neil Funk) for FakeColor
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "video.h"
|
||||
#include "videoint.h"
|
||||
#include "internal.h"
|
||||
#include "vesa/vesa.h"
|
||||
#include "vga/vga.h"
|
||||
|
||||
|
||||
|
||||
static vl_driver *drv = &VESA;
|
||||
/* card specific: valid forever */
|
||||
word32 vl_hw_granularity;
|
||||
static unsigned int gran_shift, gran_mask;
|
||||
static vl_driver *drv;
|
||||
/* based upon mode specific data: valid entire session */
|
||||
int vl_video_selector;
|
||||
static int video_scanlen, video_bypp;
|
||||
/* valid until next buffer */
|
||||
void *vl_current_draw_buffer, *vl_current_read_buffer;
|
||||
int vl_current_stride, vl_current_width, vl_current_height, vl_current_bytes;
|
||||
int vl_current_offset, vl_current_delta;
|
||||
static int current_width;
|
||||
|
||||
|
||||
|
||||
@@ -72,38 +73,77 @@ static int _rgb_scale_6[64] = {
|
||||
226, 230, 234, 238, 242, 246, 250, 255
|
||||
};
|
||||
|
||||
/* FakeColor data */
|
||||
#define R_CNT 6
|
||||
#define G_CNT 6
|
||||
#define B_CNT 6
|
||||
|
||||
#define R_BIAS 7
|
||||
#define G_BIAS 7
|
||||
#define B_BIAS 7
|
||||
|
||||
static word32 VGAPalette[256];
|
||||
static word8 array_r[256];
|
||||
static word8 array_g[256];
|
||||
static word8 array_b[256];
|
||||
|
||||
|
||||
void (*vl_clear) (void *buffer, int bytes, int color);
|
||||
void (*vl_flip) (void *buffer, int stride, int height);
|
||||
int (*vl_mixrgba) (const unsigned char rgba[]);
|
||||
|
||||
int (*vl_mixfix) (fixed r, fixed g, fixed b);
|
||||
int (*vl_mixrgb) (const unsigned char rgb[]);
|
||||
void (*vl_putpixel) (void *buffer, int offset, int color);
|
||||
void (*vl_getrgba) (void *buffer, int offset, unsigned char rgba[4]);
|
||||
int (*vl_mixrgba) (const unsigned char rgba[]);
|
||||
void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]);
|
||||
void (*vl_clear) (int color);
|
||||
void (*vl_rect) (int x, int y, int width, int height, int color);
|
||||
void (*vl_flip) (void);
|
||||
void (*vl_putpixel) (unsigned int offset, int color);
|
||||
|
||||
|
||||
|
||||
/* vl_rect:
|
||||
* Clears a rectange with specified color.
|
||||
/* Desc: color composition (w/o ALPHA)
|
||||
*
|
||||
* In : R, G, B
|
||||
* Out : color
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
void vl_rect (void *buffer, int x, int y, int width, int height, int color)
|
||||
static int vl_mixfix8fake (fixed r, fixed g, fixed b)
|
||||
{
|
||||
int offset = y*current_width + x;
|
||||
int delta = current_width - width;
|
||||
|
||||
for (y=0; y<height; y++) {
|
||||
for (x=0; x<width; x++, offset++) {
|
||||
vl_putpixel(buffer, offset, color);
|
||||
}
|
||||
offset += delta;
|
||||
}
|
||||
return array_b[b>>FIXED_SHIFT]*G_CNT*R_CNT
|
||||
+ array_g[g>>FIXED_SHIFT]*R_CNT
|
||||
+ array_r[r>>FIXED_SHIFT];
|
||||
}
|
||||
#define vl_mixfix8 vl_mixfix8fake
|
||||
static int vl_mixfix15 (fixed r, fixed g, fixed b)
|
||||
{
|
||||
return ((r>>(3+FIXED_SHIFT))<<10)
|
||||
|((g>>(3+FIXED_SHIFT))<<5)
|
||||
|(b>>(3+FIXED_SHIFT));
|
||||
}
|
||||
static int vl_mixfix16 (fixed r, fixed g, fixed b)
|
||||
{
|
||||
return ((r>>(3+FIXED_SHIFT))<<11)
|
||||
|((g>>(2+FIXED_SHIFT))<<5)
|
||||
|(b>>(3+FIXED_SHIFT));
|
||||
}
|
||||
#define vl_mixfix24 vl_mixfix32
|
||||
static int vl_mixfix32 (fixed r, fixed g, fixed b)
|
||||
{
|
||||
return ((r>>FIXED_SHIFT)<<16)
|
||||
|((g>>FIXED_SHIFT)<<8)
|
||||
|(b>>FIXED_SHIFT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vl_mixrgba*:
|
||||
* Color composition (w/ ALPHA).
|
||||
/* Desc: color composition (w/ ALPHA)
|
||||
*
|
||||
* In : array of integers (R, G, B, A)
|
||||
* Out : color
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
#define vl_mixrgba8 vl_mixrgb8fake
|
||||
#define vl_mixrgba15 vl_mixrgb15
|
||||
#define vl_mixrgba16 vl_mixrgb16
|
||||
#define vl_mixrgba24 vl_mixrgb24
|
||||
@@ -114,9 +154,20 @@ static int vl_mixrgba32 (const unsigned char rgba[])
|
||||
|
||||
|
||||
|
||||
/* vl_mixrgb*:
|
||||
* Color composition (w/o ALPHA).
|
||||
/* Desc: color composition (w/o ALPHA)
|
||||
*
|
||||
* In : array of integers (R, G, B)
|
||||
* Out : color
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int vl_mixrgb8fake (const unsigned char rgba[])
|
||||
{
|
||||
return array_b[rgba[2]]*G_CNT*R_CNT
|
||||
+ array_g[rgba[1]]*R_CNT
|
||||
+ array_r[rgba[0]];
|
||||
}
|
||||
#define vl_mixrgb8 vl_mixrgb8fake
|
||||
static int vl_mixrgb15 (const unsigned char rgb[])
|
||||
{
|
||||
return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3);
|
||||
@@ -133,36 +184,57 @@ static int vl_mixrgb32 (const unsigned char rgb[])
|
||||
|
||||
|
||||
|
||||
/* v_getrgba*:
|
||||
* Color decomposition.
|
||||
/* Desc: color decomposition
|
||||
*
|
||||
* In : pixel offset, array of integers to hold color components (R, G, B, A)
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current read buffer
|
||||
*/
|
||||
static void v_getrgba15 (void *buffer, int offset, unsigned char rgba[4])
|
||||
static void v_getrgba8fake6 (unsigned int offset, unsigned char rgba[])
|
||||
{
|
||||
int c = ((word16 *)buffer)[offset];
|
||||
word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
|
||||
rgba[0] = _rgb_scale_6[(c >> 16) & 0x3F];
|
||||
rgba[1] = _rgb_scale_6[(c >> 8) & 0x3F];
|
||||
rgba[2] = _rgb_scale_6[c & 0x3F];
|
||||
rgba[3] = c >> 24;
|
||||
}
|
||||
static void v_getrgba8fake8 (unsigned int offset, unsigned char rgba[])
|
||||
{
|
||||
word32 c = VGAPalette[((word8 *)vl_current_read_buffer)[offset]];
|
||||
rgba[0] = c >> 16;
|
||||
rgba[1] = c >> 8;
|
||||
rgba[2] = c;
|
||||
rgba[3] = c >> 24;
|
||||
}
|
||||
#define v_getrgba8 v_getrgba8fake6
|
||||
static void v_getrgba15 (unsigned int offset, unsigned char rgba[4])
|
||||
{
|
||||
word32 c = ((word16 *)vl_current_read_buffer)[offset];
|
||||
rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F];
|
||||
rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F];
|
||||
rgba[2] = _rgb_scale_5[c & 0x1F];
|
||||
rgba[3] = 255;
|
||||
}
|
||||
static void v_getrgba16 (void *buffer, int offset, unsigned char rgba[4])
|
||||
static void v_getrgba16 (unsigned int offset, unsigned char rgba[4])
|
||||
{
|
||||
int c = ((word16 *)buffer)[offset];
|
||||
word32 c = ((word16 *)vl_current_read_buffer)[offset];
|
||||
rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F];
|
||||
rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F];
|
||||
rgba[2] = _rgb_scale_5[c & 0x1F];
|
||||
rgba[3] = 255;
|
||||
}
|
||||
static void v_getrgba24 (void *buffer, int offset, unsigned char rgba[4])
|
||||
static void v_getrgba24 (unsigned int offset, unsigned char rgba[4])
|
||||
{
|
||||
int c = *(word32 *)((long)buffer+offset*3);
|
||||
word32 c = *(word32 *)((long)vl_current_read_buffer+offset*3);
|
||||
rgba[0] = c >> 16;
|
||||
rgba[1] = c >> 8;
|
||||
rgba[2] = c;
|
||||
rgba[3] = 255;
|
||||
}
|
||||
static void v_getrgba32 (void *buffer, int offset, unsigned char rgba[4])
|
||||
static void v_getrgba32 (unsigned int offset, unsigned char rgba[4])
|
||||
{
|
||||
int c = ((word32 *)buffer)[offset];
|
||||
word32 c = ((word32 *)vl_current_read_buffer)[offset];
|
||||
rgba[0] = c >> 16;
|
||||
rgba[1] = c >> 8;
|
||||
rgba[2] = c;
|
||||
@@ -171,54 +243,158 @@ static void v_getrgba32 (void *buffer, int offset, unsigned char rgba[4])
|
||||
|
||||
|
||||
|
||||
/* vl_sync_buffer:
|
||||
* Syncs buffer with video hardware. Returns NULL in case of failure.
|
||||
/* Desc: set one palette entry
|
||||
*
|
||||
* In : index, R, G, B
|
||||
* Out : -
|
||||
*
|
||||
* Note: color components are in range [0.0 .. 1.0]
|
||||
*/
|
||||
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height)
|
||||
void vl_setCI (int index, float red, float green, float blue)
|
||||
{
|
||||
void *newbuf;
|
||||
drv->setCI_f(index, red, green, blue);
|
||||
}
|
||||
|
||||
if (width&3) {
|
||||
return NULL;
|
||||
} else {
|
||||
if ((newbuf=realloc(buffer, width*height*video_bypp))!=NULL) {
|
||||
vl_current_offset = video_scanlen * y + video_bypp * x;
|
||||
current_width = width;
|
||||
vl_current_delta = video_scanlen - video_bypp * width;
|
||||
}
|
||||
return newbuf;
|
||||
|
||||
|
||||
/* Desc: read pixel from 8bit buffer
|
||||
*
|
||||
* In : pixel offset
|
||||
* Out : pixel read
|
||||
*
|
||||
* Note: used only for CI modes
|
||||
*/
|
||||
int vl_getCIpixel (unsigned int offset)
|
||||
{
|
||||
return ((word8 *)vl_current_read_buffer)[offset];
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: set one palette entry
|
||||
*
|
||||
* In : color, R, G, B
|
||||
* Out : -
|
||||
*
|
||||
* Note: color components are in range [0 .. 63]
|
||||
*/
|
||||
static void fake_setcolor (int c, int r, int g, int b)
|
||||
{
|
||||
VGAPalette[c] = 0xff000000 | (r<<16) | (g<<8) | b;
|
||||
|
||||
drv->setCI_i(c, r, g, b);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: build FakeColor palette
|
||||
*
|
||||
* In : CI precision in bits
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static void fake_buildpalette (int bits)
|
||||
{
|
||||
double c_r, c_g, c_b;
|
||||
int r, g, b, color = 0;
|
||||
|
||||
double max = (1 << bits) - 1;
|
||||
|
||||
for (b=0; b<B_CNT; ++b) {
|
||||
for (g=0; g<G_CNT; ++g) {
|
||||
for (r=0; r<R_CNT; ++r) {
|
||||
c_r = 0.5 + (double)r*(max-R_BIAS)/(R_CNT-1.) + R_BIAS;
|
||||
c_g = 0.5 + (double)g*(max-G_BIAS)/(G_CNT-1.) + G_BIAS;
|
||||
c_b = 0.5 + (double)b*(max-B_BIAS)/(B_CNT-1.) + B_BIAS;
|
||||
fake_setcolor(color++, (int)c_r, (int)c_g, (int)c_b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (color=0; color<256; color++) {
|
||||
c_r = (double)color*R_CNT/256.;
|
||||
c_g = (double)color*G_CNT/256.;
|
||||
c_b = (double)color*B_CNT/256.;
|
||||
array_r[color] = (int)c_r;
|
||||
array_g[color] = (int)c_g;
|
||||
array_b[color] = (int)c_b;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* vl_setup_mode:
|
||||
/* Desc: sync buffer with video hardware
|
||||
*
|
||||
* success: 0
|
||||
* failure: -1
|
||||
* In : old buffer, position, size
|
||||
* Out : new buffer
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height)
|
||||
{
|
||||
void *newbuf;
|
||||
|
||||
if (width&7) {
|
||||
return NULL;
|
||||
} else {
|
||||
if ((newbuf=realloc(buffer, width * height * video_bypp)) != NULL) {
|
||||
vl_current_width = width;
|
||||
vl_current_height = height;
|
||||
vl_current_stride = vl_current_width * video_bypp;
|
||||
vl_current_bytes = vl_current_stride * height;
|
||||
|
||||
vl_current_offset = video_scanlen * y + video_bypp * x;
|
||||
vl_current_delta = video_scanlen - vl_current_stride;
|
||||
}
|
||||
return vl_current_draw_buffer = vl_current_read_buffer = newbuf;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: retrieve CPU MMX capability
|
||||
*
|
||||
* In : -
|
||||
* Out : FALSE if CPU cannot do MMX
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
int vl_can_mmx (void)
|
||||
{
|
||||
#ifdef USE_MMX_ASM
|
||||
extern int _mesa_identify_x86_cpu_features (void);
|
||||
int _mesa_x86_cpu_features = _mesa_identify_x86_cpu_features();
|
||||
return (_mesa_x86_cpu_features & 0x00800000);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: setup mode
|
||||
*
|
||||
* In : ptr to mode definition
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int vl_setup_mode (vl_mode *p)
|
||||
{
|
||||
if (p->mode&0x4000) {
|
||||
vl_flip = l_dump_virtual;
|
||||
} else {
|
||||
{ int n; for (gran_shift=0, n=p->gran; n; gran_shift++, n>>=1) ; }
|
||||
gran_mask = (1<<(--gran_shift)) - 1;
|
||||
if ((unsigned)p->gran != (gran_mask+1)) {
|
||||
return -1;
|
||||
}
|
||||
vl_hw_granularity = p->gran;
|
||||
vl_flip = b_dump_virtual;
|
||||
}
|
||||
|
||||
#define INITPTR(bpp) \
|
||||
vl_putpixel = v_putpixel##bpp; \
|
||||
vl_getrgba = v_getrgba##bpp; \
|
||||
vl_clear = v_clear##bpp; \
|
||||
vl_rect = v_rect##bpp; \
|
||||
vl_mixfix = vl_mixfix##bpp; \
|
||||
vl_mixrgb = vl_mixrgb##bpp; \
|
||||
vl_mixrgba = vl_mixrgba##bpp;
|
||||
|
||||
vl_mixrgba = vl_mixrgba##bpp; \
|
||||
vl_clear = vl_can_mmx() ? v_clear##bpp##_mmx : v_clear##bpp
|
||||
|
||||
switch (p->bpp) {
|
||||
case 8:
|
||||
INITPTR(8);
|
||||
break;
|
||||
case 15:
|
||||
INITPTR(15);
|
||||
break;
|
||||
@@ -246,9 +422,12 @@ static int vl_setup_mode (vl_mode *p)
|
||||
|
||||
|
||||
|
||||
/* vl_video_exit:
|
||||
* Shutdown the video engine.
|
||||
* Restores to the mode prior to first call to `vl_video_init'.
|
||||
/* Desc: restore to the mode prior to first call to `vl_video_init'.
|
||||
*
|
||||
* In : -
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
void vl_video_exit (void)
|
||||
{
|
||||
@@ -258,20 +437,33 @@ void vl_video_exit (void)
|
||||
|
||||
|
||||
|
||||
/* vl_video_init:
|
||||
* Enter mode.
|
||||
/* Desc: enter mode
|
||||
*
|
||||
* success: 0
|
||||
* failure: -1
|
||||
* In : xres, yres, bits/pixel, RGB, refresh rate
|
||||
* Out : pixel width in bits if success
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
int vl_video_init (int width, int height, int bpp, int refresh)
|
||||
int vl_video_init (int width, int height, int bpp, int rgb, int refresh)
|
||||
{
|
||||
int fake;
|
||||
vl_mode *p, *q;
|
||||
unsigned int min;
|
||||
|
||||
fake = 0;
|
||||
if (!rgb) {
|
||||
bpp = 8;
|
||||
} else if (bpp == 8) {
|
||||
fake = 1;
|
||||
}
|
||||
|
||||
/* initialize hardware */
|
||||
if ((q=drv->getmodes()) == NULL) {
|
||||
return -1;
|
||||
drv = &VESA;
|
||||
if ((q=drv->init()) == NULL) {
|
||||
drv = &VGA;
|
||||
if ((q=drv->init()) == NULL) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* search for a mode that fits our request */
|
||||
@@ -286,9 +478,17 @@ int vl_video_init (int width, int height, int bpp, int refresh)
|
||||
|
||||
/* check, setup and enter mode */
|
||||
if ((p!=NULL) && (vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) {
|
||||
return 0;
|
||||
vl_flip = drv->blit;
|
||||
if (fake) {
|
||||
min = drv->getCIprec();
|
||||
fake_buildpalette(min);
|
||||
if (min == 8) {
|
||||
vl_getrgba = v_getrgba8fake8;
|
||||
}
|
||||
}
|
||||
return bpp;
|
||||
}
|
||||
|
||||
/* abort */
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.1 for Mesa 4.0
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -34,19 +34,24 @@
|
||||
#ifndef VIDEO_H_included
|
||||
#define VIDEO_H_included
|
||||
|
||||
int vl_video_init (int width, int height, int bpp, int refresh);
|
||||
void vl_video_exit (void);
|
||||
typedef int fixed;
|
||||
|
||||
extern int (*vl_mixfix) (fixed r, fixed g, fixed b);
|
||||
extern int (*vl_mixrgb) (const unsigned char rgb[]);
|
||||
extern int (*vl_mixrgba) (const unsigned char rgba[]);
|
||||
extern void (*vl_getrgba) (unsigned int offset, unsigned char rgba[4]);
|
||||
|
||||
extern void (*vl_clear) (int color);
|
||||
extern void (*vl_rect) (int x, int y, int width, int height, int color);
|
||||
extern void (*vl_flip) (void);
|
||||
extern void (*vl_putpixel) (unsigned int offset, int color);
|
||||
|
||||
void vl_setCI (int index, float red, float green, float blue);
|
||||
int vl_getCIpixel (unsigned int offset);
|
||||
|
||||
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height);
|
||||
|
||||
extern void (*vl_clear) (void *buffer, int bytes, int color);
|
||||
void vl_rect (void *buffer, int x, int y, int width, int height, int color);
|
||||
|
||||
void (*vl_flip) (void *buffer, int stride, int height);
|
||||
|
||||
extern int (*vl_mixrgba) (const unsigned char rgba[]);
|
||||
extern int (*vl_mixrgb) (const unsigned char rgb[]);
|
||||
extern void (*vl_putpixel) (void *buffer, int offset, int color);
|
||||
extern void (*vl_getrgba) (void *buffer, int offset, unsigned char rgba[4]);
|
||||
void vl_video_exit (void);
|
||||
int vl_video_init (int width, int height, int bpp, int rgb, int refresh);
|
||||
|
||||
#endif
|
||||
|
||||
+379
-122
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.1 for Mesa 4.0
|
||||
* DOS/DJGPP device driver v1.3 for Mesa 5.0
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -34,60 +34,153 @@
|
||||
.file "virtual.S"
|
||||
|
||||
/*
|
||||
* extern word32 vl_hw_granularity;
|
||||
* extern int vl_video_selector;
|
||||
* extern int vl_current_offset, vl_current_delta;
|
||||
* extern void *vl_current_draw_buffer;
|
||||
* extern int vl_current_width, vl_current_bytes;
|
||||
*/
|
||||
|
||||
.text
|
||||
|
||||
/*
|
||||
* void v_clear16 (void *buffer, int bytes, int color);
|
||||
/* Desc: void v_clear8 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.global _v_clear16
|
||||
_v_clear16:
|
||||
movl 12(%esp), %eax
|
||||
.p2align 5,,31
|
||||
.global _v_clear8
|
||||
_v_clear8:
|
||||
movl 4(%esp), %eax
|
||||
movb %al, %ah
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
popl %eax
|
||||
jmp _v_clear_common
|
||||
|
||||
/*
|
||||
* void v_clear32 (void *buffer, int bytes, int color);
|
||||
/* Desc: void v_clear16 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.p2align 5,,31
|
||||
.global _v_clear16
|
||||
_v_clear16:
|
||||
movl 4(%esp), %eax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
popl %eax
|
||||
jmp _v_clear_common
|
||||
|
||||
/* Desc: void v_clear32 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear32
|
||||
_v_clear32:
|
||||
movl 12(%esp), %eax
|
||||
movl 4(%esp), %eax
|
||||
.balign 4
|
||||
_v_clear_common:
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_bytes, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl $2, %ecx
|
||||
0:
|
||||
.balign 4
|
||||
0:
|
||||
movl %eax, (%edx)
|
||||
addl $4, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
ret
|
||||
|
||||
/*
|
||||
* void v_clear24 (void *buffer, int bytes, int color);
|
||||
/* Desc: void v_clear8_mmx (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear8_mmx
|
||||
_v_clear8_mmx:
|
||||
movl 4(%esp), %eax
|
||||
movb %al, %ah
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
jmp _v_clear_common_mmx
|
||||
|
||||
/* Desc: void v_clear16_mmx (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear16_mmx
|
||||
_v_clear16_mmx:
|
||||
movl 4(%esp), %eax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
jmp _v_clear_common_mmx
|
||||
|
||||
/* Desc: void v_clear32_mmx (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear32_mmx
|
||||
_v_clear32_mmx:
|
||||
movl 4(%esp), %eax
|
||||
pushl %eax
|
||||
pushl %eax
|
||||
.balign 4
|
||||
_v_clear_common_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movl _vl_current_bytes, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
movq (%esp), %mm0
|
||||
shrl $3, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
movq %mm0, (%edx)
|
||||
addl $8, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
emms
|
||||
#endif
|
||||
addl $8, %esp
|
||||
ret
|
||||
|
||||
/* Desc: void v_clear24 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear24
|
||||
_v_clear24:
|
||||
movl 8(%esp), %edx
|
||||
movl $0xaaaaaaab, %eax
|
||||
mull %edx
|
||||
movl 12(%esp), %eax
|
||||
mull _vl_current_bytes
|
||||
movl 4(%esp), %eax
|
||||
movl %edx, %ecx
|
||||
movl 4(%esp), %edx
|
||||
pushl %ebx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl %ecx
|
||||
movb 18(%esp), %bl
|
||||
movb 10(%esp), %bl
|
||||
.balign 4
|
||||
0:
|
||||
movw %ax, (%edx)
|
||||
@@ -98,140 +191,304 @@ _v_clear24:
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
/*
|
||||
* void b_dump_virtual (void *buffer, int stride, int height);
|
||||
/* Desc: void v_clear24_mmx (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.global _b_dump_virtual
|
||||
_b_dump_virtual:
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
pushl %ebp
|
||||
movl _vl_video_selector, %fs
|
||||
movl 4*4+4+0(%esp), %esi
|
||||
movl _vl_hw_granularity, %ebp
|
||||
xorl %edx, %edx
|
||||
movl _vl_current_offset, %eax
|
||||
divl %ebp
|
||||
movl %edx, %edi
|
||||
pushl %eax
|
||||
.p2align 5,,31
|
||||
.global _v_clear24_mmx
|
||||
_v_clear24_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movl 4(%esp), %eax
|
||||
movl %eax, %edx
|
||||
xorl %ebx, %ebx
|
||||
movw $0x4f05, %ax
|
||||
int $0x10
|
||||
movl _vl_current_delta, %ebx
|
||||
movl 5*4+4+4(%esp), %ecx
|
||||
movl 5*4+4+8(%esp), %edx
|
||||
shrl $2, %ecx
|
||||
movl %eax, %ecx
|
||||
shll $16, %edx
|
||||
rorl $8, %ecx
|
||||
movw %cx, %dx
|
||||
rorl $16, %ecx
|
||||
movb %dh, %cl
|
||||
shll $8, %eax
|
||||
movb %ch, %al
|
||||
rorl $8, %eax
|
||||
|
||||
pushl %edx
|
||||
pushl %eax
|
||||
movq (%esp), %mm0
|
||||
pushl %ecx
|
||||
movq (%esp), %mm1
|
||||
pushl %edx
|
||||
movq (%esp), %mm2
|
||||
|
||||
movl $0xaaaaaaab, %eax
|
||||
mull _vl_current_bytes
|
||||
movl %edx, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl $4, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
cmpl %ebp, %edi
|
||||
jb 2f
|
||||
pushl %ebx
|
||||
pushl %edx
|
||||
incl 12(%esp)
|
||||
movw $0x4f05, %ax
|
||||
movl 12(%esp), %edx
|
||||
xorl %ebx, %ebx
|
||||
int $0x10
|
||||
popl %edx
|
||||
popl %ebx
|
||||
subl %ebp, %edi
|
||||
2:
|
||||
movl (%esi), %eax
|
||||
addl $4, %esi
|
||||
movl %eax, %fs:(%edi)
|
||||
addl $4, %edi
|
||||
movq %mm0, (%edx)
|
||||
movq %mm1, 8(%edx)
|
||||
movq %mm2, 16(%edx)
|
||||
addl $24, %edx
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %ebx, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %eax
|
||||
popl %ebp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
emms
|
||||
addl $16, %esp
|
||||
#endif
|
||||
ret
|
||||
|
||||
/*
|
||||
* void l_dump_virtual (void *buffer, int stride, int height);
|
||||
/* Desc: void v_rect8 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.global _l_dump_virtual
|
||||
_l_dump_virtual:
|
||||
pushl %ebx
|
||||
.p2align 5,,31
|
||||
.global _v_rect8
|
||||
_v_rect8:
|
||||
cld
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl _vl_video_selector, %fs
|
||||
movl 3*4+4+0(%esp), %esi
|
||||
movl _vl_current_offset, %edi
|
||||
movl 3*4+4+4(%esp), %ecx
|
||||
movl 3*4+4+8(%esp), %edx
|
||||
movl _vl_current_delta, %ebx
|
||||
shrl $2, %ecx
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movb %al, %ah
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushl %ds
|
||||
popl %es
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
popl %eax
|
||||
pushl %ebx
|
||||
movl %ecx, %ebx
|
||||
andl $3, %ebx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movl (%esi), %eax
|
||||
addl $4, %esi
|
||||
movl %eax, %fs:(%edi)
|
||||
addl $4, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
shrl $2, %ecx
|
||||
rep; stosl
|
||||
testl %ebx, %ebx
|
||||
jz 2f
|
||||
movl %ebx, %ecx
|
||||
rep; stosb
|
||||
.balign 4
|
||||
2:
|
||||
popl %ecx
|
||||
addl %ebx, %edi
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %ebx
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
|
||||
/* Desc: void v_rect16 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect16
|
||||
_v_rect16:
|
||||
cld
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
pushw %ax
|
||||
shll %esi
|
||||
pushw %ax
|
||||
shll %edi
|
||||
pushl %ds
|
||||
popl %es
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
popl %eax
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
shrl %ecx
|
||||
rep; stosl
|
||||
jnc 2f
|
||||
stosw
|
||||
.balign 4
|
||||
2:
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
ret
|
||||
|
||||
/*
|
||||
* void v_putpixel16 (void *buffer, int offset, int color);
|
||||
/* Desc: void v_rect24 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect24
|
||||
_v_rect24:
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
leal (%esi, %esi, 2), %esi
|
||||
pushl %ebx
|
||||
leal (%edi, %edi, 2), %edi
|
||||
movl %eax, %ebx
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
shrl $16, %ebx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movw %ax, (%edi)
|
||||
movb %bl, 2(%edi)
|
||||
addl $3, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %ebx
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
|
||||
/* Desc: void v_rect32 (int color);
|
||||
*
|
||||
* In : color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect32
|
||||
_v_rect32:
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
shll $2, %esi
|
||||
shll $2, %edi
|
||||
movl 28(%esp), %eax
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movl %eax, (%edi)
|
||||
addl $4, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
|
||||
/* Desc: void v_putpixel8 (unsigned int offset, int color);
|
||||
*
|
||||
* In : offset within buffer, color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel8
|
||||
_v_putpixel8:
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movb %cl, (%eax,%edx)
|
||||
ret
|
||||
|
||||
/* Desc: void v_putpixel16 (unsigned int offset, int color);
|
||||
*
|
||||
* In : offset within buffer, color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel16
|
||||
_v_putpixel16:
|
||||
movl 8(%esp), %edx
|
||||
shll %edx
|
||||
movl 12(%esp), %eax
|
||||
addl 4(%esp), %edx
|
||||
movw %ax, (%edx)
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movw %cx, (%eax,%edx,2)
|
||||
ret
|
||||
|
||||
/*
|
||||
* void v_putpixel24 (void *buffer, int offset, int color);
|
||||
/* Desc: void v_putpixel24 (unsigned int offset, int color);
|
||||
*
|
||||
* In : offset within buffer, color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel24
|
||||
_v_putpixel24:
|
||||
movl 4(%esp), %eax
|
||||
movl 8(%esp), %edx
|
||||
leal (%edx, %edx, 2), %edx
|
||||
movl 12(%esp), %eax
|
||||
addl 4(%esp), %edx
|
||||
movw %ax, (%edx)
|
||||
shrl $16, %eax
|
||||
movb %al, 2(%edx)
|
||||
movl _vl_current_draw_buffer, %ecx
|
||||
leal (%eax,%eax,2), %eax
|
||||
movw %dx, (%ecx,%eax)
|
||||
shrl $16, %edx
|
||||
movb %dl, 2(%ecx,%eax)
|
||||
ret
|
||||
|
||||
/*
|
||||
* void v_putpixel32 (void *buffer, int offset, int color);
|
||||
/* Desc: void v_putpixel32 (unsigned int offset, int color);
|
||||
*
|
||||
* In : offset within buffer, color
|
||||
* Out : -
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.balign 4
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel32
|
||||
_v_putpixel32:
|
||||
movl 8(%esp), %edx
|
||||
shll $2, %edx
|
||||
movl 12(%esp), %eax
|
||||
addl 4(%esp), %edx
|
||||
movl %eax, (%edx)
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movl %ecx, (%eax,%edx,4)
|
||||
ret
|
||||
|
||||
+22
-14
@@ -20,7 +20,7 @@
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
# DOS/DJGPP core makefile v1.2 for Mesa 4.1
|
||||
# DOS/DJGPP core makefile v1.3 for Mesa 5.0
|
||||
#
|
||||
# Copyright (C) 2002 - Borca Daniel
|
||||
# Email : dborca@yahoo.com
|
||||
@@ -75,10 +75,10 @@ CFLAGS += -D__DOS__ -I$(GLIDE) -DFX -DFX_GLIDE3 -DFXMESA_USE_ARGB
|
||||
endif
|
||||
|
||||
AR = ar
|
||||
ARFLAGS = ru
|
||||
ARFLAGS = rus
|
||||
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
|
||||
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
|
||||
ifneq ($(wildcard $(DJDIR)/lib/dxe3.ld),)
|
||||
DXE3GEN = $(wildcard $(addsuffix /dxe3gen.exe,$(subst ;, ,$(PATH))))
|
||||
endif
|
||||
|
||||
RM = del
|
||||
@@ -249,15 +249,18 @@ else
|
||||
X86_SOURCES =
|
||||
endif
|
||||
|
||||
ifndef FX
|
||||
DRIVER_SOURCES = \
|
||||
DOS/dmesa.c \
|
||||
DOS/dmesa.c
|
||||
ifndef FX
|
||||
DRIVER_SOURCES += \
|
||||
DOS/video.c \
|
||||
DOS/virtual.S \
|
||||
DOS/vesa/vesa.c \
|
||||
DOS/vesa/blit.S \
|
||||
DOS/vga/vga.c \
|
||||
DOS/dpmi.c
|
||||
else
|
||||
DRIVER_SOURCES = \
|
||||
DRIVER_SOURCES += \
|
||||
FX/fxapi.c \
|
||||
FX/fxdd.c \
|
||||
FX/fxddspan.c \
|
||||
@@ -276,11 +279,11 @@ OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||
X86_OBJECTS = $(addsuffix .o,$(basename $(X86_SOURCES)))
|
||||
|
||||
.c.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) $<
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
.S.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) $<
|
||||
$(CC) -o $@ $(CFLAGS) -c $<
|
||||
.s.o:
|
||||
$(CC) -o $@ -c $(CFLAGS) -x assembler-with-cpp $<
|
||||
$(CC) -o $@ $(CFLAGS) -x assembler-with-cpp -c $<
|
||||
|
||||
all: $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(GL_DXE) $(LIBDIR)/$(GL_IMP)
|
||||
|
||||
@@ -288,11 +291,15 @@ $(LIBDIR)/$(GL_LIB): $(OBJECTS)
|
||||
$(AR) $(ARFLAGS) $(LIBDIR)/$(GL_LIB) $(OBJECTS)
|
||||
|
||||
$(LIBDIR)/$(GL_DXE) $(LIBDIR)/$(GL_IMP): $(OBJECTS)
|
||||
ifeq ($(DXE2GEN),)
|
||||
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
|
||||
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
|
||||
ifeq ($(DXE3GEN),)
|
||||
$(warning Missing DXE3GEN and/or DXE3.LD! You must have DXE3GEN)
|
||||
$(warning somewhere in PATH, and DXE3.LD in DJGPP/LIB directory.)
|
||||
else
|
||||
-dxe2gen -o $(LIBDIR)/$(GL_DXE) -I $(LIBDIR)/$(GL_IMP) $(OBJECTS) -E djgpp_ -E gl -E DMesa -E fxMesa -D "Mesa DJGPP GL" -U
|
||||
ifdef FX
|
||||
-dxe3gen -o $(LIBDIR)/$(GL_DXE) -I $(LIBDIR)/$(GL_IMP) -D "MesaGL/FX DJGPP" -E gl -E DMesa -X -P glid3.dxe -U $(OBJECTS)
|
||||
else
|
||||
-dxe3gen -o $(LIBDIR)/$(GL_DXE) -I $(LIBDIR)/$(GL_IMP) -D "MesaGL DJGPP" -E gl -E DMesa -X -U $(OBJECTS)
|
||||
endif
|
||||
endif
|
||||
|
||||
$(X86_OBJECTS): X86/matypes.h
|
||||
@@ -313,6 +320,7 @@ clean:
|
||||
-$(RM) $(subst /,\,X86/*.o)
|
||||
-$(RM) $(subst /,\,DOS/*.o)
|
||||
-$(RM) $(subst /,\,DOS/vesa/*.o)
|
||||
-$(RM) $(subst /,\,DOS/vga/*.o)
|
||||
-$(RM) $(subst /,\,FX/*.o)
|
||||
|
||||
-include depend
|
||||
|
||||
Reference in New Issue
Block a user