summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/GL/fxmesa.h1
-rw-r--r--src/mesa/drivers/dos/dmesa.c3
-rw-r--r--src/mesa/drivers/glide/fxapi.c41
-rw-r--r--src/mesa/drivers/glide/fxdd.c222
-rw-r--r--src/mesa/drivers/glide/fxddspan.c257
-rw-r--r--src/mesa/drivers/glide/fxdrv.h6
-rw-r--r--src/mesa/drivers/glide/fxglidew.c21
-rw-r--r--src/mesa/drivers/glide/fxglidew.h13
8 files changed, 541 insertions, 23 deletions
diff --git a/include/GL/fxmesa.h b/include/GL/fxmesa.h
index b197892398..7697c72007 100644
--- a/include/GL/fxmesa.h
+++ b/include/GL/fxmesa.h
@@ -51,6 +51,7 @@ extern "C" {
#define FXMESA_DEPTH_SIZE 12 /* followed by an integer */
#define FXMESA_STENCIL_SIZE 13 /* followed by an integer */
#define FXMESA_ACCUM_SIZE 14 /* followed by an integer */
+#define FXMESA_COLORDEPTH 20 /* followed by an integer */
diff --git a/src/mesa/drivers/dos/dmesa.c b/src/mesa/drivers/dos/dmesa.c
index 9ec0036176..92381307c2 100644
--- a/src/mesa/drivers/dos/dmesa.c
+++ b/src/mesa/drivers/dos/dmesa.c
@@ -1452,6 +1452,8 @@ DMesaVisual DMesaCreateVisual (GLint width,
if (stencilSize > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = stencilSize; }
if (accumSize > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = accumSize; }
if (alphaFlag) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = 1; }
+ fx_attrib[i++] = FXMESA_COLORDEPTH;
+ fx_attrib[i++] = colDepth;
fx_attrib[i] = FXMESA_NONE;
return (DMesaVisual)fxMesaCreateBestContext(-1, width, height, fx_attrib);
@@ -1534,6 +1536,7 @@ DMesaContext DMesaCreateContext (DMesaVisual visual,
_mesa_enable_sw_extensions((GLcontext *)c);
_mesa_enable_1_3_extensions((GLcontext *)c);
_mesa_enable_1_4_extensions((GLcontext *)c);
+ _mesa_enable_1_5_extensions((GLcontext *)c);
/* you probably have to do a bunch of other initializations here. */
c->visual = visual;
diff --git a/src/mesa/drivers/glide/fxapi.c b/src/mesa/drivers/glide/fxapi.c
index a1fdf1dc87..bb87565296 100644
--- a/src/mesa/drivers/glide/fxapi.c
+++ b/src/mesa/drivers/glide/fxapi.c
@@ -1,4 +1,4 @@
-/* $Id: fxapi.c,v 1.35 2002/10/24 23:57:23 brianp Exp $ */
+/* $Id: fxapi.c,v 1.36 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -283,6 +283,8 @@ fxMesaCreateContext(GLuint win,
char *errorstr;
GLboolean useBGR;
char *system = NULL;
+ GLuint pixFmt, colDepth = 16;
+ GLint redBits, greenBits, blueBits, alphaBits;
if (MESA_VERBOSE & VERBOSE_DRIVER) {
fprintf(stderr, "fxmesa: fxMesaCreateContext() Start\n");
@@ -295,6 +297,9 @@ fxMesaCreateContext(GLuint win,
i = 0;
while (attribList[i] != FXMESA_NONE) {
switch (attribList[i]) {
+ case FXMESA_COLORDEPTH:
+ colDepth = attribList[++i];
+ break;
case FXMESA_DOUBLEBUFFER:
doubleBuffer = GL_TRUE;
break;
@@ -379,12 +384,42 @@ fxMesaCreateContext(GLuint win,
fxMesa->board = glbCurrentBoard;
- fxMesa->glideContext = FX_grSstWinOpen((FxU32) win, res, ref,
+ switch (fxMesa->colDepth = colDepth) {
+ case 15:
+ redBits = 5;
+ greenBits = 5;
+ blueBits = 5;
+ alphaBits = 1;
+ pixFmt = 4; /* GR_PIXFMT_ARGB_1555 */
+ break;
+ case 16:
+ redBits = 5;
+ greenBits = 6;
+ blueBits = 5;
+ alphaBits = 0;
+ pixFmt = 3; /* GR_PIXFMT_ARGB_565 */
+ break;
+ case 32:
+ redBits = 8;
+ greenBits = 8;
+ blueBits = 8;
+ alphaBits = 8;
+ pixFmt = 5; /* GR_PIXFMT_ARGB_8888 */
+ break;
+ default:
+ errorstr = "pixelFormat";
+ goto errorhandler;
+ }
+
+
+ fxMesa->glideContext = FX_grSstWinOpen(&glbHWConfig.SSTs[glbCurrentBoard],
+ (FxU32)win, res, ref,
#ifdef FXMESA_USE_ARGB
GR_COLORFORMAT_ARGB,
#else
GR_COLORFORMAT_ABGR,
#endif
+ pixFmt,
GR_ORIGIN_LOWER_LEFT, 2, aux);
if (!fxMesa->glideContext) {
errorstr = "grSstWinOpen";
@@ -497,7 +532,7 @@ fxMesaCreateContext(GLuint win,
fxMesa->glVis = _mesa_create_visual(GL_TRUE, /* RGB mode */
doubleBuffer, GL_FALSE, /* stereo */
- 5, 6, 5, 0, /* RGBA bits */
+ redBits, greenBits, blueBits, alphaBits, /* RGBA bits */
0, /* index bits */
depthSize, /* depth_size */
stencilSize, /* stencil_size */
diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c
index f20b1147f8..81d3754e42 100644
--- a/src/mesa/drivers/glide/fxdd.c
+++ b/src/mesa/drivers/glide/fxdd.c
@@ -1,4 +1,8 @@
-/* $Id: fxdd.c,v 1.97 2003/06/16 14:30:57 brianp Exp $ */
+/* Hack alert:
+ * fxDDReadPixels888 does not convert 8A8R8G8B into 5R5G5B
+ */
+
+/* $Id: fxdd.c,v 1.98 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -66,6 +70,14 @@ GLubyte FX_PixelToR[0x10000];
GLubyte FX_PixelToG[0x10000];
GLubyte FX_PixelToB[0x10000];
+/* lookup table for scaling 5 bit colors up to 8 bits */
+GLuint FX_rgb_scale_5[32] = {
+ 0, 8, 16, 25, 33, 41, 49, 58,
+ 66, 74, 82, 90, 99, 107, 115, 123,
+ 132, 140, 148, 156, 165, 173, 181, 189,
+ 197, 206, 214, 222, 230, 239, 247, 255
+};
+
/*
* Initialize the FX_PixelTo{RGB} arrays.
@@ -89,9 +101,10 @@ fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder)
g = (pixel & 0x07E0) >> 3;
b = (pixel & 0x001F) << 3;
}
- r = r * 255 / 0xF8; /* fill in low-order bits */
- g = g * 255 / 0xFC;
- b = b * 255 / 0xF8;
+ /* fill in low-order bits with proper rounding */
+ r = (GLuint)(((double)r * 255. / 0xF8) + 0.5);
+ g = (GLuint)(((double)g * 255. / 0xFC) + 0.5);
+ b = (GLuint)(((double)b * 255. / 0xF8) + 0.5);
FX_PixelToR[pixel] = r;
FX_PixelToG[pixel] = g;
FX_PixelToB[pixel] = b;
@@ -581,6 +594,190 @@ fxDDReadPixels(GLcontext * ctx, GLint x, GLint y,
}
}
+static void fxDDReadPixels555 (GLcontext * ctx,
+ GLint x, GLint y,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type,
+ const struct gl_pixelstore_attrib *packing,
+ GLvoid *dstImage)
+{
+ if (ctx->_ImageTransferState) {
+ _swrast_ReadPixels(ctx, x, y, width, height, format, type,
+ packing, dstImage);
+ return;
+ }
+ else {
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GrLfbInfo_t info;
+
+ BEGIN_BOARD_LOCK();
+ if (grLfbLock(GR_LFB_READ_ONLY,
+ fxMesa->currentFB,
+ GR_LFBWRITEMODE_ANY,
+ GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
+ const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
+ const GLushort *src = (const GLushort *) info.lfbPtr
+ + (winY - y) * srcStride + (winX + x);
+ GLubyte *dst = (GLubyte *) _mesa_image_address(packing, dstImage,
+ width, height, format,
+ type, 0, 0, 0);
+ GLint dstStride =
+ _mesa_image_row_stride(packing, width, format, type);
+
+ if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {
+ /* convert 5R5G5B into 8R8G8B */
+ GLint row, col;
+ const GLint halfWidth = width >> 1;
+ const GLint extraPixel = (width & 1);
+ for (row = 0; row < height; row++) {
+ GLubyte *d = dst;
+ for (col = 0; col < halfWidth; col++) {
+ const GLuint pixel = ((const GLuint *) src)[col];
+ *d++ = FX_rgb_scale_5[ pixel & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
+ }
+ if (extraPixel) {
+ GLushort pixel = src[width - 1];
+ *d++ = FX_rgb_scale_5[ pixel & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ }
+ dst += dstStride;
+ src -= srcStride;
+ }
+ }
+ else if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
+ /* convert 5R6G5B into 8R8G8B8A */
+ GLint row, col;
+ const GLint halfWidth = width >> 1;
+ const GLint extraPixel = (width & 1);
+ for (row = 0; row < height; row++) {
+ GLubyte *d = dst;
+ for (col = 0; col < halfWidth; col++) {
+ const GLuint pixel = ((const GLuint *) src)[col];
+ *d++ = FX_rgb_scale_5[ pixel & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ *d++ = (pixel & 0x8000) ? 255 : 0;
+ *d++ = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
+ *d++ = (pixel & 0x80000000) ? 255 : 0;
+ }
+ if (extraPixel) {
+ const GLushort pixel = src[width - 1];
+ *d++ = FX_rgb_scale_5[ pixel & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ *d++ = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ *d++ = (pixel & 0x8000) ? 255 : 0;
+ }
+ dst += dstStride;
+ src -= srcStride;
+ }
+ }
+ else if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
+ /* directly memcpy 5R5G5B pixels into client's buffer */
+ const GLint widthInBytes = width * 2;
+ GLint row;
+ for (row = 0; row < height; row++) {
+ MEMCPY(dst, src, widthInBytes);
+ dst += dstStride;
+ src -= srcStride;
+ }
+ }
+ else {
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ END_BOARD_LOCK();
+ _swrast_ReadPixels(ctx, x, y, width, height, format, type,
+ packing, dstImage);
+ return;
+ }
+
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ }
+ END_BOARD_LOCK();
+ }
+}
+
+static void fxDDReadPixels888 (GLcontext * ctx,
+ GLint x, GLint y,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type,
+ const struct gl_pixelstore_attrib *packing,
+ GLvoid *dstImage)
+{
+ if (ctx->_ImageTransferState) {
+ _swrast_ReadPixels(ctx, x, y, width, height, format, type,
+ packing, dstImage);
+ return;
+ }
+ else {
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GrLfbInfo_t info;
+
+ BEGIN_BOARD_LOCK();
+ if (grLfbLock(GR_LFB_READ_ONLY,
+ fxMesa->currentFB,
+ GR_LFBWRITEMODE_ANY,
+ GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
+ const GLint srcStride = info.strideInBytes / 4; /* stride in GLuints */
+ const GLuint *src = (const GLuint *) info.lfbPtr
+ + (winY - y) * srcStride + (winX + x);
+ GLubyte *dst = (GLubyte *) _mesa_image_address(packing, dstImage,
+ width, height, format,
+ type, 0, 0, 0);
+ GLint dstStride =
+ _mesa_image_row_stride(packing, width, format, type);
+
+ if (format == GL_RGB && type == GL_UNSIGNED_BYTE) {
+ /* convert 8A8R8G8B into 8R8G8B */
+ GLint row, col;
+ for (row = 0; row < height; row++) {
+ GLubyte *d = dst;
+ for (col = 0; col < width; col++) {
+ const GLuint pixel = ((const GLuint *) src)[col];
+ *d++ = pixel >> 16;
+ *d++ = pixel >> 8;
+ *d++ = pixel;
+ }
+ dst += dstStride;
+ src -= srcStride;
+ }
+ }
+ else if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
+ /* directly memcpy 8A8R8G8B pixels into client's buffer */
+ const GLint widthInBytes = width * 4;
+ GLint row;
+ for (row = 0; row < height; row++) {
+ MEMCPY(dst, src, widthInBytes);
+ dst += dstStride;
+ src -= srcStride;
+ }
+ }
+ else if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
+ /* convert 8A8R8G8B into 5R5G5B */
+ }
+ else {
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ END_BOARD_LOCK();
+ _swrast_ReadPixels(ctx, x, y, width, height, format, type,
+ packing, dstImage);
+ return;
+ }
+
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ }
+ END_BOARD_LOCK();
+ }
+}
static void
@@ -804,7 +1001,7 @@ fxDDInitExtensions(GLcontext * ctx)
{
fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
- _mesa_add_extension(ctx, GL_TRUE, "3DFX_set_global_palette", 0);
+ /*_mesa_add_extension(ctx, GL_TRUE, "3DFX_set_global_palette", 0);*/
_mesa_enable_extension(ctx, "GL_EXT_point_parameters");
_mesa_enable_extension(ctx, "GL_EXT_paletted_texture");
_mesa_enable_extension(ctx, "GL_EXT_texture_lod_bias");
@@ -1009,7 +1206,20 @@ fxSetupDDPointers(GLcontext * ctx)
ctx->Driver.Bitmap = fxDDDrawBitmap;
ctx->Driver.CopyPixels = _swrast_CopyPixels;
ctx->Driver.DrawPixels = _swrast_DrawPixels;
- ctx->Driver.ReadPixels = fxDDReadPixels;
+ {
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ switch (fxMesa->colDepth) {
+ case 15:
+ ctx->Driver.ReadPixels = fxDDReadPixels555;
+ break;
+ case 16:
+ ctx->Driver.ReadPixels = fxDDReadPixels;
+ break;
+ case 32:
+ ctx->Driver.ReadPixels = fxDDReadPixels888;
+ break;
+ }
+ }
ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
ctx->Driver.Finish = fxDDFinish;
ctx->Driver.Flush = NULL;
diff --git a/src/mesa/drivers/glide/fxddspan.c b/src/mesa/drivers/glide/fxddspan.c
index 04d832d8d9..e106ce291e 100644
--- a/src/mesa/drivers/glide/fxddspan.c
+++ b/src/mesa/drivers/glide/fxddspan.c
@@ -1,4 +1,9 @@
-/* $Id: fxddspan.c,v 1.22 2002/11/04 20:29:04 brianp Exp $ */
+/* Hack alert:
+ * Depth32 functions won't compile with Glide2
+ * Optimize and check endianess for `read_R8G8B8_pixels'
+ */
+
+/* $Id: fxddspan.c,v 1.23 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -42,6 +47,7 @@
#if defined(FX)
#include "fxdrv.h"
+#include "fxglidew.h"
#include "swrast/swrast.h"
#ifdef _MSC_VER
@@ -347,6 +353,69 @@ read_R5G6B5_span(const GLcontext * ctx,
END_BOARD_LOCK();
}
+/*
+ * Read a span of 15-bit RGB pixels. Note, we don't worry about cliprects
+ * since OpenGL says obscured pixels have undefined values.
+ */
+static void read_R5G5B5_span (const GLcontext * ctx,
+ GLuint n,
+ GLint x, GLint y,
+ GLubyte rgba[][4])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GrLfbInfo_t info;
+ BEGIN_BOARD_LOCK();
+ if (grLfbLock(GR_LFB_READ_ONLY,
+ fxMesa->currentFB,
+ GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
+ const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
+ const GLushort *data16 = (const GLushort *) info.lfbPtr
+ + (winY - y) * srcStride + (winX + x);
+ const GLuint *data32 = (const GLuint *) data16;
+ GLuint i, j;
+ GLuint extraPixel = (n & 1);
+ n -= extraPixel;
+ for (i = j = 0; i < n; i += 2, j++) {
+ GLuint pixel = data32[j];
+ rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
+ rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0;
+ rgba[i + 1][RCOMP] = FX_rgb_scale_5[(pixel >> 16) & 0x1f];
+ rgba[i + 1][GCOMP] = FX_rgb_scale_5[(pixel >> 21) & 0x1f];
+ rgba[i + 1][BCOMP] = FX_rgb_scale_5[(pixel >> 26) & 0x1f];
+ rgba[i + 1][ACOMP] = (pixel & 0x80000000) ? 255 : 0;
+ }
+ if (extraPixel) {
+ GLushort pixel = data16[n];
+ rgba[n][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
+ rgba[n][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ rgba[n][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ rgba[n][ACOMP] = (pixel & 0x8000) ? 255 : 0;
+ }
+
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ }
+ END_BOARD_LOCK();
+}
+
+/*
+ * Read a span of 32-bit RGB pixels. Note, we don't worry about cliprects
+ * since OpenGL says obscured pixels have undefined values.
+ */
+static void read_R8G8B8_span (const GLcontext * ctx,
+ GLuint n,
+ GLint x, GLint y,
+ GLubyte rgba[][4])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ BEGIN_BOARD_LOCK();
+ FX_grLfbReadRegion(fxMesa->currentFB, x, fxMesa->height - 1 - y, n, 1, n * 4, rgba);
+ END_BOARD_LOCK();
+}
+
/************************************************************************/
/***** Pixel functions *****/
@@ -424,6 +493,68 @@ read_R5G6B5_pixels(const GLcontext * ctx,
}
+static void read_R5G5B5_pixels (const GLcontext * ctx,
+ GLuint n,
+ const GLint x[], const GLint y[],
+ GLubyte rgba[][4],
+ const GLubyte mask[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GrLfbInfo_t info;
+ BEGIN_BOARD_LOCK();
+ if (grLfbLock(GR_LFB_READ_ONLY,
+ fxMesa->currentFB,
+ GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
+ const GLint srcStride = info.strideInBytes / 2; /* stride in GLushorts */
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
+ GLuint i;
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ const GLushort *data16 = (const GLushort *) info.lfbPtr
+ + (winY - y[i]) * srcStride + (winX + x[i]);
+ const GLushort pixel = *data16;
+ rgba[i][RCOMP] = FX_rgb_scale_5[ pixel & 0x1f];
+ rgba[i][GCOMP] = FX_rgb_scale_5[(pixel >> 5) & 0x1f];
+ rgba[i][BCOMP] = FX_rgb_scale_5[(pixel >> 10) & 0x1f];
+ rgba[i][ACOMP] = (pixel & 0x8000) ? 255 : 0;
+ }
+ }
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ }
+ END_BOARD_LOCK();
+}
+
+
+static void
+read_R8G8B8_pixels(const GLcontext * ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLubyte rgba[][4], const GLubyte mask[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GrLfbInfo_t info;
+ BEGIN_BOARD_LOCK();
+ if (grLfbLock(GR_LFB_READ_ONLY,
+ fxMesa->currentFB,
+ GR_LFBWRITEMODE_ANY, GR_ORIGIN_UPPER_LEFT, FXFALSE, &info)) {
+ const GLint srcStride = info.strideInBytes / 4; /* stride in GLuints */
+ const GLint winX = 0;
+ const GLint winY = fxMesa->height - 1;
+ GLuint i;
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ const GLuint *data32 = (const GLuint *) info.lfbPtr
+ + (winY - y[i]) * srcStride + (winX + x[i]);
+ const GLuint pixel = *data32;
+ *(GLuint *)&rgba[i][0] = pixel;
+ }
+ }
+ grLfbUnlock(GR_LFB_READ_ONLY, fxMesa->currentFB);
+ }
+ END_BOARD_LOCK();
+}
+
+
/************************************************************************/
/***** Depth functions *****/
@@ -465,6 +596,35 @@ fxDDWriteDepthSpan(GLcontext * ctx,
void
+fxDDWriteDepth32Span(GLcontext * ctx,
+ GLuint n, GLint x, GLint y, const GLdepth depth[],
+ const GLubyte mask[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GLint bottom = fxMesa->height - 1;
+
+ if (MESA_VERBOSE & VERBOSE_DRIVER) {
+ fprintf(stderr, "fxmesa: fxDDWriteDepth32Span(...)\n");
+ }
+
+
+ if (mask) {
+ GLint i;
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x + i, bottom - y,
+ GR_LFBWRITEMODE_Z32, 1, 1, 0, (void *) &depth[i]);
+ }
+ }
+ }
+ else {
+ writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, x, bottom - y,
+ GR_LFBWRITEMODE_Z32, n, 1, 0, (void *) depth);
+ }
+}
+
+
+void
fxDDReadDepthSpan(GLcontext * ctx,
GLuint n, GLint x, GLint y, GLdepth depth[])
{
@@ -484,6 +644,21 @@ fxDDReadDepthSpan(GLcontext * ctx,
}
+void
+fxDDReadDepth32Span(GLcontext * ctx,
+ GLuint n, GLint x, GLint y, GLdepth depth[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GLint bottom = fxMesa->height - 1;
+
+ if (MESA_VERBOSE & VERBOSE_DRIVER) {
+ fprintf(stderr, "fxmesa: fxDDReadDepth32Span(...)\n");
+ }
+
+ FX_grLfbReadRegion(GR_BUFFER_AUXBUFFER, x, bottom - y, n, 1, 0, depth);
+}
+
+
void
fxDDWriteDepthPixels(GLcontext * ctx,
@@ -511,6 +686,30 @@ fxDDWriteDepthPixels(GLcontext * ctx,
void
+fxDDWriteDepth32Pixels(GLcontext * ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLdepth depth[], const GLubyte mask[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GLint bottom = fxMesa->height - 1;
+ GLuint i;
+
+ if (MESA_VERBOSE & VERBOSE_DRIVER) {
+ fprintf(stderr, "fxmesa: fxDDWriteDepth32Pixels(...)\n");
+ }
+
+ for (i = 0; i < n; i++) {
+ if (mask[i]) {
+ int xpos = x[i];
+ int ypos = bottom - y[i];
+ writeRegionClipped(fxMesa, GR_BUFFER_AUXBUFFER, xpos, ypos,
+ GR_LFBWRITEMODE_Z32, 1, 1, 0, (void *) &depth[i]);
+ }
+ }
+}
+
+
+void
fxDDReadDepthPixels(GLcontext * ctx, GLuint n,
const GLint x[], const GLint y[], GLdepth depth[])
{
@@ -532,6 +731,26 @@ fxDDReadDepthPixels(GLcontext * ctx, GLuint n,
}
+void
+fxDDReadDepth32Pixels(GLcontext * ctx, GLuint n,
+ const GLint x[], const GLint y[], GLdepth depth[])
+{
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ GLint bottom = fxMesa->height - 1;
+ GLuint i;
+
+ if (MESA_VERBOSE & VERBOSE_DRIVER) {
+ fprintf(stderr, "fxmesa: fxDDReadDepth32Pixels(...)\n");
+ }
+
+ for (i = 0; i < n; i++) {
+ int xpos = x[i];
+ int ypos = bottom - y[i];
+ FX_grLfbReadRegion(GR_BUFFER_AUXBUFFER, xpos, ypos, 1, 1, 0, &depth[i]);
+ }
+}
+
+
/* Set the buffer used for reading */
/* XXX support for separate read/draw buffers hasn't been tested */
@@ -573,14 +792,36 @@ fxSetupDDSpanPointers(GLcontext * ctx)
swdd->WriteRGBAPixels = fxDDWriteRGBAPixels;
swdd->WriteMonoRGBAPixels = fxDDWriteMonoRGBAPixels;
- swdd->WriteDepthSpan = fxDDWriteDepthSpan;
- swdd->WriteDepthPixels = fxDDWriteDepthPixels;
- swdd->ReadDepthSpan = fxDDReadDepthSpan;
- swdd->ReadDepthPixels = fxDDReadDepthPixels;
-
/* swdd->ReadRGBASpan =fxDDReadRGBASpan; */
- swdd->ReadRGBASpan = read_R5G6B5_span;
- swdd->ReadRGBAPixels = read_R5G6B5_pixels;
+ {
+ fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx;
+ switch (fxMesa->colDepth) {
+ case 15:
+ swdd->ReadRGBASpan = read_R5G5B5_span;
+ swdd->ReadRGBAPixels = read_R5G5B5_pixels;
+ swdd->WriteDepthSpan = fxDDWriteDepthSpan;
+ swdd->WriteDepthPixels = fxDDWriteDepthPixels;
+ swdd->ReadDepthSpan = fxDDReadDepthSpan;
+ swdd->ReadDepthPixels = fxDDReadDepthPixels;
+ break;
+ case 16:
+ swdd->ReadRGBASpan = read_R5G6B5_span;
+ swdd->ReadRGBAPixels = read_R5G6B5_pixels;
+ swdd->WriteDepthSpan = fxDDWriteDepthSpan;
+ swdd->WriteDepthPixels = fxDDWriteDepthPixels;
+ swdd->ReadDepthSpan = fxDDReadDepthSpan;
+ swdd->ReadDepthPixels = fxDDReadDepthPixels;
+ break;
+ case 32:
+ swdd->ReadRGBASpan = read_R8G8B8_span;
+ swdd->ReadRGBAPixels = read_R8G8B8_pixels;
+ swdd->WriteDepthSpan = fxDDWriteDepth32Span;
+ swdd->WriteDepthPixels = fxDDWriteDepth32Pixels;
+ swdd->ReadDepthSpan = fxDDReadDepth32Span;
+ swdd->ReadDepthPixels = fxDDReadDepth32Pixels;
+ break;
+ }
+ }
}
diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h
index c7e1b5aa7a..56d76634fb 100644
--- a/src/mesa/drivers/glide/fxdrv.h
+++ b/src/mesa/drivers/glide/fxdrv.h
@@ -1,4 +1,4 @@
-/* $Id: fxdrv.h,v 1.56 2003/01/08 21:32:33 brianp Exp $ */
+/* $Id: fxdrv.h,v 1.57 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -334,6 +334,8 @@ extern GLubyte FX_PixelToR[0x10000];
extern GLubyte FX_PixelToG[0x10000];
extern GLubyte FX_PixelToB[0x10000];
+/* lookup table for scaling 5 bit colors up to 8 bits */
+GLuint FX_rgb_scale_5[32];
typedef void (*fx_tri_func) (fxMesaContext, GrVertex *, GrVertex *, GrVertex *);
typedef void (*fx_line_func) (fxMesaContext, GrVertex *, GrVertex *);
@@ -440,6 +442,8 @@ struct tfxMesaContext
int clipMaxX;
int clipMinY;
int clipMaxY;
+
+ int colDepth;
};
diff --git a/src/mesa/drivers/glide/fxglidew.c b/src/mesa/drivers/glide/fxglidew.c
index e45dfabcec..950dfdbc86 100644
--- a/src/mesa/drivers/glide/fxglidew.c
+++ b/src/mesa/drivers/glide/fxglidew.c
@@ -1,4 +1,4 @@
-/* $Id: fxglidew.c,v 1.19 2001/09/23 16:50:01 brianp Exp $ */
+/* $Id: fxglidew.c,v 1.20 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -386,6 +386,13 @@ FX_grSstQueryHardware(GrHwConfiguration * config)
grGet(GR_REVISION_TMU, 4, &result);
config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRev = result;
}
+
+ {
+ const char *extension = grGetString(GR_EXTENSION);
+ if (strstr(extension, " PIXEXT ")) {
+ config->SSTs[i].sstBoard.VoodooConfig.gExt.grSstWinOpen = grGetProcAddress("grSstWinOpenExt");
+ }
+ }
}
END_BOARD_LOCK();
return 1;
@@ -428,15 +435,25 @@ FX_grSstQueryHardware(GrHwConfiguration * c)
/* It appears to me that this function is needed either way. */
FX_GrContext_t
-FX_grSstWinOpen(FxU32 hWnd,
+FX_grSstWinOpen(struct SstCard_St *c,
+ FxU32 hWnd,
GrScreenResolution_t screen_resolution,
GrScreenRefresh_t refresh_rate,
GrColorFormat_t color_format,
+ GrPixelFormat_t pixel_format,
GrOriginLocation_t origin_location,
int nColBuffers, int nAuxBuffers)
{
FX_GrContext_t i;
BEGIN_BOARD_LOCK();
+ if ((c->type == GR_SSTTYPE_VOODOO) && c->sstBoard.VoodooConfig.gExt.grSstWinOpen) {
+ i = c->sstBoard.VoodooConfig.gExt.grSstWinOpen(hWnd,
+ screen_resolution,
+ refresh_rate,
+ color_format, origin_location,
+ pixel_format,
+ nColBuffers, nAuxBuffers);
+ } else
i = grSstWinOpen(hWnd,
screen_resolution,
refresh_rate,
diff --git a/src/mesa/drivers/glide/fxglidew.h b/src/mesa/drivers/glide/fxglidew.h
index 1efe150140..1ef3451d92 100644
--- a/src/mesa/drivers/glide/fxglidew.h
+++ b/src/mesa/drivers/glide/fxglidew.h
@@ -1,4 +1,4 @@
-/* $Id: fxglidew.h,v 1.13 2001/09/23 16:50:01 brianp Exp $ */
+/* $Id: fxglidew.h,v 1.14 2003/07/17 14:50:12 brianp Exp $ */
/*
* Mesa 3-D graphics library
@@ -42,7 +42,9 @@
*/
#if !defined(FX_GLIDE3)
typedef FxU32 FX_GrContext_t; /* Not used in Glide2 */
+typedef FxU32 GrPixelFormat_t;
#else
+#include <g3ext.h>
typedef GrContext_t FX_GrContext_t;
#endif
@@ -117,6 +119,9 @@ typedef struct GrVoodooConfig_St
int fbiRev; /* Rev of Pixelfx chip */
int nTexelfx; /* How many texelFX chips are there? */
FxBool sliDetect; /* Is it a scan-line interleaved board? */
+ struct { /* Glide extensions */
+ GrProc grSstWinOpen;
+ } gExt;
GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */
}
GrVoodooConfig_t;
@@ -140,7 +145,7 @@ GrAT3DConfig_t;
typedef struct
{
int num_sst; /* # of HW units in the system */
- struct
+ struct SstCard_St
{
GrSstType type; /* Which hardware is it? */
union SstBoard_u
@@ -474,10 +479,12 @@ extern void FX_grGammaCorrectionValue(float val);
#endif
-extern FX_GrContext_t FX_grSstWinOpen(FxU32 hWnd,
+extern FX_GrContext_t FX_grSstWinOpen(struct SstCard_St *c,
+ FxU32 hWnd,
GrScreenResolution_t screen_resolution,
GrScreenRefresh_t refresh_rate,
GrColorFormat_t color_format,
+ GrPixelFormat_t pixel_format,
GrOriginLocation_t origin_location,
int nColBuffers, int nAuxBuffers);