more DOS updates from Daniel Borca

This commit is contained in:
Brian Paul
2003-07-17 14:50:11 +00:00
parent 6dc8557500
commit c19cbb58cd
8 changed files with 541 additions and 23 deletions

View File

@@ -51,6 +51,7 @@ extern "C" {
#define FXMESA_DEPTH_SIZE 12 /* followed by an integer */ #define FXMESA_DEPTH_SIZE 12 /* followed by an integer */
#define FXMESA_STENCIL_SIZE 13 /* followed by an integer */ #define FXMESA_STENCIL_SIZE 13 /* followed by an integer */
#define FXMESA_ACCUM_SIZE 14 /* followed by an integer */ #define FXMESA_ACCUM_SIZE 14 /* followed by an integer */
#define FXMESA_COLORDEPTH 20 /* followed by an integer */

View File

@@ -1452,6 +1452,8 @@ DMesaVisual DMesaCreateVisual (GLint width,
if (stencilSize > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = stencilSize; } 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 (accumSize > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = accumSize; }
if (alphaFlag) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = 1; } 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; fx_attrib[i] = FXMESA_NONE;
return (DMesaVisual)fxMesaCreateBestContext(-1, width, height, fx_attrib); return (DMesaVisual)fxMesaCreateBestContext(-1, width, height, fx_attrib);
@@ -1534,6 +1536,7 @@ DMesaContext DMesaCreateContext (DMesaVisual visual,
_mesa_enable_sw_extensions((GLcontext *)c); _mesa_enable_sw_extensions((GLcontext *)c);
_mesa_enable_1_3_extensions((GLcontext *)c); _mesa_enable_1_3_extensions((GLcontext *)c);
_mesa_enable_1_4_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. */ /* you probably have to do a bunch of other initializations here. */
c->visual = visual; c->visual = visual;

View File

@@ -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 * Mesa 3-D graphics library
@@ -283,6 +283,8 @@ fxMesaCreateContext(GLuint win,
char *errorstr; char *errorstr;
GLboolean useBGR; GLboolean useBGR;
char *system = NULL; char *system = NULL;
GLuint pixFmt, colDepth = 16;
GLint redBits, greenBits, blueBits, alphaBits;
if (MESA_VERBOSE & VERBOSE_DRIVER) { if (MESA_VERBOSE & VERBOSE_DRIVER) {
fprintf(stderr, "fxmesa: fxMesaCreateContext() Start\n"); fprintf(stderr, "fxmesa: fxMesaCreateContext() Start\n");
@@ -295,6 +297,9 @@ fxMesaCreateContext(GLuint win,
i = 0; i = 0;
while (attribList[i] != FXMESA_NONE) { while (attribList[i] != FXMESA_NONE) {
switch (attribList[i]) { switch (attribList[i]) {
case FXMESA_COLORDEPTH:
colDepth = attribList[++i];
break;
case FXMESA_DOUBLEBUFFER: case FXMESA_DOUBLEBUFFER:
doubleBuffer = GL_TRUE; doubleBuffer = GL_TRUE;
break; break;
@@ -379,12 +384,42 @@ fxMesaCreateContext(GLuint win,
fxMesa->board = glbCurrentBoard; 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 #ifdef FXMESA_USE_ARGB
GR_COLORFORMAT_ARGB, GR_COLORFORMAT_ARGB,
#else #else
GR_COLORFORMAT_ABGR, GR_COLORFORMAT_ABGR,
#endif #endif
pixFmt,
GR_ORIGIN_LOWER_LEFT, 2, aux); GR_ORIGIN_LOWER_LEFT, 2, aux);
if (!fxMesa->glideContext) { if (!fxMesa->glideContext) {
errorstr = "grSstWinOpen"; errorstr = "grSstWinOpen";
@@ -497,7 +532,7 @@ fxMesaCreateContext(GLuint win,
fxMesa->glVis = _mesa_create_visual(GL_TRUE, /* RGB mode */ fxMesa->glVis = _mesa_create_visual(GL_TRUE, /* RGB mode */
doubleBuffer, GL_FALSE, /* stereo */ doubleBuffer, GL_FALSE, /* stereo */
5, 6, 5, 0, /* RGBA bits */ redBits, greenBits, blueBits, alphaBits, /* RGBA bits */
0, /* index bits */ 0, /* index bits */
depthSize, /* depth_size */ depthSize, /* depth_size */
stencilSize, /* stencil_size */ stencilSize, /* stencil_size */

View File

@@ -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 * Mesa 3-D graphics library
@@ -66,6 +70,14 @@ GLubyte FX_PixelToR[0x10000];
GLubyte FX_PixelToG[0x10000]; GLubyte FX_PixelToG[0x10000];
GLubyte FX_PixelToB[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. * Initialize the FX_PixelTo{RGB} arrays.
@@ -89,9 +101,10 @@ fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder)
g = (pixel & 0x07E0) >> 3; g = (pixel & 0x07E0) >> 3;
b = (pixel & 0x001F) << 3; b = (pixel & 0x001F) << 3;
} }
r = r * 255 / 0xF8; /* fill in low-order bits */ /* fill in low-order bits with proper rounding */
g = g * 255 / 0xFC; r = (GLuint)(((double)r * 255. / 0xF8) + 0.5);
b = b * 255 / 0xF8; g = (GLuint)(((double)g * 255. / 0xFC) + 0.5);
b = (GLuint)(((double)b * 255. / 0xF8) + 0.5);
FX_PixelToR[pixel] = r; FX_PixelToR[pixel] = r;
FX_PixelToG[pixel] = g; FX_PixelToG[pixel] = g;
FX_PixelToB[pixel] = b; 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 static void
@@ -804,7 +1001,7 @@ fxDDInitExtensions(GLcontext * ctx)
{ {
fxMesaContext fxMesa = (fxMesaContext) ctx->DriverCtx; 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_point_parameters");
_mesa_enable_extension(ctx, "GL_EXT_paletted_texture"); _mesa_enable_extension(ctx, "GL_EXT_paletted_texture");
_mesa_enable_extension(ctx, "GL_EXT_texture_lod_bias"); _mesa_enable_extension(ctx, "GL_EXT_texture_lod_bias");
@@ -1009,7 +1206,20 @@ fxSetupDDPointers(GLcontext * ctx)
ctx->Driver.Bitmap = fxDDDrawBitmap; ctx->Driver.Bitmap = fxDDDrawBitmap;
ctx->Driver.CopyPixels = _swrast_CopyPixels; ctx->Driver.CopyPixels = _swrast_CopyPixels;
ctx->Driver.DrawPixels = _swrast_DrawPixels; 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.ResizeBuffers = _swrast_alloc_buffers;
ctx->Driver.Finish = fxDDFinish; ctx->Driver.Finish = fxDDFinish;
ctx->Driver.Flush = NULL; ctx->Driver.Flush = NULL;

View File

@@ -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 * Mesa 3-D graphics library
@@ -42,6 +47,7 @@
#if defined(FX) #if defined(FX)
#include "fxdrv.h" #include "fxdrv.h"
#include "fxglidew.h"
#include "swrast/swrast.h" #include "swrast/swrast.h"
#ifdef _MSC_VER #ifdef _MSC_VER
@@ -347,6 +353,69 @@ read_R5G6B5_span(const GLcontext * ctx,
END_BOARD_LOCK(); 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 *****/ /***** 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 *****/ /***** Depth functions *****/
@@ -464,6 +595,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 void
fxDDReadDepthSpan(GLcontext * ctx, fxDDReadDepthSpan(GLcontext * ctx,
GLuint n, GLint x, GLint y, GLdepth depth[]) 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 void
fxDDWriteDepthPixels(GLcontext * ctx, fxDDWriteDepthPixels(GLcontext * ctx,
@@ -510,6 +685,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 void
fxDDReadDepthPixels(GLcontext * ctx, GLuint n, fxDDReadDepthPixels(GLcontext * ctx, GLuint n,
const GLint x[], const GLint y[], GLdepth depth[]) 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 */ /* Set the buffer used for reading */
/* XXX support for separate read/draw buffers hasn't been tested */ /* XXX support for separate read/draw buffers hasn't been tested */
@@ -573,14 +792,36 @@ fxSetupDDSpanPointers(GLcontext * ctx)
swdd->WriteRGBAPixels = fxDDWriteRGBAPixels; swdd->WriteRGBAPixels = fxDDWriteRGBAPixels;
swdd->WriteMonoRGBAPixels = fxDDWriteMonoRGBAPixels; swdd->WriteMonoRGBAPixels = fxDDWriteMonoRGBAPixels;
swdd->WriteDepthSpan = fxDDWriteDepthSpan;
swdd->WriteDepthPixels = fxDDWriteDepthPixels;
swdd->ReadDepthSpan = fxDDReadDepthSpan;
swdd->ReadDepthPixels = fxDDReadDepthPixels;
/* swdd->ReadRGBASpan =fxDDReadRGBASpan; */ /* 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;
}
}
} }

View File

@@ -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 * Mesa 3-D graphics library
@@ -334,6 +334,8 @@ extern GLubyte FX_PixelToR[0x10000];
extern GLubyte FX_PixelToG[0x10000]; extern GLubyte FX_PixelToG[0x10000];
extern GLubyte FX_PixelToB[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_tri_func) (fxMesaContext, GrVertex *, GrVertex *, GrVertex *);
typedef void (*fx_line_func) (fxMesaContext, GrVertex *, GrVertex *); typedef void (*fx_line_func) (fxMesaContext, GrVertex *, GrVertex *);
@@ -440,6 +442,8 @@ struct tfxMesaContext
int clipMaxX; int clipMaxX;
int clipMinY; int clipMinY;
int clipMaxY; int clipMaxY;
int colDepth;
}; };

View File

@@ -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 * Mesa 3-D graphics library
@@ -386,6 +386,13 @@ FX_grSstQueryHardware(GrHwConfiguration * config)
grGet(GR_REVISION_TMU, 4, &result); grGet(GR_REVISION_TMU, 4, &result);
config->SSTs[i].sstBoard.VoodooConfig.tmuConfig[j].tmuRev = 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(); END_BOARD_LOCK();
return 1; return 1;
@@ -428,15 +435,25 @@ FX_grSstQueryHardware(GrHwConfiguration * c)
/* It appears to me that this function is needed either way. */ /* It appears to me that this function is needed either way. */
FX_GrContext_t FX_GrContext_t
FX_grSstWinOpen(FxU32 hWnd, FX_grSstWinOpen(struct SstCard_St *c,
FxU32 hWnd,
GrScreenResolution_t screen_resolution, GrScreenResolution_t screen_resolution,
GrScreenRefresh_t refresh_rate, GrScreenRefresh_t refresh_rate,
GrColorFormat_t color_format, GrColorFormat_t color_format,
GrPixelFormat_t pixel_format,
GrOriginLocation_t origin_location, GrOriginLocation_t origin_location,
int nColBuffers, int nAuxBuffers) int nColBuffers, int nAuxBuffers)
{ {
FX_GrContext_t i; FX_GrContext_t i;
BEGIN_BOARD_LOCK(); 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, i = grSstWinOpen(hWnd,
screen_resolution, screen_resolution,
refresh_rate, refresh_rate,

View File

@@ -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 * Mesa 3-D graphics library
@@ -42,7 +42,9 @@
*/ */
#if !defined(FX_GLIDE3) #if !defined(FX_GLIDE3)
typedef FxU32 FX_GrContext_t; /* Not used in Glide2 */ typedef FxU32 FX_GrContext_t; /* Not used in Glide2 */
typedef FxU32 GrPixelFormat_t;
#else #else
#include <g3ext.h>
typedef GrContext_t FX_GrContext_t; typedef GrContext_t FX_GrContext_t;
#endif #endif
@@ -117,6 +119,9 @@ typedef struct GrVoodooConfig_St
int fbiRev; /* Rev of Pixelfx chip */ int fbiRev; /* Rev of Pixelfx chip */
int nTexelfx; /* How many texelFX chips are there? */ int nTexelfx; /* How many texelFX chips are there? */
FxBool sliDetect; /* Is it a scan-line interleaved board? */ 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 */ GrTMUConfig_t tmuConfig[GLIDE_NUM_TMU]; /* Configuration of the Texelfx chips */
} }
GrVoodooConfig_t; GrVoodooConfig_t;
@@ -140,7 +145,7 @@ GrAT3DConfig_t;
typedef struct typedef struct
{ {
int num_sst; /* # of HW units in the system */ int num_sst; /* # of HW units in the system */
struct struct SstCard_St
{ {
GrSstType type; /* Which hardware is it? */ GrSstType type; /* Which hardware is it? */
union SstBoard_u union SstBoard_u
@@ -474,10 +479,12 @@ extern void FX_grGammaCorrectionValue(float val);
#endif #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, GrScreenResolution_t screen_resolution,
GrScreenRefresh_t refresh_rate, GrScreenRefresh_t refresh_rate,
GrColorFormat_t color_format, GrColorFormat_t color_format,
GrPixelFormat_t pixel_format,
GrOriginLocation_t origin_location, GrOriginLocation_t origin_location,
int nColBuffers, int nAuxBuffers); int nColBuffers, int nAuxBuffers);