added NUL driver for DMesa

This commit is contained in:
Daniel Borca
2004-02-07 10:54:36 +00:00
parent 07d6a98359
commit d039b43e30
8 changed files with 415 additions and 119 deletions

View File

@@ -111,7 +111,7 @@ FAQ:
Q) I made a simple application and it does nothing. It exits right away. Not Q) I made a simple application and it does nothing. It exits right away. Not
even a blank screen. even a blank screen.
A) The pure software drivers (VESA/VGA) support only double-buffered modes. A) Pure software drivers (VESA/VGA/NUL) support only double-buffered modes.
A) Another weird "feature" is that buffer width must be multiple of 8 (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 lazy programmer and I found that the easiest way to keep buffer handling
at peak performance ;-). at peak performance ;-).
@@ -126,6 +126,13 @@ FAQ:
from `Mesa/src/glut/dos/Makefile.DJ' before (re)making GLUT. Beware, this from `Mesa/src/glut/dos/Makefile.DJ' before (re)making GLUT. Beware, this
means you will never EVER be able to safely use `glut.dxe'! means you will never EVER be able to safely use `glut.dxe'!
Q) What is NUL driver good for, if I don't get any output at all?
A) For debugging. The NUL driver is very much like OSMesa. Everything is
done just the same as VESA/VGA drivers, only it doesn't touches your
video hardware. You can query the actual buffer by issuing:
DMesaGetIntegerv(DMESA_GET_BUFFER_ADDR, &buffer);
and dump it to a file.
Q) How do I query for a list of available video modes to choose as a visual? Q) How do I query for a list of available video modes to choose as a visual?
A) This is an ugly hack, for which I'm sure I'll burn in hell. A) This is an ugly hack, for which I'm sure I'll burn in hell.
First, query for a list of modes: First, query for a list of modes:
@@ -189,7 +196,11 @@ chosen in such a way that first window will fit. If you need high resolution
with small windows, set initial position far to the right (or way down); then with small windows, set initial position far to the right (or way down); then
you can move them back to any position right before the main loop. you can move them back to any position right before the main loop.
The following environment variables can customize GLUT behaviour:
Environment variables:
~~~~~~~~~~~~~~~~~~~~~~
DMESA_NULDRV - (any value) force NUL driver
GLUT_FPS - print frames/second statistics to stderr GLUT_FPS - print frames/second statistics to stderr
DMESA_GLUT_REFRESH - set vertical screen refresh rate (VESA3) DMESA_GLUT_REFRESH - set vertical screen refresh rate (VESA3)
DMESA_GLUT_BPP - set default bits per pixel (VGA needs 8) DMESA_GLUT_BPP - set default bits per pixel (VGA needs 8)
@@ -248,6 +259,7 @@ v1.5 (jan-2004)
x more changes to the 3dfx driver x more changes to the 3dfx driver
v1.6 (???-2004) v1.6 (???-2004)
+ implemented NUL driver
+ added DMesaGetProcAddress and glutGetProcAddress + added DMesaGetProcAddress and glutGetProcAddress
! fixed a horrible bug in VGA initialization routine ! fixed a horrible bug in VGA initialization routine

View File

@@ -141,6 +141,7 @@ void *DMesaGetProcAddress (const char *name);
#define DMESA_GET_SCREEN_SIZE 0x0100 #define DMESA_GET_SCREEN_SIZE 0x0100
#define DMESA_GET_DRIVER_CAPS 0x0200 #define DMESA_GET_DRIVER_CAPS 0x0200
#define DMESA_GET_VIDEO_MODES 0x0300 #define DMESA_GET_VIDEO_MODES 0x0300
#define DMESA_GET_BUFFER_ADDR 0x0400
#define DMESA_DRIVER_SWDB_BIT 0x1 /* software double-buffered */ #define DMESA_DRIVER_SWDB_BIT 0x1 /* software double-buffered */
#define DMESA_DRIVER_LLWO_BIT 0x2 /* lower-left window origin */ #define DMESA_DRIVER_LLWO_BIT 0x2 /* lower-left window origin */

View File

@@ -171,6 +171,7 @@ DRIVER_SOURCES += \
drivers/dos/vesa.c \ drivers/dos/vesa.c \
drivers/dos/blit.S \ drivers/dos/blit.S \
drivers/dos/vga.c \ drivers/dos/vga.c \
drivers/dos/null.c \
drivers/dos/dpmi.c drivers/dos/dpmi.c
endif endif

