X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fglide%2Ffxdd.c;h=213ef2382feaad5db265bc964c147a20aaf9ef0a;hb=5e1454a036be6da2c48e2e20bf6f8047ee1a94d3;hp=dedd7da9817b0e9c8f63c0b95797d784b987c5aa;hpb=9e821269fc0842d88cca37f7aca38fb934695c9d;p=mesa.git diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index dedd7da9817..213ef2382fe 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -40,22 +40,22 @@ #if defined(FX) -#include "image.h" -#include "mtypes.h" +#include "main/image.h" +#include "main/mtypes.h" #include "fxdrv.h" -#include "buffers.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" @@ -123,11 +123,19 @@ fxDDGetBufferSize(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) { - /* poll for window size change and realloc software Z/stencil/etc if needed */ - _mesa_ResizeBuffersMESA(); + 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 ); + } } @@ -154,23 +162,20 @@ 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 ); + fprintf( stderr, "fxDDClear\n"); } /* we can't clear accum buffers nor stereo */ - mask &= ~(DD_ACCUM_BIT | DD_FRONT_RIGHT_BIT | DD_BACK_RIGHT_BIT); + mask &= ~(BUFFER_BIT_ACCUM | BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT); /* Need this check to respond to certain HW updates */ if (fxMesa->new_state & (FX_NEW_SCISSOR | FX_NEW_COLOR_MASK)) { @@ -186,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); } } @@ -198,7 +203,7 @@ static void fxDDClear( GLcontext *ctx, * in the OGL state. */ BEGIN_BOARD_LOCK(); - if (mask & DD_STENCIL_BIT) { + 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); @@ -210,9 +215,9 @@ static void fxDDClear( GLcontext *ctx, grDisable(GR_STENCIL_MODE_EXT); } END_BOARD_LOCK(); - } else if (mask & DD_STENCIL_BIT) { - softwareMask |= (mask & (DD_STENCIL_BIT)); - mask &= ~(DD_STENCIL_BIT); + } else if (mask & BUFFER_BIT_STENCIL) { + softwareMask |= (mask & (BUFFER_BIT_STENCIL)); + mask &= ~(BUFFER_BIT_STENCIL); } /* @@ -225,8 +230,8 @@ 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 */ grDepthMask(FXTRUE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -240,7 +245,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); 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/ @@ -270,7 +275,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); break; - case DD_BACK_LEFT_BIT: + case BUFFER_BIT_BACK_LEFT: /* back buffer only */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -283,7 +288,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); break; - case DD_FRONT_LEFT_BIT: + case BUFFER_BIT_FRONT_LEFT: /* front buffer only */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_FRONTBUFFER); @@ -296,7 +301,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); 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); @@ -318,7 +323,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); break; - case DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT | DD_DEPTH_BIT: + case BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT | BUFFER_BIT_DEPTH: /* clear back and depth */ grDepthMask(FXTRUE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -342,7 +347,7 @@ static void fxDDClear( GLcontext *ctx, fxMesa->clearA, clearD); break; - case DD_DEPTH_BIT: + case BUFFER_BIT_DEPTH: /* just the depth buffer */ grDepthMask(FXTRUE); fxDisableColor(fxMesa); @@ -359,7 +364,7 @@ static void fxDDClear( GLcontext *ctx, 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 */ grDepthMask(FXFALSE); grRenderBuffer(GR_BUFFER_BACKBUFFER); @@ -381,7 +386,7 @@ static void fxDDClear( GLcontext *ctx, grRenderBuffer(fxMesa->currentFB); if (softwareMask) - _swrast_Clear( ctx, softwareMask, all, x, y, width, height ); + _swrast_Clear( ctx, softwareMask ); } @@ -441,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 | @@ -605,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 | @@ -1089,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 */ @@ -1224,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 */ @@ -1359,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 */ @@ -1494,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 */ @@ -1676,7 +1675,6 @@ static const struct tnl_pipeline_stage *fx_pipeline[] = { int fxDDInitFxMesaContext(fxMesaContext fxMesa) { - int i; GLcontext *ctx = fxMesa->glCtx; FX_setupGrVertexLayout(); @@ -1774,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 */ @@ -1784,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); @@ -1827,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) @@ -1857,6 +1855,7 @@ fxDDInitExtensions(GLcontext * ctx) _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"); @@ -1956,8 +1955,8 @@ fx_check_IsInHardware(GLcontext * ctx) return FX_FALLBACK_STENCIL; } - if (ctx->Color._DrawDestMask[0] != DD_FRONT_LEFT_BIT && - ctx->Color._DrawDestMask[0] != 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; } @@ -2093,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) { @@ -2101,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); @@ -2115,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"); @@ -2175,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);