@@ -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. | |||
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. | |||
A) You must have the DXE3 package (available on my site) installed in order | |||
to build the dynamic modules. | |||
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. | |||
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... | |||
The mouse driver is far from complete (lack of positioning, drawing, etc), | |||
but is enough to make almost all the demos work. | |||
not ;-). GLUT functionality will be extended only on an "as needed" basis. | |||
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 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.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.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 (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 | |||
@@ -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 |
@@ -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 |
@@ -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); | |||
} | |||
} |
@@ -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; |
@@ -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; |
@@ -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 | |||
} | |||
@@ -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. | |||
* | |||
* In : ptr to mode structure, refresh rate | |||
* Out : 0 if success | |||
* | |||
* success: 0 | |||
* failure: !0 | |||
* 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; | |||
@@ -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 | |||
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[]); | |||
static word32 VGAPalette[256]; | |||
static word8 array_r[256]; | |||
static word8 array_g[256]; | |||
static word8 array_b[256]; | |||
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_setCI (int index, float red, float green, float blue) | |||
{ | |||
drv->setCI_f(index, red, green, blue); | |||
} | |||
/* 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; | |||
} | |||
} | |||
/* Desc: sync buffer with video hardware | |||
* | |||
* 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&3) { | |||
if (width&7) { | |||
return NULL; | |||
} else { | |||
if ((newbuf=realloc(buffer, width*height*video_bypp))!=NULL) { | |||
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; | |||
current_width = width; | |||
vl_current_delta = video_scanlen - video_bypp * width; | |||
vl_current_delta = video_scanlen - vl_current_stride; | |||
} | |||
return newbuf; | |||
return vl_current_draw_buffer = vl_current_read_buffer = newbuf; | |||
} | |||
} | |||
/* vl_setup_mode: | |||
/* Desc: retrieve CPU MMX capability | |||
* | |||
* success: 0 | |||
* failure: -1 | |||
* In : - | |||
* Out : FALSE if CPU cannot do MMX | |||
* | |||
* Note: - | |||
*/ | |||
static int vl_setup_mode (vl_mode *p) | |||
int vl_can_mmx (void) | |||
{ | |||
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; | |||
} | |||
#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) | |||
{ | |||
#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; | |||
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height); | |||
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) (void *buffer, int bytes, int color); | |||
void vl_rect (void *buffer, int x, int y, int width, int height, int color); | |||
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_flip) (void *buffer, int stride, int height); | |||
void vl_setCI (int index, float red, float green, float blue); | |||
int vl_getCIpixel (unsigned int offset); | |||
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_sync_buffer (void *buffer, int x, int y, int width, int height); | |||
void vl_video_exit (void); | |||
int vl_video_init (int width, int height, int bpp, int rgb, int refresh); | |||
#endif |
@@ -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 | |||
.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 | |||
/* Desc: void v_clear16 (int color); | |||
* | |||
* In : color | |||
* Out : - | |||
* | |||
* Note: uses current draw buffer | |||
*/ | |||
.p2align 5,,31 | |||
.global _v_clear16 | |||
_v_clear16: | |||
movl 12(%esp), %eax | |||
movl 4(%esp), %eax | |||
pushw %ax | |||
pushw %ax | |||
popl %eax | |||
jmp _v_clear_common | |||
/* | |||
* void v_clear32 (void *buffer, int bytes, int color); | |||
/* Desc: void v_clear32 (int color); | |||
* | |||
* In : color | |||
* Out : - | |||
* | |||
* Note: uses current draw buffer | |||
*/ | |||
.balign 4 | |||
.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 | |||
*/ | |||
.p2align 5,,31 | |||
.global _v_clear24_mmx | |||
_v_clear24_mmx: | |||
#ifdef USE_MMX_ASM | |||
movl 4(%esp), %eax | |||
movl %eax, %edx | |||
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 | |||
.global _b_dump_virtual | |||
_b_dump_virtual: | |||
pushl %ebx | |||
0: | |||
movq %mm0, (%edx) | |||
movq %mm1, 8(%edx) | |||
movq %mm2, 16(%edx) | |||
addl $24, %edx | |||
decl %ecx | |||
jnz 0b | |||
emms | |||
addl $16, %esp | |||
#endif | |||
ret | |||
/* Desc: void v_rect8 (int color); | |||
* | |||
* In : color | |||
* Out : - | |||
* | |||
* Note: uses current draw buffer | |||
*/ | |||
.p2align 5,,31 | |||
.global _v_rect8 | |||
_v_rect8: | |||
cld | |||
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 | |||
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 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: | |||
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 | |||
shrl $2, %ecx | |||
rep; stosl | |||
testl %ebx, %ebx | |||
jz 2f | |||
movl %ebx, %ecx | |||
rep; stosb | |||
.balign 4 | |||
2: | |||
popl %ecx | |||
addl %esi, %edi | |||
decl %edx | |||
jnz 0b | |||
popl %ebx | |||
subl %ebp, %edi | |||
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: | |||
movl (%esi), %eax | |||
addl $4, %esi | |||
movl %eax, %fs:(%edi) | |||
addl $4, %edi | |||
popl %ecx | |||
addl %esi, %edi | |||
decl %edx | |||
jnz 0b | |||
popl %edi | |||
popl %esi | |||
ret | |||
/* 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 %ebx, %edi | |||
addl %esi, %edi | |||
decl %edx | |||
jnz 0b | |||
popl %eax | |||
popl %ebp | |||
popl %ebx | |||
popl %edi | |||
popl %esi | |||
popl %ebx | |||
ret | |||
/* | |||
* void l_dump_virtual (void *buffer, int stride, int height); | |||
/* Desc: void v_rect32 (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_rect32 | |||
_v_rect32: | |||
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 _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 (%esi), %eax | |||
addl $4, %esi | |||
movl %eax, %fs:(%edi) | |||
movl %eax, (%edi) | |||
addl $4, %edi | |||
decl %ecx | |||
jnz 1b | |||
popl %ecx | |||
addl %ebx, %edi | |||
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_putpixel8 (unsigned int offset, int color); | |||
* | |||
* In : offset within buffer, color | |||
* Out : - | |||
* | |||
* Note: uses current draw buffer | |||
*/ | |||
.balign 4 | |||
.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 |
@@ -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 |