X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fglide%2Ffxdd.c;h=213ef2382feaad5db265bc964c147a20aaf9ef0a;hb=3a40dee3eb5151a282ce831b67427f3aa625de28;hp=30e5fe03b87c98dda0669081a2652b391d082ebb;hpb=cd643491ad57fc1d21a1638de7e7d79881ccfac1;p=mesa.git diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index 30e5fe03b87..213ef2382fe 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -40,21 +40,22 @@ #if defined(FX) -#include "image.h" -#include "mtypes.h" +#include "main/image.h" +#include "main/mtypes.h" #include "fxdrv.h" -#include "enums.h" -#include "extensions.h" -#include "macros.h" -#include "texstore.h" -#include "teximage.h" +#include "main/buffers.h" +#include "main/enums.h" +#include "main/extensions.h" +#include "main/macros.h" +#include "main/texstore.h" +#include "main/teximage.h" #include "swrast/swrast.h" #include "swrast/s_context.h" #include "swrast_setup/swrast_setup.h" #include "tnl/tnl.h" #include "tnl/t_context.h" #include "tnl/t_pipeline.h" -#include "array_cache/acache.h" +#include "vbo/vbo.h" @@ -106,14 +107,14 @@ static void fxDisableColor (fxMesaContext fxMesa) /* Return buffer size information */ static void -fxDDBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height) +fxDDGetBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height) { GET_CURRENT_CONTEXT(ctx); if (ctx && FX_CONTEXT(ctx)) { fxMesaContext fxMesa = FX_CONTEXT(ctx); if (TDFX_DEBUG & VERBOSE_DRIVER) { - fprintf(stderr, "fxDDBufferSize(...)\n"); + fprintf(stderr, "fxDDGetBufferSize(...)\n"); } *width = fxMesa->width; @@ -122,6 +123,22 @@ fxDDBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height) } +/** + * We only implement this function as a mechanism to check if the + * framebuffer size has changed (and update corresponding state). + */ +static void +fxDDViewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h) +{ + GLuint newWidth, newHeight; + GLframebuffer *buffer = ctx->WinSysDrawBuffer; + fxDDGetBufferSize( buffer, &newWidth, &newHeight ); + if (buffer->Width != newWidth || buffer->Height != newHeight) { + _mesa_resize_framebuffer(ctx, buffer, newWidth, newHeight ); + } +} + + /* Implements glClearColor() */ static void fxDDClearColor(GLcontext * ctx, const GLfloat color[4]) @@ -145,41 +162,26 @@ fxDDClearColor(GLcontext * ctx, const GLfloat color[4]) /* Clear the color and/or depth buffers */ -static void fxDDClear( GLcontext *ctx, - GLbitfield mask, GLboolean all, - GLint x, GLint y, GLint width, GLint height ) +static void fxDDClear( GLcontext *ctx, GLbitfield mask ) { fxMesaContext fxMesa = FX_CONTEXT(ctx); - GLbitfield softwareMask = mask & (DD_ACCUM_BIT); + GLbitfield softwareMask = mask & (BUFFER_BIT_ACCUM); const GLuint stencil_size = fxMesa->haveHwStencil ? ctx->Visual.stencilBits : 0; - const FxU32 clearD = (FxU32) (ctx->DepthMaxF * ctx->Depth.Clear); + const FxU32 clearD = (FxU32) (ctx->DrawBuffer->_DepthMaxF * ctx->Depth.Clear); const FxU8 clearS = (FxU8) (ctx->Stencil.Clear & 0xff); if ( TDFX_DEBUG & MESA_VERBOSE ) { - fprintf( stderr, "fxDDClear( %d, %d, %d, %d )\n", - (int) x, (int) y, (int) width, (int) height ); - } - - /* Need this check to respond to glScissor and clipping updates */ - /* should also take care of FX_NEW_COLOR_MASK, FX_NEW_STENCIL, depth? */ - if (fxMesa->new_state & FX_NEW_SCISSOR) { - fxSetupScissor(ctx); - fxMesa->new_state &= ~FX_NEW_SCISSOR; + fprintf( stderr, "fxDDClear\n"); } - /* we can't clear accum buffers */ - mask &= ~(DD_ACCUM_BIT); + /* we can't clear accum buffers nor stereo */ + mask &= ~(BUFFER_BIT_ACCUM | BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT); - /* - * As per GL spec, stencil masking should be obeyed when clearing - */ - if (mask & DD_STENCIL_BIT) { - if (!fxMesa->haveHwStencil || fxMesa->unitsState.stencilWriteMask != 0xff) { - /* Napalm seems to have trouble with stencil write masks != 0xff */ - /* do stencil clear in software */ - softwareMask |= DD_STENCIL_BIT; - mask &= ~(DD_STENCIL_BIT); - } + /* Need this check to respond to certain HW updates */ + if (fxMesa->new_state & (FX_NEW_SCISSOR | FX_NEW_COLOR_MASK)) { + fxSetupScissor(ctx); + fxSetupColorMask(ctx); + fxMesa->new_state &= ~(FX_NEW_SCISSOR | FX_NEW_COLOR_MASK); } /* @@ -189,8 +191,8 @@ static void fxDDClear( GLcontext *ctx, /* can only do color masking if running in 24/32bpp on Napalm */ if (ctx->Color.ColorMask[RCOMP] != ctx->Color.ColorMask[GCOMP] || ctx->Color.ColorMask[GCOMP] != ctx->Color.ColorMask[BCOMP]) { - softwareMask |= (mask & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT)); - mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); + softwareMask |= (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)); + mask &= ~(BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT); } } @@ -201,8 +203,8 @@ static void fxDDClear( GLcontext *ctx, * in the OGL state. */ BEGIN_BOARD_LOCK(); - if (mask & DD_STENCIL_BIT) { - fxMesa->Glide.grStencilMaskExt(0xff /*fxMesa->unitsState.stencilWriteMask*/); + if (mask & BUFFER_BIT_STENCIL) { + fxMesa->Glide.grStencilMaskExt(fxMesa->unitsState.stencilWriteMask); /* set stencil ref value = desired clear value */ fxMesa->Glide.grStencilFuncExt(GR_CMP_ALWAYS, clearS, 0xff); fxMesa->Glide.grStencilOpExt(GR_STENCILOP_REPLACE, @@ -213,6 +215,9 @@ static void fxDDClear( GLcontext *ctx, grDisable(GR_STENCIL_MODE_EXT); } END_BOARD_LOCK(); + } else if (mask & BUFFER_BIT_STENCIL) { + softwareMask |= (mask & (BUFFER_BIT_STENCIL)); + mask &= ~(BUFFER_BIT_STENCIL); } /* @@ -225,11 +230,10 @@ static void fxDDClear( GLcontext *ctx, * This could probably be done fancier but doing each possible case * explicitly is less error prone. */ - switch (mask & ~DD_STENCIL_BIT) { - case DD_BACK_LEFT_BIT | DD_DEPTH_BIT: + switch (mask & ~BUFFER_BIT_STENCIL) { + case BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH: /* back buffer & depth */ - /* FX_grColorMaskv_NoLock(ctx, true4); */ /* work around Voodoo3 bug */ - grDepthMask(FXTRUE); + grDepthMask(FXTRUE); grRenderBuffer(GR_BUFFER_BACKBUFFER); if (stencil_size > 0) { fxMesa->Glide.grBufferClearExt(fxMesa->clearC, @@ -240,19 +244,16 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXFALSE); - } break; - case DD_FRONT_LEFT_BIT | DD_DEPTH_BIT: + case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_DEPTH: /* XXX it appears that the depth buffer isn't cleared when * glRenderBuffer(GR_BUFFER_FRONTBUFFER) is set. * This is a work-around/ */ /* clear depth */ - grDepthMask(FXTRUE); - grRenderBuffer(GR_BUFFER_BACKBUFFER); + grDepthMask(FXTRUE); fxDisableColor(fxMesa); + grRenderBuffer(GR_BUFFER_BACKBUFFER); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, @@ -261,8 +262,9 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - /* clear front */ fxSetupColorMask(ctx); + grDepthMask(FXFALSE); + /* clear front */ grRenderBuffer(GR_BUFFER_FRONTBUFFER); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, @@ -272,11 +274,8 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXFALSE); - } break; - case DD_BACK_LEFT_BIT: + case BUFFER_BIT_BACK_LEFT: /* back buffer only */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -288,11 +287,8 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXTRUE); - } break; - case DD_FRONT_LEFT_BIT: + case BUFFER_BIT_FRONT_LEFT: /* front buffer only */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_FRONTBUFFER); @@ -304,11 +300,8 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXTRUE); - } break; - case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT: + case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT: /* front and back */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -329,15 +322,12 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXTRUE); - } break; - case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT | DD_DEPTH_BIT: - /* clear front */ - grDepthMask(FXFALSE); - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - if (stencil_size > 0) + case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH: + /* clear back and depth */ + grDepthMask(FXTRUE); + grRenderBuffer(GR_BUFFER_BACKBUFFER); + if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); @@ -345,10 +335,10 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - /* clear back and depth */ - grDepthMask(FXTRUE); - grRenderBuffer(GR_BUFFER_BACKBUFFER); - if (stencil_size > 0) + /* clear front */ + grDepthMask(FXFALSE); + grRenderBuffer(GR_BUFFER_FRONTBUFFER); + if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); @@ -356,15 +346,12 @@ static void fxDDClear( GLcontext *ctx, grBufferClear(fxMesa->clearC, fxMesa->clearA, clearD); - if (!fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXFALSE); - } break; - case DD_DEPTH_BIT: + case BUFFER_BIT_DEPTH: /* just the depth buffer */ - grRenderBuffer(GR_BUFFER_BACKBUFFER); + grDepthMask(FXTRUE); fxDisableColor(fxMesa); - grDepthMask(FXTRUE); + grRenderBuffer(GR_BUFFER_BACKBUFFER); if (stencil_size > 0) fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, @@ -374,49 +361,38 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); fxSetupColorMask(ctx); - if (ctx->Color._DrawDestMask & DD_FRONT_LEFT_BIT) { - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } - if (!fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXFALSE); - } break; default: /* clear no color buffers or depth buffer but might clear stencil */ - if (stencil_size > 0 && (mask & DD_STENCIL_BIT)) { + if ((stencil_size > 0) && (mask & BUFFER_BIT_STENCIL)) { /* XXX need this RenderBuffer call to work around Glide bug */ - grRenderBuffer(GR_BUFFER_BACKBUFFER); grDepthMask(FXFALSE); + grRenderBuffer(GR_BUFFER_BACKBUFFER); fxDisableColor(fxMesa); fxMesa->Glide.grBufferClearExt(fxMesa->clearC, fxMesa->clearA, clearD, clearS); - if (fxMesa->unitsState.depthTestEnabled) { - grDepthMask(FXTRUE); - } fxSetupColorMask(ctx); - if (ctx->Color._DrawDestMask & DD_FRONT_LEFT_BIT) { - grRenderBuffer(GR_BUFFER_FRONTBUFFER); - } } } } END_CLIP_LOOP(); - if (fxMesa->haveHwStencil && (mask & DD_STENCIL_BIT)) { - /* We changed the stencil state above. Signal that we need to - * upload it again. - */ - fxMesa->new_state |= FX_NEW_STENCIL; + if (fxMesa->haveHwStencil) { + /* We changed the stencil state above. Restore it! */ + fxSetupStencil(ctx); } + fxSetupDepthTest(ctx); + grRenderBuffer(fxMesa->currentFB); if (softwareMask) - _swrast_Clear( ctx, softwareMask, all, x, y, width, height ); + _swrast_Clear( ctx, softwareMask ); } /* Set the buffer used for drawing */ /* XXX support for separate read/draw buffers hasn't been tested */ +/* XXX GL_NONE disables color, but fails to correctly maintain state */ static void fxDDSetDrawBuffer(GLcontext * ctx, GLenum mode) { @@ -470,7 +446,6 @@ fxDDDrawBitmap2 (GLcontext *ctx, GLint px, GLint py, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | - ALPHABUF_BIT | /* nope! see 565 span kludge */ MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | @@ -563,10 +538,10 @@ fxDDDrawBitmap2 (GLcontext *ctx, GLint px, GLint py, for (row = 0; row < height; row++) { const GLubyte *src = - (const GLubyte *) _mesa_image_address(finalUnpack, - bitmap, width, height, - GL_COLOR_INDEX, GL_BITMAP, - 0, row, 0); + (const GLubyte *) _mesa_image_address2d(finalUnpack, + bitmap, width, height, + GL_COLOR_INDEX, GL_BITMAP, + row, 0); if (finalUnpack->LsbFirst) { /* least significan bit first */ GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7); @@ -634,7 +609,6 @@ fxDDDrawBitmap4 (GLcontext *ctx, GLint px, GLint py, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | /*MASKING_BIT |*/ /* masking ok, we're in 32bpp */ - /*ALPHABUF_BIT |*//* alpha ok, we're in 32bpp */ MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | @@ -722,10 +696,10 @@ fxDDDrawBitmap4 (GLcontext *ctx, GLint px, GLint py, for (row = 0; row < height; row++) { const GLubyte *src = - (const GLubyte *) _mesa_image_address(finalUnpack, - bitmap, width, height, - GL_COLOR_INDEX, GL_BITMAP, - 0, row, 0); + (const GLubyte *) _mesa_image_address2d(finalUnpack, + bitmap, width, height, + GL_COLOR_INDEX, GL_BITMAP, + row, 0); if (finalUnpack->LsbFirst) { /* least significan bit first */ GLubyte mask = 1U << (finalUnpack->SkipPixels & 0x7); @@ -800,9 +774,9 @@ fxDDReadPixels565 (GLcontext * ctx, 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, + GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dstImage, width, height, format, - type, 0, 0, 0); + type, 0, 0); GLint dstStride = _mesa_image_row_stride(packing, width, format, type); @@ -913,9 +887,9 @@ fxDDReadPixels555 (GLcontext * ctx, 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, + GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dstImage, width, height, format, - type, 0, 0, 0); + type, 0, 0); GLint dstStride = _mesa_image_row_stride(packing, width, format, type); @@ -1026,9 +1000,9 @@ fxDDReadPixels8888 (GLcontext * ctx, 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, + GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dstImage, width, height, format, - type, 0, 0, 0); + type, 0, 0); GLint dstStride = _mesa_image_row_stride(packing, width, format, type); @@ -1093,7 +1067,7 @@ fxDDReadPixels8888 (GLcontext * ctx, } -void +static void fxDDDrawPixels555 (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, @@ -1118,16 +1092,15 @@ fxDDDrawPixels555 (GLcontext * ctx, GLint x, GLint y, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | - ALPHABUF_BIT | MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { - _swrast_DrawPixels( ctx, x, y, width, height, format, type, + _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); - return; + return; } /* make sure the pixelpipe is configured correctly */ @@ -1193,9 +1166,8 @@ fxDDDrawPixels555 (GLcontext * ctx, GLint x, GLint y, if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR1555(src[2], src[1], src[0], src[3]); @@ -1207,9 +1179,8 @@ fxDDDrawPixels555 (GLcontext * ctx, GLint x, GLint y, else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR1555(src[2], src[1], src[0], 255); @@ -1230,7 +1201,7 @@ fxDDDrawPixels555 (GLcontext * ctx, GLint x, GLint y, } -void +static void fxDDDrawPixels565 (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, @@ -1255,16 +1226,15 @@ fxDDDrawPixels565 (GLcontext * ctx, GLint x, GLint y, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | - ALPHABUF_BIT | MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { - _swrast_DrawPixels( ctx, x, y, width, height, format, type, + _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); - return; + return; } /* make sure the pixelpipe is configured correctly */ @@ -1330,9 +1300,8 @@ fxDDDrawPixels565 (GLcontext * ctx, GLint x, GLint y, if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]); @@ -1344,9 +1313,8 @@ fxDDDrawPixels565 (GLcontext * ctx, GLint x, GLint y, else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]); @@ -1367,7 +1335,7 @@ fxDDDrawPixels565 (GLcontext * ctx, GLint x, GLint y, } -void +static void fxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, @@ -1392,16 +1360,15 @@ fxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | - ALPHABUF_BIT | MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { - _swrast_DrawPixels( ctx, x, y, width, height, format, type, + _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); - return; + return; } /* make sure the pixelpipe is configured correctly */ @@ -1467,9 +1434,8 @@ fxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]); @@ -1481,9 +1447,8 @@ fxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]); @@ -1504,7 +1469,7 @@ fxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, } -void +static void fxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, @@ -1529,16 +1494,15 @@ fxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | /*MASKING_BIT |*/ /* masking ok, we're in 32bpp */ - /*ALPHABUF_BIT |*//* alpha ok, we're in 32bpp */ MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { - _swrast_DrawPixels( ctx, x, y, width, height, format, type, + _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); - return; + return; } /* make sure the pixelpipe is configured correctly */ @@ -1606,9 +1570,8 @@ fxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, const GLint widthInBytes = width * 4; GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); MEMCPY(dst, src, widthInBytes); dst += dstStride; } @@ -1616,9 +1579,8 @@ fxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { - GLubyte *src = (GLubyte *) _mesa_image_address(finalUnpack, pixels, - width, height, format, - type, 0, row, 0); + GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, + pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR8888(src[2], src[1], src[0], 255); @@ -1693,7 +1655,7 @@ fxDDGetString(GLcontext * ctx, GLenum name) } static const struct tnl_pipeline_stage *fx_pipeline[] = { - &_tnl_vertex_transform_stage, /* TODO: Add the fastpath here */ + &_tnl_vertex_transform_stage, /* XXX todo - Add the fastpath here */ &_tnl_normal_transform_stage, &_tnl_lighting_stage, &_tnl_fog_coordinate_stage, @@ -1713,7 +1675,6 @@ static const struct tnl_pipeline_stage *fx_pipeline[] = { int fxDDInitFxMesaContext(fxMesaContext fxMesa) { - int i; GLcontext *ctx = fxMesa->glCtx; FX_setupGrVertexLayout(); @@ -1811,7 +1772,7 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureImageUnits = fxMesa->haveTwoTMUs ? 2 : 1; ctx->Const.MaxTextureUnits = MAX2(ctx->Const.MaxTextureImageUnits, ctx->Const.MaxTextureCoordUnits); - + fxMesa->new_state = _NEW_ALL; if (!fxMesa->haveHwStencil) { /* don't touch stencil if there is none */ @@ -1821,7 +1782,7 @@ fxDDInitFxMesaContext(fxMesaContext fxMesa) /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(ctx); - _ac_CreateContext(ctx); + _vbo_CreateContext(ctx); _tnl_CreateContext(ctx); _swsetup_CreateContext(ctx); @@ -1864,7 +1825,7 @@ fxDDDestroyFxMesaContext(fxMesaContext fxMesa) { _swsetup_DestroyContext(fxMesa->glCtx); _tnl_DestroyContext(fxMesa->glCtx); - _ac_DestroyContext(fxMesa->glCtx); + _vbo_DestroyContext(fxMesa->glCtx); _swrast_DestroyContext(fxMesa->glCtx); if (fxMesa->state) @@ -1893,35 +1854,13 @@ fxDDInitExtensions(GLcontext * ctx) _mesa_enable_extension(ctx, "GL_EXT_shared_texture_palette"); _mesa_enable_extension(ctx, "GL_EXT_blend_func_separate"); _mesa_enable_extension(ctx, "GL_EXT_texture_env_add"); + _mesa_enable_extension(ctx, "GL_EXT_stencil_wrap"); + _mesa_enable_extension(ctx, "GL_EXT_stencil_two_side"); if (fxMesa->haveTwoTMUs) { _mesa_enable_extension(ctx, "GL_ARB_multitexture"); } - if (fxMesa->haveHwStencil) { - _mesa_enable_extension( ctx, "GL_EXT_stencil_wrap" ); - } - - /* [dBorca] Hack alert: - * True texture compression can be done only on Napalm. - * We will advertise, however, generic texture compression - * on all Voodoo cards; the Mesa logic allows us to eventually - * fallback to uncompressed. This will fix those dumb applications - * which refuse to run w/o texture compression! We actually _can_ - * do texture compression for pre-Napalm cores, through NCC. But - * NCC poses many issues: - * 1) NCC w/o DITHER_ERR has poor quality and NCC w/ DITHER_ERR is - * damn slow! - * 2) NCC compression cannot be used with multitexturing, because - * the decompression tables are not per TMU anymore (bear in mind - * that earlier Voodoos could handle 2 NCC tables for each TMU -- - * just look for POINTCAST_PALETTE). As a last resort, we could - * fake NCC multitexturing through multipass rendering, but... - * ohwell, it's not worth the effort... - * This stand true for multitexturing palletized textures. - * 3) since NCC is not an OpenGL standard (as opposed to FXT1/DXTC), we - * can't use precompressed textures! - */ if (fxMesa->type >= GR_SSTTYPE_Voodoo4) { _mesa_enable_extension(ctx, "GL_ARB_texture_compression"); _mesa_enable_extension(ctx, "GL_3DFX_texture_compression_FXT1"); @@ -1929,17 +1868,38 @@ fxDDInitExtensions(GLcontext * ctx) _mesa_enable_extension(ctx, "GL_S3_s3tc"); _mesa_enable_extension(ctx, "GL_NV_blend_square"); } else { - if (fxMesa->HaveTexus2) { - _mesa_enable_extension(ctx, "GL_ARB_texture_compression"); - } -#if FX_TC_NCC - else -#endif - /* doesn't like texture compression */ + /* [dBorca] + * We should enable generic texture compression functions, + * but some poorly written apps automatically assume S3TC. + * Binding NCC to GL_COMPRESSED_RGB[A] is an unnecessary hassle, + * since it's slow and ugly (better with palette textures, then). + * Moreover, NCC is not an OpenGL standard, so we can't use + * precompressed textures. Last, but not least, NCC runs amok + * when multitexturing on a Voodoo3 and up (see POINTCAST vs UMA). + * Note: this is also a problem with palette textures, but + * faking multitex by multipass is evil... + * Implementing NCC requires three stages: + * fxDDChooseTextureFormat: + * bind GL_COMPRESSED_RGB[A] to _mesa_texformat_argb8888, + * so we can quantize properly, at a later time + * fxDDTexImage: + * if GL_COMPRESSED_RGB + * use _mesa_texformat_l8 to get 1bpt and set GR_TEXFMT_YIQ_422 + * if GL_COMPRESSED_RGBA + * use _mesa_texformat_al88 to get 2bpt and set GR_TEXFMT_AYIQ_8422 + * txMipQuantize(...); + * if (level == 0) { + * txPalToNcc((GuNccTable *)(&(ti->palette)), pxMip.pal); + * } + * fxSetupSingleTMU_NoLock/fxSetupDoubleTMU_NoLock: + * grTexDownloadTable(GR_TEXTABLE_NCC0, &(ti->palette)); + */ + /*_mesa_enable_extension(ctx, "GL_ARB_texture_compression");*/ _mesa_enable_extension(ctx, "GL_SGIS_generate_mipmap"); } if (fxMesa->HaveCmbExt) { + _mesa_enable_extension(ctx, "GL_ARB_texture_env_combine"); _mesa_enable_extension(ctx, "GL_EXT_texture_env_combine"); } @@ -1960,12 +1920,16 @@ fxDDInitExtensions(GLcontext * ctx) _mesa_enable_extension(ctx, "GL_EXT_multi_draw_arrays"); _mesa_enable_extension(ctx, "GL_IBM_multimode_draw_arrays"); _mesa_enable_extension(ctx, "GL_ARB_vertex_buffer_object"); -#if 1 - /* not just yet */ - _mesa_enable_extension(ctx, "GL_ARB_vertex_program"); - _mesa_enable_extension(ctx, "GL_NV_vertex_program"); - _mesa_enable_extension(ctx, "GL_NV_vertex_program1_1"); - _mesa_enable_extension(ctx, "GL_MESA_program_debug"); + /* dangerous */ + if (getenv("MESA_FX_ALLOW_VP")) { + _mesa_enable_extension(ctx, "GL_ARB_vertex_program"); + _mesa_enable_extension(ctx, "GL_NV_vertex_program"); + _mesa_enable_extension(ctx, "GL_NV_vertex_program1_1"); + _mesa_enable_extension(ctx, "GL_MESA_program_debug"); + } +#if 0 + /* this requires _tnl_vertex_cull_stage in the pipeline */ + _mesa_enable_extension(ctx, "EXT_cull_vertex"); #endif } @@ -1991,8 +1955,8 @@ fx_check_IsInHardware(GLcontext * ctx) return FX_FALLBACK_STENCIL; } - if (ctx->Color._DrawDestMask != DD_FRONT_LEFT_BIT && - ctx->Color._DrawDestMask != DD_BACK_LEFT_BIT) { + if ((ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_FRONT_LEFT) && + (ctx->DrawBuffer->_ColorDrawBufferIndexes[0] != BUFFER_BIT_BACK_LEFT)) { return FX_FALLBACK_DRAW_BUFFER; } @@ -2016,8 +1980,7 @@ fx_check_IsInHardware(GLcontext * ctx) #if 0 /* [dBorca] * We fail the spec here, unless certain blending modes: - * (c1 + c2) * 1 + d * 1 = c1 * 1 + d * 1 + c2 * 1 - * (c1 + c2) * 1 + d * 0 = c1 * 1 + d * 0 + c2 * 1 + * RGB: (GL_ONE + GL_*) or (GL_ZERO + GL_*) or ... */ if (NEED_SECONDARY_COLOR(ctx)) { if ((ctx->Color.BlendEquationRGB != GL_FUNC_ADD) && @@ -2098,7 +2061,8 @@ fx_check_IsInHardware(GLcontext * ctx) } #endif - if ((ctx->Texture.Unit[0].EnvMode != ctx->Texture.Unit[1].EnvMode) && + if (!fxMesa->HaveCmbExt && + (ctx->Texture.Unit[0].EnvMode != ctx->Texture.Unit[1].EnvMode) && (ctx->Texture.Unit[0].EnvMode != GL_MODULATE) && (ctx->Texture.Unit[0].EnvMode != GL_REPLACE)) { /* q2, seems ok... */ if (TDFX_DEBUG & VERBOSE_DRIVER) @@ -2128,7 +2092,7 @@ fx_check_IsInHardware(GLcontext * ctx) static void fxDDUpdateDDPointers(GLcontext * ctx, GLuint new_state) { - /* TNLcontext *tnl = TNL_CONTEXT(ctx);*/ + /* TNLcontext *tnl = TNL_CONTEXT(ctx); */ fxMesaContext fxMesa = FX_CONTEXT(ctx); if (TDFX_DEBUG & VERBOSE_DRIVER) { @@ -2136,7 +2100,7 @@ fxDDUpdateDDPointers(GLcontext * ctx, GLuint new_state) } _swrast_InvalidateState(ctx, new_state); - _ac_InvalidateState(ctx, new_state); + _vbo_InvalidateState(ctx, new_state); _tnl_InvalidateState(ctx, new_state); _swsetup_InvalidateState(ctx, new_state); @@ -2150,7 +2114,7 @@ void fxSetupDDPointers(GLcontext * ctx) { fxMesaContext fxMesa = FX_CONTEXT(ctx); - TNLcontext *tnl = TNL_CONTEXT(ctx); + /* TNLcontext *tnl = TNL_CONTEXT(ctx); */ if (TDFX_DEBUG & VERBOSE_DRIVER) { fprintf(stderr, "fxSetupDDPointers()\n"); @@ -2162,7 +2126,8 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.ClearColor = fxDDClearColor; ctx->Driver.Clear = fxDDClear; ctx->Driver.DrawBuffer = fxDDSetDrawBuffer; - ctx->Driver.GetBufferSize = fxDDBufferSize; + ctx->Driver.GetBufferSize = fxDDGetBufferSize; + ctx->Driver.Viewport = fxDDViewport; switch (fxMesa->colDepth) { case 15: ctx->Driver.DrawPixels = fxDDDrawPixels555; @@ -2209,9 +2174,9 @@ fxSetupDDPointers(GLcontext * ctx) ctx->Driver.ShadeModel = fxDDShadeModel; ctx->Driver.Enable = fxDDEnable; if (fxMesa->haveHwStencil) { - ctx->Driver.StencilFunc = fxDDStencilFunc; - ctx->Driver.StencilMask = fxDDStencilMask; - ctx->Driver.StencilOp = fxDDStencilOp; + ctx->Driver.StencilFuncSeparate = fxDDStencilFuncSeparate; + ctx->Driver.StencilMaskSeparate = fxDDStencilMaskSeparate; + ctx->Driver.StencilOpSeparate = fxDDStencilOpSeparate; } fxSetupDDSpanPointers(ctx);