View File

@@ -69,11 +69,8 @@
*/ */
struct dmesa_visual { struct dmesa_visual {
GLvisual gl_visual; GLvisual gl_visual;
GLboolean db_flag; /* double buffered? */
GLboolean rgb_flag; /* RGB mode? */
GLboolean sw_alpha; /* use Mesa's alpha buffer? */ GLboolean sw_alpha; /* use Mesa's alpha buffer? */
GLuint depth; /* bits per pixel (1, 8, 24, etc) */ int z_buffer; /* Z=buffer: 0=no, 1=SW, -1=HW */
int zbuffer; /* Z=buffer: 0=no, 1=SW, -1=HW */
}; };
/* /*
@@ -95,7 +92,7 @@ struct dmesa_buffer {
struct dmesa_context { struct dmesa_context {
GLcontext gl_ctx; /* the core library context */ GLcontext gl_ctx; /* the core library context */
DMesaVisual visual; DMesaVisual visual;
DMesaBuffer Buffer; DMesaBuffer buffer;
GLuint ClearColor; GLuint ClearColor;
GLuint ClearIndex; GLuint ClearIndex;
/* etc... */ /* etc... */
@@ -107,10 +104,10 @@ struct dmesa_context {
/**************************************************************************** /****************************************************************************
* Read/Write pixels * Read/Write pixels
***************************************************************************/ ***************************************************************************/
#define FLIP(y) (dmesa->Buffer->height - (y) - 1) #define FLIP(y) (dmesa->buffer->height - (y) - 1)
#define FLIP2(y) (_b_ - (y)) #define FLIP2(y) (_b_ - (y))
#define DSTRIDE dmesa->Buffer->width #define DSTRIDE dmesa->buffer->width
/**************************************************************************** /****************************************************************************
* RGB[A] * RGB[A]
@@ -208,7 +205,7 @@ static void write_rgba_pixels (const GLcontext *ctx,
const GLubyte rgba[][4], const GLubyte mask[]) const GLubyte rgba[][4], const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1; GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
if (mask) { if (mask) {
/* draw some pixels */ /* draw some pixels */
@@ -232,7 +229,7 @@ static void write_mono_rgba_pixels (const GLcontext *ctx,
const GLchan color[4], const GLubyte mask[]) const GLchan color[4], const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1, rgba = vl_mixrgba(color); GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1, rgba = vl_mixrgba(color);
if (mask) { if (mask) {
/* draw some pixels */ /* draw some pixels */
@@ -256,7 +253,7 @@ static void read_rgba_pixels (const GLcontext *ctx,
GLubyte rgba[][4], const GLubyte mask[]) GLubyte rgba[][4], const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1; GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
if (mask) { if (mask) {
/* read some pixels */ /* read some pixels */
@@ -371,7 +368,7 @@ static void write_index_pixels (const GLcontext *ctx,
const GLuint index[], const GLubyte mask[]) const GLuint index[], const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1; GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
if (mask) { if (mask) {
/* draw some pixels */ /* draw some pixels */
@@ -395,7 +392,7 @@ static void write_mono_index_pixels (const GLcontext *ctx,
GLuint colorIndex, const GLubyte mask[]) GLuint colorIndex, const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1; GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
if (mask) { if (mask) {
/* draw some pixels */ /* draw some pixels */
@@ -419,7 +416,7 @@ static void read_index_pixels (const GLcontext *ctx,
GLuint index[], const GLubyte mask[]) GLuint index[], const GLubyte mask[])
{ {
const DMesaContext dmesa = (DMesaContext)ctx; const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1; GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
if (mask) { if (mask) {
/* read some pixels */ /* read some pixels */
@@ -455,8 +452,8 @@ static void read_index_pixels (const GLcontext *ctx,
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \ GLuint _w_ = dmesa->buffer->width; \
GLuint rgb = vl_mixrgb(v2->color); GLuint rgb = vl_mixrgb(v2->color);
#define RENDER_SPAN(span) \ #define RENDER_SPAN(span) \
@@ -479,8 +476,8 @@ static void read_index_pixels (const GLcontext *ctx,
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \ GLuint _w_ = dmesa->buffer->width; \
GLuint rgb = vl_mixrgb(v2->color); GLuint rgb = vl_mixrgb(v2->color);
#define RENDER_SPAN(span) \ #define RENDER_SPAN(span) \
@@ -507,8 +504,8 @@ static void read_index_pixels (const GLcontext *ctx,
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; GLuint _w_ = dmesa->buffer->width;
#define RENDER_SPAN(span) \ #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
@@ -534,8 +531,8 @@ static void read_index_pixels (const GLcontext *ctx,
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; GLuint _w_ = dmesa->buffer->width;
#define RENDER_SPAN(span) \ #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \ GLuint i, offset = FLIP2(span.y)*_w_ + span.x; \
@@ -616,8 +613,8 @@ static void dmesa_choose_tri (GLcontext *ctx)
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \ GLuint _w_ = dmesa->buffer->width; \
GLuint rgb = vl_mixrgb(vert1->color); GLuint rgb = vl_mixrgb(vert1->color);
#define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb); #define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb);
@@ -638,8 +635,8 @@ static void dmesa_choose_tri (GLcontext *ctx)
#define SETUP_CODE \ #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \ const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \ GLuint _b_ = dmesa->buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \ GLuint _w_ = dmesa->buffer->width; \
GLuint rgb = vl_mixrgb(vert1->color); GLuint rgb = vl_mixrgb(vert1->color);
#define PLOT(X,Y) \ #define PLOT(X,Y) \
@@ -751,7 +748,7 @@ static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
/* we can't handle color or index masking */ /* we can't handle color or index masking */
if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) { if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
if (mask & DD_BACK_LEFT_BIT) { if (mask & DD_BACK_LEFT_BIT) {
int color = c->visual->rgb_flag ? c->ClearColor : c->ClearIndex; int color = ((GLvisual *)(c->visual))->rgbMode ? c->ClearColor : c->ClearIndex;
if (all) { if (all) {
vl_clear(color); vl_clear(color);
@@ -958,10 +955,6 @@ DMesaVisual DMesaCreateVisual (GLint width,
GLint redBits, greenBits, blueBits, alphaBits, indexBits; GLint redBits, greenBits, blueBits, alphaBits, indexBits;
GLboolean sw_alpha; GLboolean sw_alpha;
if (!dbFlag) {
return NULL;
}
alphaBits = 0; alphaBits = 0;
if (!rgbFlag) { if (!rgbFlag) {
@@ -1017,6 +1010,9 @@ DMesaVisual DMesaCreateVisual (GLint width,
alphaBits = alphaSize; alphaBits = alphaSize;
sw_alpha = (alphaBits > 0); sw_alpha = (alphaBits > 0);
if (!dbFlag) {
return NULL;
}
if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) { if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
return NULL; return NULL;
} }
@@ -1040,12 +1036,8 @@ DMesaVisual DMesaCreateVisual (GLint width,
alphaBits?accumSize:0, /* accumAlpha */ alphaBits?accumSize:0, /* accumAlpha */
1); /* numSamples */ 1); /* numSamples */
v->depth = colDepth;
v->db_flag = dbFlag;
v->rgb_flag = rgbFlag;
v->sw_alpha = sw_alpha; v->sw_alpha = sw_alpha;
v->z_buffer = (depthSize > 0) ? 1 : 0;
v->zbuffer = (depthSize > 0) ? 1 : 0;
} }
return v; return v;
@@ -1113,7 +1105,7 @@ DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) { if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
_mesa_initialize_framebuffer((GLframebuffer *)b, _mesa_initialize_framebuffer((GLframebuffer *)b,
(GLvisual *)visual, (GLvisual *)visual,
visual->zbuffer == 1, visual->z_buffer == 1,
((GLvisual *)visual)->stencilBits > 0, ((GLvisual *)visual)->stencilBits > 0,
((GLvisual *)visual)->accumRedBits > 0, ((GLvisual *)visual)->accumRedBits > 0,
visual->sw_alpha); visual->sw_alpha);
@@ -1134,7 +1126,9 @@ DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
void DMesaDestroyBuffer (DMesaBuffer b) void DMesaDestroyBuffer (DMesaBuffer b)
{ {
#ifndef FX #ifndef FX
free(b->the_window); if (b->the_window != NULL) {
free(b->the_window);
}
_mesa_destroy_framebuffer((GLframebuffer *)b); _mesa_destroy_framebuffer((GLframebuffer *)b);
#endif #endif
} }
@@ -1179,7 +1173,7 @@ DMesaContext DMesaCreateContext (DMesaVisual visual,
tnl = TNL_CONTEXT(c); tnl = TNL_CONTEXT(c);
tnl->Driver.RunPipeline = _tnl_run_pipeline; tnl->Driver.RunPipeline = _tnl_run_pipeline;
/* swrast setup */ /* swrast setup */
if (visual->rgb_flag) dmesa_register_swrast_functions(c); if (((GLvisual *)visual)->rgbMode) dmesa_register_swrast_functions(c);
dmesa_init_pointers(c); dmesa_init_pointers(c);
_swsetup_Wakeup(c); _swsetup_Wakeup(c);
} }
@@ -1212,19 +1206,16 @@ GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos)
{ {
#ifndef FX #ifndef FX
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
DMesaBuffer b = ((DMesaContext)ctx)->Buffer; DMesaBuffer b = ((DMesaContext)ctx)->buffer;
if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) != 0) { if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
return GL_FALSE;
} else {
b->xpos = xpos; b->xpos = xpos;
b->ypos = ypos; b->ypos = ypos;
return GL_TRUE; return GL_TRUE;
} }
#else
return GL_FALSE;
#endif #endif
return GL_FALSE;
} }
@@ -1233,19 +1224,16 @@ GLboolean DMesaResizeBuffer (GLint width, GLint height)
{ {
#ifndef FX #ifndef FX
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
DMesaBuffer b = ((DMesaContext)ctx)->Buffer; DMesaBuffer b = ((DMesaContext)ctx)->buffer;
if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) != 0) { if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
return GL_FALSE;
} else {
b->width = width; b->width = width;
b->height = height; b->height = height;
return GL_TRUE; return GL_TRUE;
} }
#else
return GL_FALSE;
#endif #endif
return GL_FALSE;
} }
@@ -1261,7 +1249,7 @@ GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
return GL_FALSE; return GL_FALSE;
} }
c->Buffer = b; c->buffer = b;
_mesa_make_current((GLcontext *)c, (GLframebuffer *)b); _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
if (((GLcontext *)c)->Viewport.Width == 0) { if (((GLcontext *)c)->Viewport.Width == 0) {
@@ -1391,6 +1379,21 @@ int DMesaGetIntegerv (GLenum pname, GLint *params)
return n; return n;
} }
#endif #endif
case DMESA_GET_BUFFER_ADDR:
#ifndef FX
{
DMesaContext c = (DMesaContext)DMesaGetCurrentContext();
if (c != NULL) {
DMesaBuffer b = c->buffer;
if (b != NULL) {
params[0] = (GLint)b->the_window;
}
}
}
#else
return -1;
#endif
break;
default: default:
return -1; return -1;
} }

222
src/mesa/drivers/dos/null.c Normal file
View File

@@ -0,0 +1,222 @@
/*
* Mesa 3-D graphics library
* Version: 4.1
*
* 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.6 for Mesa
*
* Copyright (C) 2002 - Borca Daniel
* Email : dborca@users.sourceforge.net
* Web : http://www.geocities.com/dborca
*/
#include <stdlib.h>
#include <sys/segments.h>
#include "video.h"
#include "null.h"
static vl_mode *modes;
#define null_color_precision 8
static void null_blit_nop (void)
{
}
/* Desc: Attempts to detect VGA, check video modes and create selectors.
*
* In : -
* Out : mode array
*
* Note: -
*/
static vl_mode *null_init (void)
{
static int m[][2] = {
{320, 200},
{320, 240},
{400, 300},
{512, 384},
{640, 400},
{640, 480},
{800, 600},
{1024, 768},
{1280, 1024},
{1600, 1200}
};
static int b[] = {
8,
15,
16,
24,
32
};
unsigned int i, j, k;
if (modes == NULL) {
modes = malloc(sizeof(vl_mode) *
(1 + (sizeof(m) / sizeof(m[0]) * sizeof(b) / sizeof(b[0]))));
if (modes != NULL) {
for (k = 0, i = 0; i < sizeof(m) / sizeof(m[0]); i++) {
for (j = 0; j < sizeof(b) / sizeof(b[0]); j++, k++) {
modes[k].xres = m[i][0];
modes[k].yres = m[i][1];
modes[k].bpp = b[j];
modes[k].mode = 0x4000;
modes[k].scanlen = m[i][0] * ((b[j] + 7) / 8);
modes[k].sel = -1;
modes[k].gran = -1;
}
}
modes[k].xres = -1;
modes[k].yres = -1;
modes[k].bpp = -1;
modes[k].mode = 0xffff;
modes[k].scanlen = -1;
modes[k].sel = -1;
modes[k].gran = -1;
}
}
return modes;
}
/* Desc: Frees all resources allocated by VGA init code.
*
* In : -
* Out : -
*
* Note: -
*/
static void null_fini (void)
{
}
/* Desc: Attempts to enter specified video mode.
*
* In : ptr to mode structure, refresh rate
* Out : 0 if success
*
* Note: -
*/
static int null_entermode (vl_mode *p, int refresh)
{
NUL.blit = null_blit_nop;
return 0;
(void)(p && refresh); /* silence compiler warning */
}
/* Desc: Restores to the mode prior to first call to null_entermode.
*
* In : -
* Out : -
*
* Note: -
*/
static void null_restore (void)
{
}
/* Desc: set one palette entry
*
* In : color index, R, G, B
* Out : -
*
* Note: uses integer values
*/
static void null_setCI_i (int index, int red, int green, int blue)
{
(void)(index && red && green && blue); /* silence compiler warning */
}
/* Desc: set one palette entry
*
* In : color index, R, G, B
* Out : -
*
* Note: uses normalized values
*/
static void null_setCI_f (int index, float red, float green, float blue)
{
float max = (1 << null_color_precision) - 1;
null_setCI_i(index, (int)(red * max), (int)(green * max), (int)(blue * max));
}
/* Desc: state retrieval
*
* In : parameter name, ptr to storage
* Out : 0 if request successfully processed
*
* Note: -
*/
static int null_get (int pname, int *params)
{
switch (pname) {
default:
params[0] = params[0]; /* silence compiler warning */
return -1;
}
return 0;
}
/*
* the driver
*/
vl_driver NUL = {
null_init,
null_entermode,
NULL,
null_setCI_f,
null_setCI_i,
null_get,
null_restore,
null_fini
};

View File

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

View File

@@ -38,6 +38,7 @@
#include "internal.h" #include "internal.h"
#include "vesa.h" #include "vesa.h"
#include "vga.h" #include "vga.h"
#include "null.h"
#include "video.h" #include "video.h"
@@ -428,6 +429,13 @@ static vl_mode *v_init_hw (void)
static vl_mode *q = NULL; static vl_mode *q = NULL;
if (q == NULL) { if (q == NULL) {
/* are we forced to NUL driver? */
if (getenv("DMESA_NULDRV")) {
if ((q = NUL.init()) != NULL) {
drv = &NUL;
}
return q;
}
/* initialize hardware */ /* initialize hardware */
if ((q = VESA.init()) != NULL) { if ((q = VESA.init()) != NULL) {
drv = &VESA; drv = &VESA;

View File

@@ -572,12 +572,12 @@ wglUseFontBitmaps_FX(HDC fontDevice, DWORD firstChar, DWORD numChars,
bitDevice = CreateCompatibleDC(fontDevice); bitDevice = CreateCompatibleDC(fontDevice);
// Swap fore and back colors so the bitmap has the right polarity /* Swap fore and back colors so the bitmap has the right polarity */
tempColor = GetBkColor(bitDevice); tempColor = GetBkColor(bitDevice);
SetBkColor(bitDevice, GetTextColor(bitDevice)); SetBkColor(bitDevice, GetTextColor(bitDevice));
SetTextColor(bitDevice, tempColor); SetTextColor(bitDevice, tempColor);
// Place chars based on base line /* Place chars based on base line */
SetTextAlign(bitDevice, TA_BASELINE); SetTextAlign(bitDevice, TA_BASELINE);
for (i = 0; i < (int)numChars; i++) { for (i = 0; i < (int)numChars; i++) {
@@ -588,34 +588,34 @@ wglUseFontBitmaps_FX(HDC fontDevice, DWORD firstChar, DWORD numChars,
HGDIOBJ origBmap; HGDIOBJ origBmap;
unsigned char *bmap; unsigned char *bmap;
curChar = (char)(i + firstChar); // [koolsmoky] explicit cast curChar = (char)(i + firstChar); /* [koolsmoky] explicit cast */
// Find how high/wide this character is /* Find how high/wide this character is */
GetTextExtentPoint32(bitDevice, &curChar, 1, &size); GetTextExtentPoint32(bitDevice, &curChar, 1, &size);
// Create the output bitmap /* Create the output bitmap */
charWidth = size.cx; charWidth = size.cx;
charHeight = size.cy; charHeight = size.cy;
bmapWidth = ((charWidth + 31) / 32) * 32; // Round up to the next multiple of 32 bits bmapWidth = ((charWidth + 31) / 32) * 32; /* Round up to the next multiple of 32 bits */
bmapHeight = charHeight; bmapHeight = charHeight;
bitObject = CreateCompatibleBitmap(bitDevice, bmapWidth, bmapHeight); bitObject = CreateCompatibleBitmap(bitDevice, bmapWidth, bmapHeight);
//VERIFY(bitObject); /*VERIFY(bitObject);*/
// Assign the output bitmap to the device /* Assign the output bitmap to the device */
origBmap = SelectObject(bitDevice, bitObject); origBmap = SelectObject(bitDevice, bitObject);
PatBlt(bitDevice, 0, 0, bmapWidth, bmapHeight, BLACKNESS); PatBlt(bitDevice, 0, 0, bmapWidth, bmapHeight, BLACKNESS);
// Use our source font on the device /* Use our source font on the device */
SelectObject(bitDevice, GetCurrentObject(fontDevice, OBJ_FONT)); SelectObject(bitDevice, GetCurrentObject(fontDevice, OBJ_FONT));
// Draw the character /* Draw the character */
TextOut(bitDevice, 0, metric.tmAscent, &curChar, 1); TextOut(bitDevice, 0, metric.tmAscent, &curChar, 1);
// Unselect our bmap object /* Unselect our bmap object */
SelectObject(bitDevice, origBmap); SelectObject(bitDevice, origBmap);
// Convert the display dependant representation to a 1 bit deep DIB /* Convert the display dependant representation to a 1 bit deep DIB */
numBytes = (bmapWidth * bmapHeight) / 8; numBytes = (bmapWidth * bmapHeight) / 8;
bmap = MALLOC(numBytes); bmap = MALLOC(numBytes);
dibInfo->bmiHeader.biWidth = bmapWidth; dibInfo->bmiHeader.biWidth = bmapWidth;
@@ -623,21 +623,21 @@ wglUseFontBitmaps_FX(HDC fontDevice, DWORD firstChar, DWORD numChars,
res = GetDIBits(bitDevice, bitObject, 0, bmapHeight, bmap, res = GetDIBits(bitDevice, bitObject, 0, bmapHeight, bmap,
dibInfo, DIB_RGB_COLORS); dibInfo, DIB_RGB_COLORS);
// Create the GL object /* Create the GL object */
glNewList(i + listBase, GL_COMPILE); glNewList(i + listBase, GL_COMPILE);
glBitmap(bmapWidth, bmapHeight, 0.0, metric.tmDescent, glBitmap(bmapWidth, bmapHeight, 0.0, metric.tmDescent,
charWidth, 0.0, bmap); charWidth, 0.0, bmap);
glEndList(); glEndList();
// CheckGL(); /* CheckGL(); */
// Destroy the bmap object /* Destroy the bmap object */
DeleteObject(bitObject); DeleteObject(bitObject);
// Deallocate the bitmap data /* Deallocate the bitmap data */
FREE(bmap); FREE(bmap);
} }
// Destroy the DC /* Destroy the DC */
DeleteDC(bitDevice); DeleteDC(bitDevice);
FREE(dibInfo); FREE(dibInfo);
@@ -695,87 +695,95 @@ GLAPI int GLAPIENTRY
wglChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR * ppfd) wglChoosePixelFormat(HDC hdc, const PIXELFORMATDESCRIPTOR * ppfd)
{ {
int i, best = -1, qt_valid_pix; int i, best = -1, qt_valid_pix;
PIXELFORMATDESCRIPTOR pfd = *ppfd;
#if 0 #if 0
FILE *pix_file; FILE *pix_file;
pix_file = fopen("pix_log.txt", "a"); pix_file = fopen("pix_log.txt", "a");
if (pix_file) { if (pix_file) {
fprintf(pix_file, "wglChoosePixelFormat\n"); fprintf(pix_file, "wglChoosePixelFormat\n");
fprintf(pix_file, "nSize = %d\n",ppfd->nSize); fprintf(pix_file, "nSize = %d\n",pfd.nSize);
fprintf(pix_file, "nVersion = %d\n",ppfd->nVersion); fprintf(pix_file, "nVersion = %d\n",pfd.nVersion);
fprintf(pix_file, "dwFlags = %d\n",ppfd->dwFlags); fprintf(pix_file, "dwFlags = %d\n",pfd.dwFlags);
fprintf(pix_file, "iPixelType = %d\n",ppfd->iPixelType); fprintf(pix_file, "iPixelType = %d\n",pfd.iPixelType);
fprintf(pix_file, "cColorBits = %d\n",ppfd->cColorBits); fprintf(pix_file, "cColorBits = %d\n",pfd.cColorBits);
fprintf(pix_file, "cRedBits = %d\n",ppfd->cRedBits); fprintf(pix_file, "cRedBits = %d\n",pfd.cRedBits);
fprintf(pix_file, "cRedShift = %d\n",ppfd->cRedShift); fprintf(pix_file, "cRedShift = %d\n",pfd.cRedShift);
fprintf(pix_file, "cGreenBits = %d\n",ppfd->cGreenBits); fprintf(pix_file, "cGreenBits = %d\n",pfd.cGreenBits);
fprintf(pix_file, "cGreenShift = %d\n",ppfd->cGreenShift); fprintf(pix_file, "cGreenShift = %d\n",pfd.cGreenShift);
fprintf(pix_file, "cBlueBits = %d\n",ppfd->cBlueBits); fprintf(pix_file, "cBlueBits = %d\n",pfd.cBlueBits);
fprintf(pix_file, "cBlueShift = %d\n",ppfd->cBlueShift); fprintf(pix_file, "cBlueShift = %d\n",pfd.cBlueShift);
fprintf(pix_file, "cAlphaBits = %d\n",ppfd->cAlphaBits); fprintf(pix_file, "cAlphaBits = %d\n",pfd.cAlphaBits);
fprintf(pix_file, "cAlphaShift = %d\n",ppfd->cAlphaShift); fprintf(pix_file, "cAlphaShift = %d\n",pfd.cAlphaShift);
fprintf(pix_file, "cAccumBits = %d\n",ppfd->cAccumBits); fprintf(pix_file, "cAccumBits = %d\n",pfd.cAccumBits);
fprintf(pix_file, "cAccumRedBits = %d\n",ppfd->cAccumRedBits); fprintf(pix_file, "cAccumRedBits = %d\n",pfd.cAccumRedBits);
fprintf(pix_file, "cAccumGreenBits = %d\n",ppfd->cAccumGreenBits); fprintf(pix_file, "cAccumGreenBits = %d\n",pfd.cAccumGreenBits);
fprintf(pix_file, "cAccumBlueBits = %d\n",ppfd->cAccumBlueBits); fprintf(pix_file, "cAccumBlueBits = %d\n",pfd.cAccumBlueBits);
fprintf(pix_file, "cAccumAlphaBits = %d\n",ppfd->cAccumAlphaBits); fprintf(pix_file, "cAccumAlphaBits = %d\n",pfd.cAccumAlphaBits);
fprintf(pix_file, "cDepthBits = %d\n",ppfd->cDepthBits); fprintf(pix_file, "cDepthBits = %d\n",pfd.cDepthBits);
fprintf(pix_file, "cStencilBits = %d\n",ppfd->cStencilBits); fprintf(pix_file, "cStencilBits = %d\n",pfd.cStencilBits);
fprintf(pix_file, "cAuxBuffers = %d\n",ppfd->cAuxBuffers); fprintf(pix_file, "cAuxBuffers = %d\n",pfd.cAuxBuffers);
fprintf(pix_file, "iLayerType = %d\n",ppfd->iLayerType); fprintf(pix_file, "iLayerType = %d\n",pfd.iLayerType);
fprintf(pix_file, "bReserved = %d\n",ppfd->bReserved); fprintf(pix_file, "bReserved = %d\n",pfd.bReserved);
fprintf(pix_file, "dwLayerMask = %d\n",ppfd->dwLayerMask); fprintf(pix_file, "dwLayerMask = %d\n",pfd.dwLayerMask);
fprintf(pix_file, "dwVisibleMask = %d\n",ppfd->dwVisibleMask); fprintf(pix_file, "dwVisibleMask = %d\n",pfd.dwVisibleMask);
fprintf(pix_file, "dwDamageMask = %d\n",ppfd->dwDamageMask); fprintf(pix_file, "dwDamageMask = %d\n",pfd.dwDamageMask);
fclose(pix_file); fclose(pix_file);
} }
#endif #endif
#if 1 || QUAKE2
if (ppfd->cColorBits == 24 && ppfd->cDepthBits == 32) {
ppfd->cColorBits = 16;
ppfd->cDepthBits = 16;
}
#endif
qt_valid_pix = pfd_tablen(); qt_valid_pix = pfd_tablen();
if (ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR) || ppfd->nVersion != 1) { #if 1 || QUAKE2 || GORE
/* QUAKE2: 24+32 */
/* GORE : 24+16 */
if (pfd.cColorBits == 24) {
/* the first 2 entries are 16bit */
pfd.cColorBits = (qt_valid_pix > 2) ? 32 : 16;
}
if (pfd.cColorBits == 32) {
pfd.cDepthBits = 24;
} else if (pfd.cColorBits == 16) {
pfd.cDepthBits = 16;
}
#endif
if (pfd.nSize != sizeof(PIXELFORMATDESCRIPTOR) || pfd.nVersion != 1) {
SetLastError(0); SetLastError(0);
return (0); return (0);
} }
for (i = 0; i < qt_valid_pix; i++) { for (i = 0; i < qt_valid_pix; i++) {
if (ppfd->cColorBits > 0 && pix[i].pfd.cColorBits != ppfd->cColorBits) if (pfd.cColorBits > 0 && pix[i].pfd.cColorBits != pfd.cColorBits)
continue; continue;
if ((ppfd->dwFlags & PFD_DRAW_TO_WINDOW) if ((pfd.dwFlags & PFD_DRAW_TO_WINDOW)
&& !(pix[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW)) continue; && !(pix[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW)) continue;
if ((ppfd->dwFlags & PFD_DRAW_TO_BITMAP) if ((pfd.dwFlags & PFD_DRAW_TO_BITMAP)
&& !(pix[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP)) continue; && !(pix[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP)) continue;
if ((ppfd->dwFlags & PFD_SUPPORT_GDI) if ((pfd.dwFlags & PFD_SUPPORT_GDI)
&& !(pix[i].pfd.dwFlags & PFD_SUPPORT_GDI)) continue; && !(pix[i].pfd.dwFlags & PFD_SUPPORT_GDI)) continue;
if ((ppfd->dwFlags & PFD_SUPPORT_OPENGL) if ((pfd.dwFlags & PFD_SUPPORT_OPENGL)
&& !(pix[i].pfd.dwFlags & PFD_SUPPORT_OPENGL)) continue; && !(pix[i].pfd.dwFlags & PFD_SUPPORT_OPENGL)) continue;
if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) if (!(pfd.dwFlags & PFD_DOUBLEBUFFER_DONTCARE)
&& ((ppfd->dwFlags & PFD_DOUBLEBUFFER) != && ((pfd.dwFlags & PFD_DOUBLEBUFFER) !=
(pix[i].pfd.dwFlags & PFD_DOUBLEBUFFER))) continue; (pix[i].pfd.dwFlags & PFD_DOUBLEBUFFER))) continue;
if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) if (!(pfd.dwFlags & PFD_STEREO_DONTCARE)
&& ((ppfd->dwFlags & PFD_STEREO) != && ((pfd.dwFlags & PFD_STEREO) !=
(pix[i].pfd.dwFlags & PFD_STEREO))) continue; (pix[i].pfd.dwFlags & PFD_STEREO))) continue;
if (ppfd->cDepthBits > 0 && pix[i].pfd.cDepthBits == 0) if (pfd.cDepthBits > 0 && pix[i].pfd.cDepthBits == 0)
continue; /* need depth buffer */ continue; /* need depth buffer */
if (ppfd->cAlphaBits > 0 && pix[i].pfd.cAlphaBits == 0) if (pfd.cAlphaBits > 0 && pix[i].pfd.cAlphaBits == 0)
continue; /* need alpha buffer */ continue; /* need alpha buffer */
#if 0 #if 0
if ((ppfd->cColorBits == 32) && (ppfd->cStencilBits > 0 && pix[i].pfd.cStencilBits == 0)) if ((pfd.cColorBits == 32) && (pfd.cStencilBits > 0 && pix[i].pfd.cStencilBits == 0))
continue; /* need stencil */ continue; /* need stencil */
#endif #endif
if (ppfd->iPixelType == pix[i].pfd.iPixelType) { if (pfd.iPixelType == pix[i].pfd.iPixelType) {
best = i + 1; best = i + 1;
break; break;
} }