updates from Daniel Borca

This commit is contained in:
Brian Paul 2002-09-03 18:11:32 +00:00
parent b9f75444e6
commit 05ed911aca
18 changed files with 1299 additions and 573 deletions

View file

@ -1,4 +1,4 @@
Mesa 4.0 DOS/DJGPP Port v1.0
Mesa 4.0 DOS/DJGPP Port v1.1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -6,75 +6,149 @@
Description:
~~~~~~~~~~~~
Well, guess what... this is the DOS port of MESA 4.0, for DJGPP fans... Whoa!
Well, guess what... this is the DOS port of Mesa 4.0.3, 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.
Legal:
~~~~~~
MESA copyright applies.
Mesa copyright applies, provided this package is used within Mesa. For anything
else, see GPL.
Installation:
~~~~~~~~~~~~~
Type "make -f Makefile.DJ" to compile the libraries. Make accepts some options
which are passed to compiler: the target cpu (CPU=..., default=`pentium') and
X86 specific options (HAVE_X86=1, HAVE_MMX=1, HAVE_SSE=1, HAVE_3DNOW=1). The
core library (libGL) requires LFN support during compilation. Also, you must
have the DXE2 package (available on SimTel.Net, courtesy of Andrew Zabolotny)
installed in order to build the dynamic modules; if you encounter errors, you
can fetch a patched version from my web page.
The demos are not built automagically (see Pitfalls below). To make them, use
one of the following rules:
Static:
gcc -o OUT.exe IN.c -lglut -lglu -lgl
Dynamic:
gcc -o OUT.exe -include dmesadxe.h IN.c -ligl -liglu -liglut -ldl
Usage of the dynamic modules requires three things:
Unzip and type:
make -f Makefile.DJ [OPTIONS...]
Available options:
Environment variables:
CPU optimize for the given processor.
default = k6
BIG_OPT=1 crazy optimizations; not very useful, though...
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
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
HAVE_X86=1 optimize for i386.
default = no
HAVE_MMX=1 MMX instructions; use only if you assembler/compiler
supports MMX instruction set; backwards compatibility
with older processors is still preserved.
default = no
HAVE_SSE=1 (see HAVE_MMX)
default = no
HAVE_3DNOW=1 (see HAVE_MMX)
default = no
Targets:
all: build everything
libgl: build GL
libglu: build GLU
libglut: build GLUT
clean: remove object files
realclean: remove all generated files
Tested on:
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
DJGPP: djdev 2.03 + gcc v3.1 + make v3.79.1
FAQ:
~~~~
1. Compilation
Q) I tried to run `make' and it exits because `gcc' complains it cannot find
some stupid file.
A) You need LFN support.
A) If FX is defined, pay attention to Glide path.
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 couln'd 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
and you can use them in the old-fashioned, classic way.
Q) Okay, DXE2 modules are built. How can I use them?
A) Usage of the dynamic modules requires three things:
- include DMESADXE.H in one of the sources, so references inside
dynamic modules will get resolved (or use `-include' directive)
- link against import libraries (libIgl*.a) and LIBDL.A, which will do
dynamic modules will get resolved (or use `-include' directive).
- link against import libraries (libI*.a) and LIBDL.A, which will do
the dynamic linkage job for you
- put the DXEs somewhere along the library path (LD_LIBRARY_PATH) or
in the current directory
For example:
gcc -o OUT.exe -include dmesadxe.h IN.c -ligl -liglu -liglut -ldl
Tested on:
CPU: Intel Pentium w/ MMX @166 MHz
Mainboard: ViA Apollo VP2 w/ 128 MB SDRAM
Video card: Matrox Millenium 2064W w/ 2048 kB WRAM, BIOS v3.0
DJGPP: djdev 2.03 + gcc v3.0.3 + make v3.79
Q) The application dies with "Abort!" due to unresolved symbols.
A) This is bad! Extract the unresolved symbol list from this module. For
example:
dxe2gen --show-unres gl.dxe > u
Check DMESADXE.H; the symbols in `u' must either be present here or be
exported from another module that has to be loaded before your faulting
one. Then recompile.
3. Using Mesa for DJGPP
Q) Does this build work in Win9x?
A) Yes.
libGL (the core):
~~~~~~~~~~~~~~~~~
Q) Does it work under NT (W2k, XP) core?
A) Uh... probably not!
Of course, MESA 4.0 core sources are required. It will probably work with
MESA 3.5, but not a chance with earlier versions due to major changes to the
MESA driver interface and the directory tree. All should compile succesfully.
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
lazy programmer and I found that the easiest way to keep buffer handling
at peak performance ;-).
The driver has its origins in ddsample.c, written by Brian Paul and found by
me in MESA 3.4.2. I touched almost all the functions, changing the coding
style :-( Sorry!
Q) My demo doesn't display text. I know I used the glut font routines!
A) Then you probably use GLUT as a DXE. Well, there is no direct access to
variables due to the way DXE works. Read the documentation. The author of
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 :-(
Pitfalls:
1. The current version supports only RGB[A] modes, for it made no sense to me
to endorse color-index (aka palette) modes.
2. Single-buffered is not allowed at all. Until I can find a way to use *REAL*
hardware acceleration, it won't get implemented.
3. Another weird "feature" is that buffer width must be multiple of 4 (I'm a
lazy programmer and I found that the easiest way to keep buffer handling at
peak performance ;-).
Q) The DJGPP port of Mesa 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?
libGLU:
~~~~~~~
Mesa GLU sources are required.
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
@ -85,7 +159,7 @@ 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 some Allegro "infusions"; I deeply thank to Shawn Hargreaves et co.
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.
@ -121,6 +195,10 @@ 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

View file

@ -20,32 +20,46 @@
# 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.0 for Mesa 4.0
# DOS/DJGPP glu makefile v1.1 for Mesa 4.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 = ..
CC = gcc
CFLAGS = -I$(TOP)/include -Wall -W -Wno-unused -mcpu=$(CPU) -ffast-math -O2
AR = ar
ARFLAGS = ruv
LIBDIR = $(TOP)/lib
ifeq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN =
else
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
GLU_LIB = libglu.a
GLU_DXE = glu.dxe
GLU_IMP = libiglu.a
CC = gcc
CFLAGS += -I$(TOP)/include
AR = ar
ARFLAGS = ru
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
RM = del
CORE_SOURCES = \
glu.c \
mipmap.c \
@ -64,7 +78,7 @@ SOURCES = $(CORE_SOURCES)
OBJECTS = $(SOURCES:.c=.o)
.c.o:
gcc -o $@ -c $(CFLAGS) $<
$(CC) -o $@ -c $(CFLAGS) $<
all: $(LIBDIR)/$(GLU_LIB) $(LIBDIR)/$(GLU_DXE) $(LIBDIR)/$(GLU_IMP)
@ -76,10 +90,10 @@ ifeq ($(DXE2GEN),)
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
else
dxe2gen -o $(LIBDIR)/$(GLU_DXE) -I $(LIBDIR)/$(GLU_IMP) $(OBJECTS) -D "Mesa DOS GLU" -U
-dxe2gen -o $(LIBDIR)/$(GLU_DXE) -I $(LIBDIR)/$(GLU_IMP) $(OBJECTS) -E djgpp_ -E glu -D "Mesa DJGPP GLU" -U
endif
clean:
-$(RM) *.o
-$(RM) $(subst /,\,*.o)
include depend
-include depend

View file

@ -20,36 +20,65 @@
# 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.0 for Mesa 4.0
# DOS/DJGPP glut makefile v1.1 for Mesa 4.0
#
# Copyright (C) 2002 - Borca Daniel
# Email : dborca@yahoo.com
# Web : http://www.geocities.com/dborca
#
# Available options:
#
# 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.
# default = $(TOP)/src-glut
#
# Targets:
# all: build GLUT
# clean: remove object files
#
.PHONY: all clean
TOP = ..
CC = gcc
CFLAGS = -I$(TOP)/include -Wall -W -Wno-unused -mcpu=$(CPU) -ffast-math -O2
AR = ar
ARFLAGS = ruv
GLIDE ?= $(TOP)/include/glide3
MARK ?= $(TOP)/src-glut
LIBDIR = $(TOP)/lib
ifeq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN =
else
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
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
AR = ar
ARFLAGS = ru
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
RM = del
CORE_SOURCES = \
bitmap.c \
callback.c \
color.c \
font.c \
globals.c \
init.c \
menu.c \
@ -66,16 +95,25 @@ PC_HW_SOURCES = \
PC_HW/pc_timer.c \
PC_HW/pc_irq.S
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES)
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
SOURCES = $(CORE_SOURCES) $(PC_HW_SOURCES) $(MARK_SOURCES)
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
.c.o:
gcc -o $@ -c $(CFLAGS) $<
$(CC) -o $@ -c $(CFLAGS) $<
.S.o:
gcc -o $@ -c $(CFLAGS) $<
$(CC) -o $@ -c $(CFLAGS) $<
.s.o:
gcc -o $@ -c $(CFLAGS) $(<:.s=.S)
$(CC) -o $@ -c $(CFLAGS) -x assembler-with-cpp $<
all: $(LIBDIR)/$(GLUT_LIB) $(LIBDIR)/$(GLUT_DXE) $(LIBDIR)/$(GLUT_IMP)
@ -87,28 +125,12 @@ ifeq ($(DXE2GEN),)
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
else
dxe2gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) $(OBJECTS) -D "Mesa DOS GLUT" -U
-dxe2gen -o $(LIBDIR)/$(GLUT_DXE) -I $(LIBDIR)/$(GLUT_IMP) $(OBJECTS) -E djgpp_ -E glut -D "Mesa DJGPP GLUT" -U
endif
clean:
-$(RM) *.o
-$(RM) PC_HW\*.o
-$(RM) $(subst /,\,*.o)
-$(RM) $(subst /,\,PC_HW/*.o)
-$(RM) $(subst /,\,$(MARK)/*.o)
callback.o: callback.c ../include/GL/glut.h internal.h PC_HW/pc_hw.h
color.o: color.c ../include/GL/glut.h
font.o: font.c ../include/GL/glut.h
globals.o: globals.c ../include/GL/glut.h internal.h PC_HW/pc_hw.h
init.o: init.c ../include/GL/glut.h internal.h PC_HW/pc_hw.h
menu.o: menu.c ../include/GL/glut.h
models.o: models.c ../include/GL/glut.h
overlay.o: overlay.c ../include/GL/glut.h
state.o: state.c ../include/GL/glut.h internal.h PC_HW/pc_hw.h
teapot.o: teapot.c ../include/GL/glut.h
window.o: window.c ../include/GL/glut.h ../include/GL/dmesa.h internal.h \
PC_HW/pc_hw.h
PC_HW/pc_hw.o: PC_HW/pc_hw.c PC_HW/pc_hw.h
PC_HW/pc_keyb.o: PC_HW/pc_keyb.c PC_HW/pc_hw.h
PC_HW/pc_mouse.o: PC_HW/pc_mouse.c PC_HW/pc_hw.h
PC_HW/pc_timer.o: PC_HW/pc_timer.c PC_HW/pc_hw.h
PC_HW/pc_irq.o: PC_HW/pc_irq.S
-include depend

View file

@ -1,5 +1,5 @@
/*
* PC/HW routine collection v1.0 for DOS/DJGPP
* PC/HW routine collection v1.1 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -45,8 +45,8 @@ void *pc_malloc (size_t size);
/*
* IRQ
*/
#define ENABLE() __asm__ __volatile__ ("sti")
#define DISABLE() __asm__ __volatile__ ("cli")
#define ENABLE() __asm __volatile ("sti")
#define DISABLE() __asm __volatile ("cli")
extern int pc_install_irq (int i, int (*handler) ());
extern int pc_remove_irq (int i);

View file

@ -1,5 +1,5 @@
/*
* PC/HW routine collection v1.0 for DOS/DJGPP
* PC/HW routine collection v1.1 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -201,7 +201,7 @@ static unsigned char numlock_table[10] =
/* kb_wait_for_write_ready:
* Wait for the keyboard controller to set the ready-for-write bit.
*/
static __inline__ int kb_wait_for_write_ready (void)
static __inline int kb_wait_for_write_ready (void)
{
int timeout = 4096;
@ -215,7 +215,7 @@ static __inline__ int kb_wait_for_write_ready (void)
/* kb_wait_for_read_ready:
* Wait for the keyboard controller to set the ready-for-read bit.
*/
static __inline__ int kb_wait_for_read_ready (void)
static __inline int kb_wait_for_read_ready (void)
{
int timeout = 16384;
@ -229,7 +229,7 @@ static __inline__ int kb_wait_for_read_ready (void)
/* kb_send_data:
* Sends a byte to the keyboard controller. Returns 1 if all OK.
*/
static __inline__ int kb_send_data (unsigned char data)
static __inline int kb_send_data (unsigned char data)
{
int resends = 4;
int timeout, temp;
@ -357,9 +357,9 @@ static void handle_code (int scancode, int keycode)
in_a_terrupt--;
} ENDOFUNC(handle_code)
static __inline__ void satisfy (void)
static __inline void satisfy (void)
{
__asm__("\n\
__asm("\n\
inb $0x61, %%al \n\
movb %%al, %%ah \n\
orb $0x80, %%al \n\
@ -404,7 +404,7 @@ static int keyboard ()
only SIGINT (but not Ctrl-Break)
calls the destructors and will safely clean up
*/
__asm__("\n\
__asm("\n\
movb $0x79, %%al \n\
call ___djgpp_hw_exception \n\
":::"%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");

View file

@ -1,5 +1,5 @@
/*
* PC/HW routine collection v1.0 for DOS/DJGPP
* PC/HW routine collection v1.1 for DOS/DJGPP
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -17,7 +17,7 @@
#define CLEAR_MICKEYS() \
do { \
__asm__ __volatile__ ("movw $0xb, %%ax; int $0x33":::"%eax", "%ecx", "%edx"); \
__asm __volatile ("movw $0xb, %%ax; int $0x33":::"%eax", "%ecx", "%edx"); \
ox = oy = 0; \
} while (0)
@ -71,7 +71,7 @@ void pc_remove_mouse (void)
{
if (mouse_callback) {
pc_clexit(pc_remove_mouse);
__asm__("\n\
__asm("\n\
movl %%edx, %%ecx \n\
shrl $16, %%ecx \n\
movw $0x0304, %%ax \n\
@ -97,7 +97,7 @@ int pc_install_mouse (void)
}
/* reset mouse and get status */
__asm__("\n\
__asm("\n\
xorl %%eax, %%eax \n\
int $0x33 \n\
andl %%ebx, %%eax \n\
@ -133,7 +133,7 @@ int pc_install_mouse (void)
}
/* try to hook a call-back */
__asm__("\n\
__asm("\n\
pushl %%ds \n\
pushl %%es \n\
movw $0x0303, %%ax \n\
@ -225,7 +225,7 @@ void pc_unscare_mouse (void)
/* not implemented */
}
__asm__("\n\
__asm("\n\
.balign 4 \n\
.global _mouse_wrapper \n\
_mouse_wrapper: \n\

56
src/glut/dos/bitmap.c Normal file
View file

@ -0,0 +1,56 @@
/* Copyright (c) Mark J. Kilgard, 1994. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#include "glutbitmap.h"
void APIENTRY
glutBitmapCharacter(GLUTbitmapFont font, int c)
{
const BitmapCharRec *ch;
BitmapFontPtr fontinfo;
GLint swapbytes, lsbfirst, rowlength;
GLint skiprows, skippixels, alignment;
#if defined(_WIN32)
fontinfo = (BitmapFontPtr) __glutFont(font);
#else
fontinfo = (BitmapFontPtr) font;
#endif
if (c < fontinfo->first ||
c >= fontinfo->first + fontinfo->num_chars)
return;
ch = fontinfo->ch[c - fontinfo->first];
if (ch) {
/* Save current modes. */
glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
/* Little endian machines (DEC Alpha for example) could
benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
instead of GL_FALSE, but this would require changing the
generated bitmaps too. */
glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
ch->advance, 0, ch->bitmap);
/* Restore saved modes. */
glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
}
}

View file

@ -19,7 +19,7 @@
*/
/*
* DOS/DJGPP glut driver v1.0 for Mesa 4.0
* DOS/DJGPP glut driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -28,16 +28,26 @@
#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
@ -48,8 +58,12 @@ 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,6 +90,7 @@ int APIENTRY glutCreateWindow (const char *title)
screen_h = 768;
}
#ifndef FX
if ((visual=DMesaCreateVisual(screen_w, screen_h, DEFAULT_BPP,
g_display_mode & GLUT_DOUBLE,
g_display_mode & GLUT_DEPTH ?DEPTH_SIZE :0,
@ -88,12 +103,24 @@ 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;
}
#endif
pc_open_stdout();
pc_open_stderr();
pc_atexit(clean);
}
#ifndef FX
for (i=0; i<MAX_WINDOWS; i++) {
if (!buffer[i]) {
DMesaBuffer b;
@ -115,6 +142,11 @@ int APIENTRY glutCreateWindow (const char *title)
}
return 0;
#else
fxMesaMakeCurrent(context);
return 1;
#endif
}
@ -126,10 +158,12 @@ 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
}
@ -142,7 +176,11 @@ 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();
}
@ -171,15 +209,18 @@ 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;
@ -189,6 +230,7 @@ void APIENTRY glutReshapeWindow (int width, int height)
glViewport(0, 0, width, height);
}
}
#endif
}

View file

@ -23,7 +23,7 @@
*/
/*
* DOS/DJGPP device driver v1.0 for Mesa 4.0
* DOS/DJGPP device driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -38,7 +38,6 @@
#include "context.h"
#include "GL/dmesa.h"
#include "extensions.h"
#inlcude "imports.h"
#include "macros.h"
#include "matrix.h"
#include "mmath.h"
@ -80,10 +79,9 @@ struct dmesa_buffer {
GLframebuffer gl_buffer; /* The depth, stencil, accum, etc buffers */
void *the_window; /* your window handle, etc */
int bypp; /* bytes per pixel */
int xpos, ypos; /* position */
int width, height; /* size in pixels */
int bwidth, len; /* bytes in a line, then total */
int bypp, stride, bytes; /* bytes per pixel, in a line, then total */
};
/*
@ -413,7 +411,7 @@ static swrast_tri_func dmesa_choose_tri_function (GLcontext *ctx)
if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL;
if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL;
if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL;
if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL;
if (ctx->Light.ShadeModel==GL_SMOOTH
&& swrast->_RasterMask==DEPTH_BIT
@ -494,7 +492,7 @@ static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
if (*colorMask==0xffffffff) {
if (mask & DD_BACK_LEFT_BIT) {
if (all) {
vl_clear(b->the_window, b->len, c->ClearColor);
vl_clear(b->the_window, b->bytes, c->ClearColor);
} else {
vl_rect(b->the_window, x, y, width, height, c->ClearColor);
}
@ -512,12 +510,24 @@ static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
/*
* Set the current reading buffer.
*/
static void set_buffer (GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
static void set_read_buffer (GLcontext *ctx, GLframebuffer *buffer,
GLenum mode)
{
/*
XXX this has to be fixed
*/
}
/*
DMesaContext c = (DMesaContext)ctx->DriverCtx;
dmesa_update_state(ctx);
*/
* Set the destination/draw buffer.
*/
static void set_draw_buffer (GLcontext *ctx, GLenum mode)
{
/*
XXX this has to be fixed
*/
}
@ -541,7 +551,7 @@ static const GLubyte* get_string (GLcontext *ctx, GLenum name)
{
switch (name) {
case GL_RENDERER:
return (const GLubyte *)"Mesa DOS\0DJGPP port (c) Borca Daniel 31-mar-2002";
return (const GLubyte *)"Mesa DJGPP\0port (c) Borca Daniel 3-sep-2002";
default:
return NULL;
}
@ -627,7 +637,6 @@ void dmesa_init_pointers (GLcontext *ctx)
ctx->Driver.CopyPixels = _swrast_CopyPixels;
ctx->Driver.DrawPixels = _swrast_DrawPixels;
ctx->Driver.ReadPixels = _swrast_ReadPixels;
ctx->Driver.DrawBuffer = _swrast_DrawBuffer;
/* Software texture functions:
*/
@ -659,6 +668,7 @@ void dmesa_init_pointers (GLcontext *ctx)
/* Statechange callbacks:
*/
ctx->Driver.SetDrawBuffer = set_draw_buffer;
ctx->Driver.ClearColor = clear_color;
/* Initialize the TNL driver interface:
@ -686,7 +696,7 @@ static void dmesa_update_state (GLcontext *ctx, GLuint new_state)
_ac_InvalidateState(ctx, new_state);
_tnl_InvalidateState(ctx, new_state);
swdd->SetBuffer = set_buffer;
swdd->SetReadBuffer = set_read_buffer;
/* RGB(A) span/pixel functions */
swdd->WriteRGBASpan = write_rgba_span;
@ -717,6 +727,12 @@ DMesaVisual DMesaCreateVisual (GLint width, GLint height, GLint colDepth,
DMesaVisual v;
GLint redBits, greenBits, blueBits, alphaBits;
int refresh;
char *var = getenv("DMESA_REFRESH");
if ((var == NULL) || ((refresh=atoi(var)) == 0)) {
refresh = 60;
}
if (!dbFlag) {
return NULL;
}
@ -743,7 +759,7 @@ DMesaVisual DMesaCreateVisual (GLint width, GLint height, GLint colDepth,
return NULL;
}
if (vl_video_init(width, height, colDepth)!=0) {
if (vl_video_init(width, height, colDepth, refresh) != 0) {
return NULL;
}
@ -776,7 +792,7 @@ DMesaVisual DMesaCreateVisual (GLint width, GLint height, GLint colDepth,
void DMesaDestroyVisual (DMesaVisual v)
{
vl_video_exit(!0);
vl_video_exit();
_mesa_destroy_visual(v->gl_visual);
free(v);
}
@ -825,11 +841,9 @@ DMesaContext DMesaCreateContext (DMesaVisual visual,
GLboolean direct = GL_FALSE;
if ((c=(DMesaContext)calloc(1, sizeof(struct dmesa_context)))!=NULL) {
__GLimports imports;
_mesa_init_default_imports( &imports, (void *) c);
c->gl_ctx = _mesa_create_context(visual->gl_visual,
share ? share->gl_ctx : NULL,
&imports);
(void *)c, direct);
_mesa_enable_sw_extensions(c->gl_ctx);
_mesa_enable_1_3_extensions(c->gl_ctx);
@ -874,8 +888,8 @@ GLboolean DMesaViewport (DMesaBuffer b,
b->ypos = ypos;
b->width = width;
b->height = height;
b->bwidth = width * b->bypp;
b->len = b->bwidth * height;
b->stride = width * b->bypp;
b->bytes = b->stride * height;
return GL_TRUE;
}
}
@ -913,5 +927,7 @@ GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
void DMesaSwapBuffers (DMesaBuffer b)
{
/* copy/swap back buffer to front if applicable */
vl_flip(b->the_window, b->bwidth, b->height);
GET_CURRENT_CONTEXT(ctx);
_mesa_swapbuffers(ctx);
vl_flip(b->the_window, b->stride, b->height);
}

View file

@ -23,7 +23,7 @@
*/
/*
* DOS/DJGPP device driver v1.0 for Mesa 4.0
* DOS/DJGPP device driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -37,6 +37,12 @@
#ifndef MAX
#define MAX(x, y) (((x)<(y))?(y):(x))
#endif
/* _create_linear_mapping:
* Maps a physical address range into linear memory.
*/

View file

@ -23,7 +23,7 @@
*/
/*
* DOS/DJGPP device driver v1.0 for Mesa 4.0
* DOS/DJGPP device driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -34,14 +34,6 @@
#ifndef DPMIINT_H_included
#define DPMIINT_H_included
#ifndef NULL
#define NULL 0
#endif
#ifndef MAX
#define MAX(x, y) (((x)<(y))?(y):(x))
#endif
int _create_selector (int *segment, unsigned long base, int size);
void _remove_selector (int *segment);

View file

@ -0,0 +1,397 @@
/*
* 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.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#include <dpmi.h>
#include <string.h>
#include <stubinfo.h>
#include <sys/exceptn.h>
#include <sys/segments.h>
#include <sys/farptr.h>
#include <sys/movedata.h>
#include "vesa.h"
#include "../dpmiint.h"
static vl_mode modes[64];
static word16 vesa_ver;
static int banked_selector, linear_selector;
static int oldmode = -1;
/*
* VESA info
*/
#define V_SIGN 0
#define V_MINOR 4
#define V_MAJOR 5
#define V_OEM_OFS 6
#define V_OEM_SEG 8
#define V_MODE_OFS 14
#define V_MODE_SEG 16
#define V_MEMORY 18
/*
* mode info
*/
#define M_ATTR 0
#define M_GRAN 4
#define M_SCANLEN 16
#define M_XRES 18
#define M_YRES 20
#define M_BPP 25
#define M_RED 31
#define M_GREEN 33
#define M_BLUE 35
#define M_PHYS_PTR 40
/*
* VESA 3.0 CRTC timings structure
*/
typedef struct CRTCInfoBlock {
unsigned short HorizontalTotal;
unsigned short HorizontalSyncStart;
unsigned short HorizontalSyncEnd;
unsigned short VerticalTotal;
unsigned short VerticalSyncStart;
unsigned short VerticalSyncEnd;
unsigned char Flags;
unsigned long PixelClock; /* units of Hz */
unsigned short RefreshRate; /* units of 0.01 Hz */
unsigned char reserved[40];
} __PACKED__ CRTCInfoBlock;
#define HNEG (1 << 2)
#define VNEG (1 << 3)
#define DOUBLESCAN (1 << 0)
/* vesa_init:
* Attempts to detect VESA, check video modes and create selectors.
* Returns 0 if error.
*/
static word16 vesa_init (void)
{
__dpmi_regs r;
word16 *p;
vl_mode *q;
char vesa_info[512], tmp[512];
int maxsize = 0;
word32 linearfb = 0;
if (vesa_ver) {
return vesa_ver;
}
_farpokel(_stubinfo->ds_selector, 0, 0x32454256);
r.x.ax = 0x4f00;
r.x.di = 0;
r.x.es = _stubinfo->ds_segment;
__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;
}
p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS]));
q = modes;
do {
if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) {
break;
}
r.x.ax = 0x4f01;
r.x.cx = q->mode;
r.x.di = 512;
r.x.es = _stubinfo->ds_segment;
__dpmi_int(0x10, &r);
movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256);
switch (tmp[M_BPP]) {
case 16:
q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE];
break;
case 15:
case 24:
case 32:
q->bpp = tmp[M_BPP];
break;
default:
q->bpp = 0;
}
if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp) {
q->xres = _16_ tmp[M_XRES];
q->yres = _16_ tmp[M_YRES];
q->scanlen = _16_ tmp[M_SCANLEN];
q->gran = (_16_ tmp[M_GRAN])<<10;
if (tmp[M_ATTR]&0x80) {
#if 0
*(q+1) = *q++;
#else
vl_mode *q1 = q + 1;
*q1 = *q++;
#endif
linearfb = _32_ tmp[M_PHYS_PTR];
q->mode |= 0x4000;
}
if (maxsize<(q->scanlen*q->yres)) {
maxsize = q->scanlen*q->yres;
}
q++;
}
} while (TRUE);
if (q==modes) {
return 0;
}
if (linearfb) {
maxsize = ((maxsize+0xfffUL)&~0xfffUL);
if (_create_selector(&linear_selector, linearfb, maxsize)) {
return 0;
}
}
if (_create_selector(&banked_selector, 0xa0000, modes[0].gran)) {
_remove_selector(&linear_selector);
return 0;
}
for (q=modes; q->mode!=0xffff; q++) {
q->sel = (q->mode&0x4000) ? linear_selector : banked_selector;
}
return (vesa_ver = _16_ vesa_info[V_MINOR]);
}
/* vesa_finit:
* Frees all resources allocated by VESA init code.
*/
static void vesa_finit (void)
{
if (vesa_ver) {
_remove_selector(&linear_selector);
_remove_selector(&banked_selector);
}
}
/* 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.
*/
static unsigned long _closest_pixclk (int mode_no, unsigned long vclk)
{
__dpmi_regs r;
r.x.ax = 0x4F0B;
r.h.bl = 0;
r.d.ecx = vclk;
r.x.dx = mode_no;
__dpmi_int(0x10, &r);
return (r.x.ax==0x004f) ? r.d.ecx : 0;
}
/* _crtc_timing:
* Calculates CRTC mode timings.
*/
static void _crtc_timing (CRTCInfoBlock *crtc, int xres, int yres, int xadjust, int yadjust)
{
int HTotal, VTotal;
int HDisp, VDisp;
int HSS, VSS;
int HSE, VSE;
int HSWidth, VSWidth;
int SS, SE;
int doublescan = FALSE;
if (yres < 400) {
doublescan = TRUE;
yres *= 2;
}
HDisp = xres;
HTotal = (int)(HDisp * 1.27) & ~0x7;
HSWidth = (int)((HTotal - HDisp) / 5) & ~0x7;
HSS = HDisp + 16;
HSE = HSS + HSWidth;
VDisp = yres;
VTotal = VDisp * 1.07;
VSWidth = (VTotal / 100) + 1;
VSS = VDisp + ((int)(VTotal - VDisp) / 5) + 1;
VSE = VSS + VSWidth;
SS = HSS + xadjust;
SE = HSE + xadjust;
if (xadjust < 0) {
if (SS < (HDisp + 8)) {
SS = HDisp + 8;
SE = SS + HSWidth;
}
} else {
if ((HTotal - 24) < SE) {
SE = HTotal - 24;
SS = SE - HSWidth;
}
}
HSS = SS;
HSE = SE;
SS = VSS + yadjust;
SE = VSE + yadjust;
if (yadjust < 0) {
if (SS < (VDisp + 3)) {
SS = VDisp + 3;
SE = SS + VSWidth;
}
} else {
if ((VTotal - 4) < SE) {
SE = VTotal - 4;
SS = SE - VSWidth;
}
}
VSS = SS;
VSE = SE;
crtc->HorizontalTotal = HTotal;
crtc->HorizontalSyncStart = HSS;
crtc->HorizontalSyncEnd = HSE;
crtc->VerticalTotal = VTotal;
crtc->VerticalSyncStart = VSS;
crtc->VerticalSyncEnd = VSE;
crtc->Flags = HNEG | VNEG;
if (doublescan)
crtc->Flags |= DOUBLESCAN;
}
/* vesa_entermode:
* Attempts to enter specified video mode.
*
* success: 0
* failure: !0
*/
static int vesa_entermode (vl_mode *p, int refresh)
{
__dpmi_regs r;
if (oldmode == -1) {
r.x.ax = 0x4f03;
__dpmi_int(0x10, &r);
oldmode = r.x.bx;
}
r.x.ax = 0x4f02;
r.x.bx = p->mode;
if ((vesa_ver>>8) >= 3) {
/* VESA 3.0 stuff for controlling the refresh rate */
CRTCInfoBlock crtc;
unsigned long vclk;
double f0;
_crtc_timing(&crtc, p->xres, p->yres, 0, 0);
vclk = (double)crtc.HorizontalTotal * crtc.VerticalTotal * refresh;
vclk = _closest_pixclk(p->mode, vclk);
if (vclk != 0) {
f0 = (double)vclk / (crtc.HorizontalTotal * crtc.VerticalTotal);
/*_current_refresh_rate = (int)(f0 + 0.5);*/
crtc.PixelClock = vclk;
crtc.RefreshRate = refresh * 100;
movedata(_my_ds(), (unsigned)&crtc, _stubinfo->ds_selector, 0, sizeof(crtc));
r.x.di = 0;
r.x.es = _stubinfo->ds_segment;
r.x.bx |= 0x0800;
}
}
__dpmi_int(0x10, &r);
return (r.x.ax != 0x004f);
}
/* vesa_restore:
* Restores to the mode prior to first call to vesa_entermode.
*/
static void vesa_restore (void)
{
__dpmi_regs r;
if (oldmode != -1) {
r.x.ax = 0x4f02;
r.x.bx = oldmode;
__dpmi_int(0x10, &r);
}
}
/*
* the driver
*/
vl_driver VESA = {
vesa_getmodes,
vesa_entermode,
vesa_restore,
vesa_finit
};

View file

@ -0,0 +1,43 @@
/*
* 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.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef VESA_H_included
#define VESA_H_included
#include "../videoint.h"
extern vl_driver VESA;
#endif

View file

@ -23,7 +23,7 @@
*/
/*
* DOS/DJGPP device driver v1.0 for Mesa 4.0
* DOS/DJGPP device driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -31,52 +31,29 @@
*/
#include <dpmi.h>
#include <stdlib.h>
#include <string.h>
#include <stubinfo.h>
#include <sys/exceptn.h>
#include <sys/segments.h>
#include <sys/farptr.h>
#include "video.h"
#include "dpmiint.h"
#include "videoint.h"
#include "vesa/vesa.h"
typedef unsigned char word8;
typedef unsigned short word16;
typedef unsigned long word32;
typedef struct vl_mode {
int mode;
int xres, yres;
int scanlen;
int bpp;
} vl_mode;
#define _16_ *(word16 *)&
#define _32_ *(word32 *)&
static int init;
static vl_mode modes[64];
static vl_driver *drv = &VESA;
/* card specific: valid forever */
static word16 vesa_ver;
static word32 hw_granularity, hw_linearfb;
word32 vl_hw_granularity;
static unsigned int gran_shift, gran_mask;
/* based upon mode specific data: valid entire session */
static int video_selector, banked_selector, linear_selector;
int vl_video_selector;
static int video_scanlen, video_bypp;
/* valid until next buffer */
static int current_offset, current_delta, current_width;
int vl_current_offset, vl_current_delta;
static int current_width;
/* lookup table for scaling 5 bit colors up to 8 bits */
static int _rgb_scale_5[32] =
{
static int _rgb_scale_5[32] = {
0, 8, 16, 24, 32, 41, 49, 57,
65, 74, 82, 90, 98, 106, 115, 123,
131, 139, 148, 156, 164, 172, 180, 189,
@ -84,8 +61,7 @@ static int _rgb_scale_5[32] =
};
/* lookup table for scaling 6 bit colors up to 8 bits */
static int _rgb_scale_6[64] =
{
static int _rgb_scale_6[64] = {
0, 4, 8, 12, 16, 20, 24, 28,
32, 36, 40, 44, 48, 52, 56, 60,
64, 68, 72, 76, 80, 85, 89, 93,
@ -98,69 +74,17 @@ static int _rgb_scale_6[64] =
/*
* virtual clearing
*/
void (*vl_clear) (void *buffer, int len, int color);
#define v_clear15 v_clear16
extern void v_clear16 (void *buffer, int len, int color);
extern void v_clear32 (void *buffer, int len, int color);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _v_clear16 \n\
_v_clear16: \n\
movl 12(%esp), %eax \n\
pushw %ax \n\
pushw %ax \n\
popl %eax \n\
jmp _v_clear_common \n\
.balign 4 \n\
.global _v_clear32 \n\
_v_clear32: \n\
movl 12(%esp), %eax \n\
.balign 4 \n\
_v_clear_common: \n\
movl 8(%esp), %ecx \n\
movl 4(%esp), %edx \n\
shrl $2, %ecx \n\
0: \n\
.balign 4 \n\
movl %eax, (%edx) \n\
addl $4, %edx \n\
decl %ecx \n\
jnz 0b \n\
ret");
extern void v_clear24 (void *buffer, int len, int color);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _v_clear24 \n\
_v_clear24: \n\
movl 8(%esp), %edx \n\
movl $0xaaaaaaab, %eax \n\
mull %edx \n\
movl 12(%esp), %eax \n\
movl %edx, %ecx \n\
movl 4(%esp), %edx \n\
pushl %ebx \n\
shrl %ecx \n\
movb 18(%esp), %bl \n\
.balign 4 \n\
0: \n\
movw %ax, (%edx) \n\
movb %bl, 2(%edx) \n\
addl $3, %edx \n\
decl %ecx \n\
jnz 0b \n\
popl %ebx \n\
ret");
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_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]);
/*
* virtual rectangle clearing
/* vl_rect:
* Clears a rectange with specified color.
*/
void vl_rect (void *buffer, int x, int y, int width, int height, int color)
{
@ -177,114 +101,9 @@ void vl_rect (void *buffer, int x, int y, int width, int height, int color)
/*
* virtual dumping:
/* vl_mixrgba*:
* Color composition (w/ ALPHA).
*/
void (*vl_flip) (void *buffer, int width, int height);
extern void b_dump_virtual (void *buffer, int width, int height);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _b_dump_virtual \n\
_b_dump_virtual: \n\
pushl %ebx \n\
pushl %esi \n\
pushl %edi \n\
pushl %ebp \n\
movl _video_selector, %fs \n\
movl 4*4+4+0(%esp), %esi \n\
movl _hw_granularity, %ebp \n\
xorl %edx, %edx \n\
movl _current_offset, %eax \n\
divl %ebp \n\
movl %edx, %edi \n\
pushl %eax \n\
movl %eax, %edx \n\
xorl %ebx, %ebx \n\
movw $0x4f05, %ax \n\
int $0x10 \n\
movl _current_delta, %ebx \n\
movl 5*4+4+4(%esp), %ecx \n\
movl 5*4+4+8(%esp), %edx \n\
shrl $2, %ecx \n\
.balign 4 \n\
0: \n\
pushl %ecx \n\
.balign 4 \n\
1: \n\
cmpl %ebp, %edi \n\
jb 2f \n\
pushl %ebx \n\
pushl %edx \n\
incl 12(%esp) \n\
movw $0x4f05, %ax \n\
movl 12(%esp), %edx \n\
xorl %ebx, %ebx \n\
int $0x10 \n\
popl %edx \n\
popl %ebx \n\
subl %ebp, %edi \n\
2: \n\
movl (%esi), %eax \n\
addl $4, %esi \n\
movl %eax, %fs:(%edi) \n\
addl $4, %edi \n\
decl %ecx \n\
jnz 1b \n\
popl %ecx \n\
addl %ebx, %edi \n\
decl %edx \n\
jnz 0b \n\
popl %eax \n\
popl %ebp \n\
popl %edi \n\
popl %esi \n\
popl %ebx \n\
ret");
extern void l_dump_virtual (void *buffer, int width, int height);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _l_dump_virtual \n\
_l_dump_virtual: \n\
pushl %ebx \n\
pushl %esi \n\
pushl %edi \n\
movl _video_selector, %fs \n\
movl 3*4+4+0(%esp), %esi \n\
movl _current_offset, %edi \n\
movl 3*4+4+4(%esp), %ecx \n\
movl 3*4+4+8(%esp), %edx \n\
movl _current_delta, %ebx \n\
shrl $2, %ecx \n\
.balign 4 \n\
0: \n\
pushl %ecx \n\
.balign 4 \n\
1: \n\
movl (%esi), %eax \n\
addl $4, %esi \n\
movl %eax, %fs:(%edi) \n\
addl $4, %edi \n\
decl %ecx \n\
jnz 1b \n\
popl %ecx \n\
addl %ebx, %edi \n\
decl %edx \n\
jnz 0b \n\
popl %edi \n\
popl %esi \n\
popl %ebx \n\
ret");
/*
* mix RGBA components
*/
int (*vl_mixrgba) (const unsigned char rgba[]);
#define vl_mixrgba15 vl_mixrgb15
#define vl_mixrgba16 vl_mixrgb16
#define vl_mixrgba24 vl_mixrgb24
@ -295,11 +114,9 @@ static int vl_mixrgba32 (const unsigned char rgba[])
/*
* mix RGB components
/* vl_mixrgb*:
* Color composition (w/o ALPHA).
*/
int (*vl_mixrgb) (const unsigned char rgb[]);
static int vl_mixrgb15 (const unsigned char rgb[])
{
return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3);
@ -316,60 +133,8 @@ static int vl_mixrgb32 (const unsigned char rgb[])
/*
* vl_putpixel*
*/
void (*vl_putpixel) (void *buffer, int offset, int color);
#define v_putpixel15 v_putpixel16
extern void v_putpixel16 (void *buffer, int offset, int color);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _v_putpixel16 \n\
_v_putpixel16: \n\
movl 8(%esp), %edx \n\
shll %edx \n\
movl 12(%esp), %eax \n\
addl 4(%esp), %edx \n\
movw %ax, (%edx) \n\
ret");
extern void v_putpixel24 (void *buffer, int offset, int color);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _v_putpixel24 \n\
_v_putpixel24: \n\
movl 8(%esp), %edx \n\
leal (%edx, %edx, 2), %edx \n\
movl 12(%esp), %eax \n\
addl 4(%esp), %edx \n\
movw %ax, (%edx) \n\
shrl $16, %eax \n\
movb %al, 2(%edx) \n\
ret");
extern void v_putpixel32 (void *buffer, int offset, int color);
__asm__("\n\
.text \n\
.balign 4 \n\
.global _v_putpixel32 \n\
_v_putpixel32: \n\
movl 8(%esp), %edx \n\
shll $2, %edx \n\
movl 12(%esp), %eax \n\
addl 4(%esp), %edx \n\
movl %eax, (%edx) \n\
ret");
/*
* get pixel and decompose R, G, B, A
*/
void (*vl_getrgba) (void *buffer, int offset, unsigned char rgba[4]);
/*
* v_getrgba*
/* v_getrgba*:
* Color decomposition.
*/
static void v_getrgba15 (void *buffer, int offset, unsigned char rgba[4])
{
@ -406,8 +171,8 @@ static void v_getrgba32 (void *buffer, int offset, unsigned char rgba[4])
/*
* sync buffer with video hardware
/* vl_sync_buffer:
* Syncs buffer with video hardware. Returns NULL in case of failure.
*/
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height)
{
@ -417,9 +182,9 @@ void *vl_sync_buffer (void *buffer, int x, int y, int width, int height)
return NULL;
} else {
if ((newbuf=realloc(buffer, width*height*video_bypp))!=NULL) {
current_offset = video_scanlen * y + video_bypp * x;
vl_current_offset = video_scanlen * y + video_bypp * x;
current_width = width;
current_delta = video_scanlen - video_bypp * width;
vl_current_delta = video_scanlen - video_bypp * width;
}
return newbuf;
}
@ -427,102 +192,22 @@ void *vl_sync_buffer (void *buffer, int x, int y, int width, int height)
/*
* attempts to detect VESA and video modes
*/
static word16 vl_vesa_init (void)
{
__dpmi_regs r;
unsigned short *p;
vl_mode *q;
char vesa_info[512], tmp[512];
int maxsize = 0;
_farpokel(_stubinfo->ds_selector, 0, 0x32454256);
r.x.ax = 0x4f00;
r.x.di = 0;
r.x.es = _stubinfo->ds_segment;
__dpmi_int(0x10, &r);
if (r.x.ax==0x004f) {
movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512);
if ((_32_ vesa_info[0])==0x41534556) {
p = (unsigned short *)(((_16_ vesa_info[0x10])<<4) + (_16_ vesa_info[0x0e]));
q = modes;
do {
if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) {
break;
}
r.x.ax = 0x4f01;
r.x.cx = q->mode;
r.x.di = 512;
r.x.es = _stubinfo->ds_segment;
__dpmi_int(0x10, &r);
movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256);
switch (tmp[0x19]) {
case 16:
q->bpp = tmp[0x1f] + tmp[0x21] + tmp[0x23];
break;
case 15:
case 24:
case 32:
q->bpp = tmp[0x19];
break;
default:
q->bpp = 0;
}
if ((r.x.ax==0x004f)&&((tmp[0]&0x11)==0x11)&&q->bpp) {
q->xres = _16_ tmp[0x12];
q->yres = _16_ tmp[0x14];
q->scanlen = _16_ tmp[0x10];
hw_granularity = (_16_ tmp[4])<<10;
if (tmp[0]&0x80) {
*(q+1) = *q++;
hw_linearfb = _32_ tmp[0x28];
q->mode |= 0x4000;
}
if (maxsize<(q->scanlen*q->yres)) {
maxsize = q->scanlen*q->yres;
}
q++;
}
} while (!0);
if (hw_linearfb) {
maxsize = ((maxsize+0xfffUL)&~0xfffUL);
if (_create_selector(&linear_selector, hw_linearfb, maxsize)) {
return 0;
}
}
if (_create_selector(&banked_selector, 0xa0000, hw_granularity)) {
_remove_selector(&linear_selector);
return 0;
}
return _16_ vesa_info[4];
}
}
return 0;
}
/*
* setup mode
/* vl_setup_mode:
*
* success: 0
* failure: -1
*/
static int vl_setup_mode (vl_mode *p)
{
if (p->mode&0x4000) {
video_selector = linear_selector;
vl_flip = l_dump_virtual;
} else {
{ int n; for (gran_shift=0, n=hw_granularity; n; gran_shift++, n>>=1) ; }
{ int n; for (gran_shift=0, n=p->gran; n; gran_shift++, n>>=1) ; }
gran_mask = (1<<(--gran_shift)) - 1;
if (hw_granularity!=(gran_mask+1)) {
if ((unsigned)p->gran != (gran_mask+1)) {
return -1;
}
video_selector = banked_selector;
vl_hw_granularity = p->gran;
vl_flip = b_dump_virtual;
}
@ -554,56 +239,44 @@ static int vl_setup_mode (vl_mode *p)
video_bypp = (p->bpp+7)/8;
video_scanlen = p->scanlen;
vl_video_selector = p->sel;
return 0;
}
/*
* shutdown the video engine
/* vl_video_exit:
* Shutdown the video engine.
* Restores to the mode prior to first call to `vl_video_init'.
*/
void vl_video_exit (int textmode)
void vl_video_exit (void)
{
if (init) {
if (textmode) {
__asm__("movw $0x3, %%ax; int $0x10":::"%eax");
}
_remove_selector(&linear_selector);
_remove_selector(&banked_selector);
init = !init;
}
drv->restore();
drv->finit();
}
/*
* initialize video engine
/* vl_video_init:
* Enter mode.
*
* success: 0
* failure: -1
* success: 0
* failure: -1
*/
int vl_video_init (int width, int height, int bpp)
int vl_video_init (int width, int height, int bpp, int refresh)
{
vl_mode *p, *q;
unsigned int min;
/* check for prior initialization */
if (init) {
return 0;
}
/* initialize hardware */
if (!(vesa_ver=vl_vesa_init())) {
if ((q=drv->getmodes()) == NULL) {
return -1;
}
init = !init;
/* search for a mode that fits our request */
for (min=-1, p=NULL, q=modes; q->mode!=0xffff; q++) {
if ((q->xres>=width)&&(q->yres>=height)&&(q->bpp==bpp)) {
for (min=-1, p=NULL; q->mode!=0xffff; q++) {
if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) {
if (min>=(unsigned)(q->xres*q->yres)) {
min = q->xres*q->yres;
p = q;
@ -611,13 +284,11 @@ int vl_video_init (int width, int height, int bpp)
}
}
if (p) {
vl_setup_mode(p);
__asm__("movw $0x4f02, %%ax; int $0x10"::"b"(p->mode):"%eax");
/* check, setup and enter mode */
if ((p!=NULL) && (vl_setup_mode(p) == 0) && (drv->entermode(p, refresh) == 0)) {
return 0;
} else {
/* no suitable mode found, abort */
vl_video_exit(0);
return -1;
}
/* abort */
return -1;
}

View file

@ -23,7 +23,7 @@
*/
/*
* DOS/DJGPP device driver v1.0 for Mesa 4.0
* DOS/DJGPP device driver v1.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
@ -34,15 +34,15 @@
#ifndef VIDEO_H_included
#define VIDEO_H_included
int vl_video_init (int width, int height, int bpp);
void vl_video_exit (int textmode);
int vl_video_init (int width, int height, int bpp, int refresh);
void vl_video_exit (void);
void *vl_sync_buffer (void *buffer, int x, int y, int width, int height);
extern void (*vl_clear) (void *buffer, int len, int color);
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 width, int height);
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[]);

View file

@ -0,0 +1,99 @@
/*
* 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.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
#ifndef VIDEOINT_H_included
#define VIDEOINT_H_included
/*
* 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 *(*getmodes) (void);
int (*entermode) (vl_mode *p, int refresh);
void (*restore) (void);
void (*finit) (void);
} vl_driver;
/*
* asm routines to deal with virtual buffering
*/
#define v_clear15 v_clear16
extern void v_clear16 (void *buffer, int bytes, int color);
extern void v_clear32 (void *buffer, int bytes, int color);
extern void v_clear24 (void *buffer, int bytes, int color);
extern void b_dump_virtual (void *buffer, int stride, int height);
extern void l_dump_virtual (void *buffer, int stride, int height);
#define v_putpixel15 v_putpixel16
extern void v_putpixel16 (void *buffer, int offset, int color);
extern void v_putpixel24 (void *buffer, int offset, int color);
extern void v_putpixel32 (void *buffer, int offset, int color);
#endif

View file

@ -0,0 +1,237 @@
/*
* 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.1 for Mesa 4.0
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@yahoo.com
* Web : http://www.geocities.com/dborca
*/
.file "virtual.S"
/*
* extern word32 vl_hw_granularity;
* extern int vl_video_selector;
* extern int vl_current_offset, vl_current_delta;
*/
.text
/*
* void v_clear16 (void *buffer, int bytes, int color);
*/
.balign 4
.global _v_clear16
_v_clear16:
movl 12(%esp), %eax
pushw %ax
pushw %ax
popl %eax
jmp _v_clear_common
/*
* void v_clear32 (void *buffer, int bytes, int color);
*/
.balign 4
.global _v_clear32
_v_clear32:
movl 12(%esp), %eax
.balign 4
_v_clear_common:
movl 8(%esp), %ecx
movl 4(%esp), %edx
shrl $2, %ecx
0:
.balign 4
movl %eax, (%edx)
addl $4, %edx
decl %ecx
jnz 0b
ret
/*
* void v_clear24 (void *buffer, int bytes, int color);
*/
.balign 4
.global _v_clear24
_v_clear24:
movl 8(%esp), %edx
movl $0xaaaaaaab, %eax
mull %edx
movl 12(%esp), %eax
movl %edx, %ecx
movl 4(%esp), %edx
pushl %ebx
shrl %ecx
movb 18(%esp), %bl
.balign 4
0:
movw %ax, (%edx)
movb %bl, 2(%edx)
addl $3, %edx
decl %ecx
jnz 0b
popl %ebx
ret
/*
* void b_dump_virtual (void *buffer, int stride, int height);
*/
.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
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
.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
decl %ecx
jnz 1b
popl %ecx
addl %ebx, %edi
decl %edx
jnz 0b
popl %eax
popl %ebp
popl %edi
popl %esi
popl %ebx
ret
/*
* void l_dump_virtual (void *buffer, int stride, int height);
*/
.balign 4
.global _l_dump_virtual
_l_dump_virtual:
pushl %ebx
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
.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
popl %ecx
addl %ebx, %edi
decl %edx
jnz 0b
popl %edi
popl %esi
popl %ebx
ret
/*
* void v_putpixel16 (void *buffer, int offset, int color);
*/
.balign 4
.global _v_putpixel16
_v_putpixel16:
movl 8(%esp), %edx
shll %edx
movl 12(%esp), %eax
addl 4(%esp), %edx
movw %ax, (%edx)
ret
/*
* void v_putpixel24 (void *buffer, int offset, int color);
*/
.balign 4
.global _v_putpixel24
_v_putpixel24:
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)
ret
/*
* void v_putpixel32 (void *buffer, int offset, int color);
*/
.balign 4
.global _v_putpixel32
_v_putpixel32:
movl 8(%esp), %edx
shll $2, %edx
movl 12(%esp), %eax
addl 4(%esp), %edx
movl %eax, (%edx)
ret

View file

@ -20,32 +20,68 @@
# 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.0 for Mesa 4.0
# DOS/DJGPP core makefile v1.1 for Mesa 4.0
#
# Copyright (C) 2002 - Borca Daniel
# Email : dborca@yahoo.com
# Web : http://www.geocities.com/dborca
#
# Available options:
#
# 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
# HAVE_X86=1 optimize for i386.
# default = no
# HAVE_MMX=1 MMX instructions; use only if you assembler/compiler
# supports MMX instruction set; backwards compatibility
# with older processors is still preserved.
# default = no
# HAVE_SSE=1 (see HAVE_MMX)
# default = no
# HAVE_3DNOW=1 (see HAVE_MMX)
# default = no
#
# Targets:
# all: build GL
# clean: remove object files
#
.PHONY: all clean
TOP = ..
CC = gcc
CFLAGS = -I$(TOP)/include -I. -Wall -W -Wno-unused -mcpu=$(CPU) -ffast-math -O2
AR = ar
ARFLAGS = ruv
GLIDE ?= $(TOP)/include/glide3
LIBDIR = $(TOP)/lib
ifeq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN =
else
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
GL_LIB = libgl.a
GL_DXE = gl.dxe
GL_IMP = libigl.a
CC = gcc
CFLAGS += -I$(TOP)/include -I.
ifdef FX
CFLAGS += -D__DOS__ -I$(GLIDE) -DFX -DFX_GLIDE3 -DFXMESA_USE_ARGB
endif
AR = ar
ARFLAGS = ru
ifneq ($(wildcard $(DJDIR)/lib/dxe2.ld),)
DXE2GEN = $(wildcard $(addsuffix /dxe2gen.exe,$(subst ;, ,$(PATH))))
endif
RM = del
CORE_SOURCES = \
swrast_setup/ss_context.c \
swrast_setup/ss_triangle.c \
@ -60,6 +96,7 @@ CORE_SOURCES = \
buffers.c \
clip.c \
colortab.c \
config.c \
context.c \
convolve.c \
debug.c \
@ -175,7 +212,8 @@ X86_SOURCES = \
X86/x86_vertex.S \
X86/x86_cliptest.S
MMX_SOURCES =
MMX_SOURCES = \
X86/mmx_blend.S
SSE_SOURCES = \
X86/sse.c \
@ -185,7 +223,7 @@ SSE_SOURCES = \
X86/sse_vertex.S \
X86/sse_normal.S
D3NOW_SOURCES = \
K3D_SOURCES = \
X86/3dnow.c \
X86/3dnow_xform2.S \
X86/3dnow_xform3.S \
@ -203,7 +241,7 @@ CFLAGS += -DUSE_SSE_ASM
HAVE_X86 = 1
endif
ifdef HAVE_3DNOW
X86_SOURCES += $(D3NOW_SOURCES)
X86_SOURCES += $(K3D_SOURCES)
CFLAGS += -DUSE_3DNOW_ASM
HAVE_X86 = 1
endif
@ -213,16 +251,36 @@ else
X86_SOURCES =
endif
DRIVER_SOURCES = DOS/dmesa.c DOS/video.c DOS/dpmi.c
ifndef FX
DRIVER_SOURCES = \
DOS/dmesa.c \
DOS/video.c \
DOS/virtual.S \
DOS/vesa/vesa.c \
DOS/dpmi.c
else
DRIVER_SOURCES = \
FX/fxapi.c \
FX/fxdd.c \
FX/fxddspan.c \
FX/fxddtex.c \
FX/fxsetup.c \
FX/fxtexman.c \
FX/fxtris.c \
FX/fxvb.c \
FX/fxglidew.c
endif
SOURCES = $(CORE_SOURCES) $(X86_SOURCES) $(DRIVER_SOURCES)
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
.c.o:
gcc -o $@ -c $(CFLAGS) $<
$(CC) -o $@ -c $(CFLAGS) $<
.S.o:
gcc -o $@ -c $(CFLAGS) $<
$(CC) -o $@ -c $(CFLAGS) $<
.s.o:
$(CC) -o $@ -c $(CFLAGS) -x assembler-with-cpp $<
all: $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(GL_DXE) $(LIBDIR)/$(GL_IMP)
@ -234,24 +292,19 @@ ifeq ($(DXE2GEN),)
$(warning Missing DXE2GEN and/or DXE2.LD! You must have DXE2GEN)
$(warning somewhere in PATH, and DXE2.LD in DJGPP/LIB directory.)
else
dxe2gen -o $(LIBDIR)/$(GL_DXE) -I $(LIBDIR)/$(GL_IMP) $(OBJECTS) -D "Mesa DOS GL" -U
-dxe2gen -o $(LIBDIR)/$(GL_DXE) -I $(LIBDIR)/$(GL_IMP) $(OBJECTS) -E djgpp_ -E gl -E DMesa -E fxMesa -D "Mesa DJGPP GL" -U
endif
clean:
-$(RM) *.o
ifdef HAVE_X86
-$(RM) X86\*.o
endif
-$(RM) DOS\*.o
-$(RM) $(subst /,\,*.o)
-$(RM) $(subst /,\,array_cache/*.o)
-$(RM) $(subst /,\,math/*.o)
-$(RM) $(subst /,\,swrast/*.o)
-$(RM) $(subst /,\,swrast_setup/*.o)
-$(RM) $(subst /,\,tnl/*.o)
-$(RM) $(subst /,\,X86/*.o)
-$(RM) $(subst /,\,DOS/*.o)
-$(RM) $(subst /,\,DOS/vesa/*.o)
-$(RM) $(subst /,\,FX/*.o)
include depend
DOS/dmesa.o: DOS/dmesa.c glheader.h ../include/GL/gl.h context.h glapi.h \
mtypes.h config.h glapitable.h glthread.h math/m_matrix.h dd.h macros.h \
../include/GL/dmesa.h extensions.h matrix.h mmath.h texformat.h \
texstore.h array_cache/acache.h swrast/s_context.h swrast/swrast.h \
swrast/s_depth.h swrast/s_lines.h swrast/s_triangle.h swrast/s_trispan.h \
swrast_setup/swrast_setup.h tnl/tnl.h tnl/t_context.h math/m_vector.h \
math/m_xform.h tnl/t_pipeline.h DOS/video.h swrast/s_tritemp.h
DOS/dpmi.o: DOS/dpmi.c DOS/dpmiint.h
DOS/video.o: DOS/video.c DOS/video.h DOS/dpmiint.h
-include depend