From: Keith Whitwell Date: Fri, 24 Nov 2000 10:25:05 +0000 (+0000) Subject: Support for swappable t&l modules, including an example one in the FX X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ad2ac216fa0cbebc36530bf9e5256e902710b892;p=mesa.git Support for swappable t&l modules, including an example one in the FX driver (enable with FX_ALLOW_VTXFMT=t). --- diff --git a/src/mesa/Makefile.X11 b/src/mesa/Makefile.X11 index acec47b09ca..84384f4c81e 100644 --- a/src/mesa/Makefile.X11 +++ b/src/mesa/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.33 2000/11/16 21:05:34 keithw Exp $ +# $Id: Makefile.X11,v 1.34 2000/11/24 10:25:05 keithw Exp $ # Mesa 3-D graphics library # Version: 3.5 @@ -21,6 +21,7 @@ LIBDIR = ../lib CORE_SOURCES = \ + tnl/t_vtxfmt.c \ tnl/t_bbox.c \ tnl/t_clip.c \ tnl/t_context.c \ @@ -31,7 +32,6 @@ CORE_SOURCES = \ tnl/t_fog.c \ tnl/t_light.c \ tnl/t_pipeline.c \ - tnl/t_rect.c \ tnl/t_shade.c \ tnl/t_stages.c \ tnl/t_texture.c \ @@ -39,10 +39,11 @@ CORE_SOURCES = \ tnl/t_varray.c \ tnl/t_vb.c \ tnl/t_vbcull.c \ - tnl/t_vbfill.c \ tnl/t_vbindirect.c \ tnl/t_vbrender.c \ tnl/t_vbxform.c \ + api_loopback.c \ + api_noop.c \ accum.c \ alpha.c \ attrib.c \ @@ -90,7 +91,6 @@ CORE_SOURCES = \ polygon.c \ rastpos.c \ readpix.c \ - rect.c \ scissor.c \ state.c \ stencil.c \ @@ -100,6 +100,7 @@ CORE_SOURCES = \ texture.c \ texutil.c \ varray.c \ + vtxfmt.c \ winpos.c \ X86/x86.c \ X86/common_x86.c \ @@ -147,6 +148,8 @@ CORE_SOURCES = \ DRIVER_SOURCES = \ + FX/fxvtxfmt.c \ + FX/fxvtxprims.c \ FX/fxapi.c \ FX/fxdd.c \ FX/fxddspan.c \ diff --git a/src/mesa/drivers/glide/fxdd.c b/src/mesa/drivers/glide/fxdd.c index fc375f054fc..c7229561d7c 100644 --- a/src/mesa/drivers/glide/fxdd.c +++ b/src/mesa/drivers/glide/fxdd.c @@ -710,13 +710,11 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa ) fxMesa->currentFB=GR_BUFFER_FRONTBUFFER; FX_grRenderBuffer(GR_BUFFER_FRONTBUFFER); } - - fxMesa->state = NULL; - fxMesa->fogTable = NULL; - - fxMesa->state = malloc(FX_grGetInteger(FX_GLIDE_STATE_SIZE)); - fxMesa->fogTable = malloc(FX_grGetInteger(FX_FOG_TABLE_ENTRIES)*sizeof(GrFog_t)); - + + fxMesa->state = malloc(FX_grGetInteger(FX_GLIDE_STATE_SIZE)); + fxMesa->fogTable = malloc(FX_grGetInteger(FX_FOG_TABLE_ENTRIES) * + sizeof(GrFog_t)); + if (!fxMesa->state || !fxMesa->fogTable) { if (fxMesa->state) free(fxMesa->state); if (fxMesa->fogTable) free(fxMesa->fogTable); @@ -756,7 +754,8 @@ int fxDDInitFxMesaContext( fxMesaContext fxMesa ) _swrast_allow_vertex_fog( fxMesa->glCtx, GL_FALSE ); _swrast_allow_pixel_fog( fxMesa->glCtx, GL_TRUE ); - fxDDInitExtensions(fxMesa->glCtx); + fxDDInitExtensions(fxMesa->glCtx); + fxDDInitVtxfmt(fxMesa->glCtx); FX_grGlideGetState((GrState*)fxMesa->state); @@ -902,41 +901,75 @@ static GLboolean fxIsInHardware(GLcontext *ctx) return GL_TRUE; } +static void update_texture_scales( GLcontext *ctx ) +{ + fxMesaContext fxMesa = FX_CONTEXT(ctx); + struct gl_texture_unit *t0 = &ctx->Texture.Unit[fxMesa->tmu_source[0]]; + struct gl_texture_unit *t1 = &ctx->Texture.Unit[fxMesa->tmu_source[1]]; + + if (t0 && t0->_Current && FX_TEXTURE_DATA(t0)) { + fxMesa->s0scale = FX_TEXTURE_DATA(t0)->sScale; + fxMesa->t0scale = FX_TEXTURE_DATA(t0)->tScale; + fxMesa->inv_s0scale = 1.0 / fxMesa->s0scale; + fxMesa->inv_t0scale = 1.0 / fxMesa->t0scale; + } + + if (t1 && t1->_Current && FX_TEXTURE_DATA(t1)) { + fxMesa->s1scale = FX_TEXTURE_DATA(t1)->sScale; + fxMesa->t1scale = FX_TEXTURE_DATA(t1)->tScale; + fxMesa->inv_s1scale = 1.0 / fxMesa->s1scale; + fxMesa->inv_t1scale = 1.0 / fxMesa->t1scale; + } +} static void fxDDUpdateDDPointers(GLcontext *ctx) { - GLuint new_state = ctx->NewState; + fxMesaContext fxMesa = FX_CONTEXT(ctx); + GLuint new_state = ctx->NewState; - _swrast_InvalidateState( ctx, new_state ); - _swsetup_InvalidateState( ctx, new_state ); - _tnl_InvalidateState( ctx, new_state ); + _swrast_InvalidateState( ctx, new_state ); + _swsetup_InvalidateState( ctx, new_state ); + _tnl_InvalidateState( ctx, new_state ); - /* Recalculate fog table on projection matrix changes. This used to - * be triggered by the NearFar callback. - */ - if (new_state & _NEW_PROJECTION) { - FX_CONTEXT(ctx)->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; - } - - if (new_state & (_FX_NEW_IS_IN_HARDWARE | - _FX_NEW_RENDERSTATE | - _FX_NEW_SETUP_FUNCTION)) - { - fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; - - if (new_state & _FX_NEW_IS_IN_HARDWARE) - fxMesa->is_in_hardware = fxIsInHardware(ctx); + /* Recalculate fog table on projection matrix changes. This used to + * be triggered by the NearFar callback. + */ + if (new_state & _NEW_PROJECTION) + fxMesa->new_state |= FX_NEW_FOG; + + if (new_state & (_FX_NEW_IS_IN_HARDWARE | + _FX_NEW_RENDERSTATE | + _FX_NEW_SETUP_FUNCTION | + _NEW_TEXTURE)) + { + fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; + + if (new_state & _FX_NEW_IS_IN_HARDWARE) + fxMesa->is_in_hardware = fxIsInHardware(ctx); + + if (fxMesa->new_state) + fxSetupFXUnits(ctx); + + if (new_state & _FX_NEW_RENDERSTATE) + fxDDChooseRenderState( ctx ); + + if (new_state & _FX_NEW_SETUP_FUNCTION) + ctx->Driver.RasterSetup = fxDDChooseSetupFunction(ctx); + + if (new_state & _NEW_TEXTURE) + update_texture_scales( ctx ); - if (fxMesa->new_state) - fxSetupFXUnits(ctx); + } - if (new_state & _FX_NEW_RENDERSTATE) - fxDDChooseRenderState( ctx ); + if (fxMesa->allow_vfmt) { + if (new_state & _NEW_LIGHT) + fx_update_lighting( ctx ); - if (new_state & _FX_NEW_SETUP_FUNCTION) - ctx->Driver.RasterSetup = fxDDChooseSetupFunction(ctx); - } + if (new_state & _FX_NEW_VTXFMT) + fxDDCheckVtxfmt( ctx ); + else if (fxMesa->vtxfmt_fallback_count > 1) + fxMesa->vtxfmt_fallback_count--; + } } @@ -971,7 +1004,7 @@ void fxSetupDDPointers(GLcontext *ctx) ctx->Driver.Finish=fxDDFinish; ctx->Driver.Flush=NULL; - ctx->Driver.RenderStart=NULL; + ctx->Driver.RenderStart=fxSetupFXUnits; ctx->Driver.RenderFinish=_swrast_flush; ctx->Driver.TexImage2D = fxDDTexImage2D; @@ -1013,6 +1046,7 @@ void fxSetupDDPointers(GLcontext *ctx) * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_dd(void); int gl_fx_dummy_function_dd(void) { return 0; diff --git a/src/mesa/drivers/glide/fxddspan.c b/src/mesa/drivers/glide/fxddspan.c index 7eb8591ae68..fceeb0e60a7 100644 --- a/src/mesa/drivers/glide/fxddspan.c +++ b/src/mesa/drivers/glide/fxddspan.c @@ -565,6 +565,7 @@ void fxSetupDDSpanPointers(GLcontext *ctx) * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_span(void); int gl_fx_dummy_function_span(void) { return 0; diff --git a/src/mesa/drivers/glide/fxddtex.c b/src/mesa/drivers/glide/fxddtex.c index 85d2271b72e..f7beaf7e34f 100644 --- a/src/mesa/drivers/glide/fxddtex.c +++ b/src/mesa/drivers/glide/fxddtex.c @@ -99,7 +99,6 @@ static void fxTexInvalidate(GLcontext *ctx, struct gl_texture_object *tObj) ti->validated=GL_FALSE; fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; } static tfxTexInfo *fxAllocTexObjData(fxMesaContext fxMesa) @@ -159,7 +158,6 @@ void fxDDTexBind(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj) ti->lastTimeUsed=fxMesa->texBindNumber; fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; } void fxDDTexEnv(GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param) @@ -184,7 +182,6 @@ void fxDDTexEnv(GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *para } fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; } void fxDDTexParam(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj, @@ -282,7 +279,6 @@ void fxDDTexParam(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj, break; } fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; break; case GL_TEXTURE_WRAP_T: @@ -297,7 +293,6 @@ void fxDDTexParam(GLcontext *ctx, GLenum target, struct gl_texture_object *tObj, break; } fxMesa->new_state|=FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; break; case GL_TEXTURE_BORDER_COLOR: @@ -439,7 +434,6 @@ void fxDDTexPalette(GLcontext *ctx, struct gl_texture_object *tObj) } convertPalette(fxMesa->glbPalette.data, &ctx->Texture.Palette); fxMesa->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; } } @@ -1191,6 +1185,7 @@ GLvoid *fxDDGetTexImage(GLcontext *ctx, GLenum target, GLint level, * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_ddtex(void); int gl_fx_dummy_function_ddtex(void) { return 0; diff --git a/src/mesa/drivers/glide/fxdrv.h b/src/mesa/drivers/glide/fxdrv.h index f708a279b9f..4c844754880 100644 --- a/src/mesa/drivers/glide/fxdrv.h +++ b/src/mesa/drivers/glide/fxdrv.h @@ -68,18 +68,6 @@ #include "math/m_vector.h" -/* use gl/gl.h GLAPI/GLAPIENTRY/GLCALLBACK in place of - * WINGDIAPI/APIENTRY/CALLBACK, these are defined in mesa gl/gl.h - - * tjump@spgs.com - */ - - - -extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); -#if defined(MESA_DEBUG) && 0 -#define grDrawTriangle fx_sanity_triangle -#endif - /* Define some shorter names for these things. */ @@ -99,18 +87,6 @@ extern void fx_sanity_triangle( GrVertex *, GrVertex *, GrVertex * ); #define T1COORD GR_VERTEX_TOW_TMU1_OFFSET - -#define CLIP_XCOORD 0 /* normal place */ -#define CLIP_YCOROD 1 /* normal place */ -#define CLIP_ZCOORD 2 /* GR_VERTEX_Z_OFFSET */ -#define CLIP_WCOORD 3 /* GR_VERTEX_R_OFFSET */ -#define CLIP_GCOORD 4 /* normal place */ -#define CLIP_BCOORD 5 /* normal place */ -#define CLIP_RCOORD 6 /* GR_VERTEX_OOZ_OFFSET */ -#define CLIP_ACOORD 7 /* normal place */ - - - /* Should have size == 16 * sizeof(float). */ typedef union { @@ -119,6 +95,26 @@ typedef union { GLuint ui[16]; } fxVertex; +/* Used in the fxvtxfmt t&l engine. + */ +typedef struct { + GrVertex v; + GLfloat clip[4]; + GLfloat win[4]; + GLfloat texcoord[2][2]; + GLubyte mask; + GLfloat normal[3]; /* for replay & fallback */ +} fxClipVertex; + + + +typedef void (*vfmt_project_func)( GLcontext *ctx, fxClipVertex *v ); +typedef void (*vfmt_interpolate_func)( GLfloat t, + fxClipVertex *O, + const fxClipVertex *I, + const fxClipVertex *J ); + + #if defined(FXMESA_USE_ARGB) #define FXCOLOR4( c ) ( \ @@ -141,16 +137,14 @@ typedef union { -/* Mergable items first +/* fastpath/vtxfmt flags first */ -#define SETUP_RGBA 0x1 -#define SETUP_TMU0 0x2 -#define SETUP_TMU1 0x4 +#define SETUP_TMU0 0x1 +#define SETUP_TMU1 0x2 +#define SETUP_RGBA 0x4 #define SETUP_XYZW 0x8 #define MAX_SETUP 0x10 -#define MAX_MERGABLE 0x8 - #define FX_NUM_TMU 2 @@ -199,7 +193,6 @@ typedef union { #define FX_UM_ALPHA_ITERATED 0x04000000 #define FX_UM_ALPHA_CONSTANT 0x08000000 -typedef void (*tfxRenderVBFunc)(GLcontext *); /* Memory range from startAddr to endAddr-1 @@ -355,6 +348,15 @@ struct tfxMesaVertexBuffer { _NEW_COLOR) \ +/* Covers the state referenced in fxDDCheckVtxfmt. + */ +#define _FX_NEW_VTXFMT (_NEW_TEXTURE | \ + _NEW_TEXTURE_MATRIX | \ + _NEW_TRANSFORM | \ + _NEW_LIGHT | \ + _FX_NEW_RENDERSTATE) + + /* These lookup table are used to extract RGB values in [0,255] from * 16-bit pixel values. */ @@ -369,101 +371,127 @@ typedef void (*fx_point_func)( GLcontext *, const fxVertex * ); typedef void (*fxRenderEltsFunc)( struct vertex_buffer * ); struct tfxMesaContext { - GuTexPalette glbPalette; + GuTexPalette glbPalette; - GLcontext *glCtx; /* the core Mesa context */ - GLvisual *glVis; /* describes the color buffer */ - GLframebuffer *glBuffer; /* the ancillary buffers */ + GLcontext *glCtx; /* the core Mesa context */ + GLvisual *glVis; /* describes the color buffer */ + GLframebuffer *glBuffer; /* the ancillary buffers */ - GLint board; /* the board used for this context */ - GLint width, height; /* size of color buffer */ + GLint board; /* the board used for this context */ + GLint width, height; /* size of color buffer */ - GrBuffer_t currentFB; + GrBuffer_t currentFB; - GLboolean bgrOrder; - GrColor_t color; - GrColor_t clearC; - GrAlpha_t clearA; - GLuint constColor; - GrCullMode_t cullMode; + GLboolean bgrOrder; + GrColor_t color; + GrColor_t clearC; + GrAlpha_t clearA; + GLuint constColor; + GrCullMode_t cullMode; - tfxUnitsState unitsState; - tfxUnitsState restoreUnitsState; /* saved during multipass */ + tfxUnitsState unitsState; + tfxUnitsState restoreUnitsState; /* saved during multipass */ - GLuint tmu_source[FX_NUM_TMU]; - GLuint tex_dest[MAX_TEXTURE_UNITS]; - GLuint render_index; - GLuint setupindex; - GLuint setupdone; - GLuint stw_hint_state; /* for grHints */ - GLuint is_in_hardware; - GLuint new_state; - GLuint using_fast_path, passes, multipass; + GLuint tmu_source[FX_NUM_TMU]; + GLuint tex_dest[MAX_TEXTURE_UNITS]; + GLuint render_index; + GLuint setupindex; + GLuint setupdone; + GLuint stw_hint_state; /* for grHints */ + GLuint is_in_hardware; + GLuint new_state; + GLuint using_fast_path, passes, multipass; - /* Texture Memory Manager Data */ + /* Texture Memory Manager Data */ - GLuint texBindNumber; - GLint tmuSrc; - GLuint lastUnitsMode; - GLuint freeTexMem[FX_NUM_TMU]; - MemRange *tmPool; - MemRange *tmFree[FX_NUM_TMU]; + GLuint texBindNumber; + GLint tmuSrc; + GLuint lastUnitsMode; + GLuint freeTexMem[FX_NUM_TMU]; + MemRange *tmPool; + MemRange *tmFree[FX_NUM_TMU]; - GLenum fogTableMode; - GLfloat fogDensity; - GLfloat fogStart, fogEnd; - GrFog_t *fogTable; - GLint textureAlign; + GLenum fogTableMode; + GLfloat fogDensity; + GLfloat fogStart, fogEnd; + GrFog_t *fogTable; + GLint textureAlign; - /* Acc. functions */ + /* Acc. functions */ - fx_point_func draw_point; - fx_line_func draw_line; - fx_tri_func draw_tri; + fx_point_func draw_point; + fx_line_func draw_line; + fx_tri_func draw_tri; - fxRenderEltsFunc RenderElementsRaw; + fxRenderEltsFunc RenderElementsRaw; /* System to turn culling on/off for tris/lines/points. */ - fx_point_func initial_point; - fx_line_func initial_line; - fx_tri_func initial_tri; + fx_point_func initial_point; + fx_line_func initial_line; + fx_tri_func initial_tri; - fx_point_func subsequent_point; - fx_line_func subsequent_line; - fx_tri_func subsequent_tri; + fx_point_func subsequent_point; + fx_line_func subsequent_line; + fx_tri_func subsequent_tri; + GLfloat s0scale; + GLfloat s1scale; + GLfloat t0scale; + GLfloat t1scale; GLfloat inv_s0scale; GLfloat inv_s1scale; GLfloat inv_t0scale; GLfloat inv_t1scale; - tfxStats stats; - - void *state; - - /* Options */ - - GLboolean verbose; - GLboolean haveTwoTMUs; /* True if we really have 2 tmu's */ - GLboolean emulateTwoTMUs; /* True if we present 2 tmu's to mesa. */ - GLboolean haveAlphaBuffer; - GLboolean haveZBuffer; - GLboolean haveDoubleBuffer; - GLboolean haveGlobalPaletteTexture; - GLint swapInterval; - GLint maxPendingSwapBuffers; - - FX_GrContext_t glideContext; - - int screen_width; - int screen_height; - int initDone; - int clipMinX; - int clipMaxX; - int clipMinY; - int clipMaxY; + tfxStats stats; + + void *state; + + /* Options */ + + GLboolean verbose; + GLboolean haveTwoTMUs; /* True if we really have 2 tmu's */ + GLboolean emulateTwoTMUs; /* True if we present 2 tmu's to mesa. */ + GLboolean haveAlphaBuffer; + GLboolean haveZBuffer; + GLboolean haveDoubleBuffer; + GLboolean haveGlobalPaletteTexture; + GLint swapInterval; + GLint maxPendingSwapBuffers; + + FX_GrContext_t glideContext; + + int screen_width; + int screen_height; + int initDone; + int clipMinX; + int clipMaxX; + int clipMinY; + int clipMaxY; + + /* fxvtxfmt + */ + GLboolean allow_vfmt; + GLvertexformat vtxfmt; + fxClipVertex current; + fxClipVertex verts[4]; + fxClipVertex *vert; /* points into verts[] */ + void (*fire_on_vertex)( GLcontext * ); + void (*fire_on_end)( GLcontext * ); + void (*fire_on_fallback)( GLcontext * ); + + vfmt_project_func project_vertex; + vfmt_interpolate_func interpolate_vertices; + + int vtxfmt_fallback_count; + int vtxfmt_installed; + void (*old_begin)( GLenum ); + GLenum prim; + + GLuint accel_light; + GLfloat basecolor[4]; }; typedef void (*tfxSetupFunc)(struct vertex_buffer *, GLuint, GLuint); @@ -594,4 +622,7 @@ extern void fxTMMoveInTM_NoLock(fxMesaContext fxMesa, GLint where); extern void fxInitPixelTables(fxMesaContext fxMesa, GLboolean bgrOrder); +extern void fxDDCheckVtxfmt( GLcontext *ctx ); +extern void fx_update_lighting( GLcontext *ctx ); + #endif diff --git a/src/mesa/drivers/glide/fxglidew.c b/src/mesa/drivers/glide/fxglidew.c index ba345fcf33f..400f1fbafc6 100644 --- a/src/mesa/drivers/glide/fxglidew.c +++ b/src/mesa/drivers/glide/fxglidew.c @@ -436,6 +436,7 @@ FX_GrContext_t FX_grSstWinOpen( FxU32 hWnd, * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_glidew(void); int gl_fx_dummy_function_glidew(void) { return 0; diff --git a/src/mesa/drivers/glide/fxsetup.c b/src/mesa/drivers/glide/fxsetup.c index a5af36ca41d..f4fde1214ef 100644 --- a/src/mesa/drivers/glide/fxsetup.c +++ b/src/mesa/drivers/glide/fxsetup.c @@ -69,7 +69,7 @@ static void fxSetupBlend(GLcontext *ctx); static void fxSetupDepthTest(GLcontext *ctx); static void fxSetupScissor(GLcontext *ctx); static void fxSetupCull(GLcontext *ctx); -static void gl_print_fx_state_flags( const char *msg, GLuint flags); +static void fx_print_state_flags( const char *msg, GLuint flags); /*static GLboolean fxMultipassBlend(struct vertex_buffer *, GLuint);*/ static GLboolean fxMultipassTexture( struct vertex_buffer *, GLuint ); @@ -1181,7 +1181,6 @@ void fxDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) us->blendSrcFuncRGB=sfact; us->blendSrcFuncAlpha=asfact; fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; } switch(dfactor) { @@ -1235,7 +1234,6 @@ void fxDDBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) us->blendDstFuncRGB=dfact; us->blendDstFuncAlpha=adfact; fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; } } @@ -1296,13 +1294,11 @@ void fxDDAlphaFunc(GLcontext *ctx, GLenum func, GLclampf ref) if(newfunc!=us->alphaTestFunc) { us->alphaTestFunc=newfunc; fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; } if(ctx->Color.AlphaRef!=us->alphaTestRefValue) { us->alphaTestRefValue=ctx->Color.AlphaRef; fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; } } @@ -1363,7 +1359,6 @@ void fxDDDepthFunc(GLcontext *ctx, GLenum func) if(dfunc!=us->depthTestFunc) { us->depthTestFunc=dfunc; fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; } } @@ -1376,7 +1371,6 @@ void fxDDDepthMask(GLcontext *ctx, GLboolean flag) if(flag!=us->depthMask) { us->depthMask=flag; fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; } } @@ -1405,7 +1399,6 @@ void fxDDColorMask(GLcontext *ctx, { fxMesaContext fxMesa=(fxMesaContext)ctx->DriverCtx; fxMesa->new_state |= FX_NEW_COLOR_MASK; - ctx->Driver.RenderStart = fxSetupFXUnits; (void) r; (void) g; (void) b; (void) a; } @@ -1482,7 +1475,6 @@ static void fxSetupFog(GLcontext *ctx) void fxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ) { FX_CONTEXT(ctx)->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; /* XXX why is this here? */ } /************************************************************************/ @@ -1528,7 +1520,6 @@ static void fxSetupScissor(GLcontext *ctx) void fxDDScissor( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) { FX_CONTEXT(ctx)->new_state |= FX_NEW_SCISSOR; - ctx->Driver.RenderStart = fxSetupFXUnits; } /************************************************************************/ @@ -1540,14 +1531,12 @@ void fxDDCullFace(GLcontext *ctx, GLenum mode) { (void) mode; FX_CONTEXT(ctx)->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; } void fxDDFrontFace(GLcontext *ctx, GLenum mode) { (void) mode; FX_CONTEXT(ctx)->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; } @@ -1597,21 +1586,18 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) if(state!=us->alphaTestEnabled) { us->alphaTestEnabled=state; fxMesa->new_state |= FX_NEW_ALPHA; - ctx->Driver.RenderStart = fxSetupFXUnits; } break; case GL_BLEND: if(state!=us->blendEnabled) { us->blendEnabled=state; fxMesa->new_state |= FX_NEW_BLEND; - ctx->Driver.RenderStart = fxSetupFXUnits; } break; case GL_DEPTH_TEST: if(state!=us->depthTestEnabled) { us->depthTestEnabled=state; fxMesa->new_state |= FX_NEW_DEPTH; - ctx->Driver.RenderStart = fxSetupFXUnits; } break; case GL_DITHER: @@ -1623,18 +1609,15 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) break; case GL_SCISSOR_TEST: fxMesa->new_state |= FX_NEW_SCISSOR; - ctx->Driver.RenderStart = fxSetupFXUnits; break; case GL_SHARED_TEXTURE_PALETTE_EXT: fxDDTexUseGlbPalette(ctx, state); break; case GL_FOG: fxMesa->new_state |= FX_NEW_FOG; - ctx->Driver.RenderStart = fxSetupFXUnits; break; case GL_CULL_FACE: fxMesa->new_state |= FX_NEW_CULL; - ctx->Driver.RenderStart = fxSetupFXUnits; break; case GL_LINE_SMOOTH: case GL_LINE_STIPPLE: @@ -1642,7 +1625,6 @@ void fxDDEnable(GLcontext *ctx, GLenum cap, GLboolean state) case GL_POLYGON_SMOOTH: case GL_TEXTURE_2D: fxMesa->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; break; default: ; /* XXX no-op? */ @@ -1781,7 +1763,6 @@ static GLboolean fxMultipassTexture( struct vertex_buffer *VB, GLuint pass ) void fxDDShadeModel(GLcontext *ctx, GLenum mode) { FX_CONTEXT(ctx)->new_state |= FX_NEW_TEXTURING; - ctx->Driver.RenderStart = fxSetupFXUnits; } @@ -1789,7 +1770,7 @@ void fxDDShadeModel(GLcontext *ctx, GLenum mode) /************************************************************************/ /****************************** Units SetUp *****************************/ /************************************************************************/ -static void gl_print_fx_state_flags( const char *msg, GLuint flags ) +static void fx_print_state_flags( const char *msg, GLuint flags ) { fprintf(stderr, "%s: (0x%x) %s%s%s%s%s%s%s\n", @@ -1810,7 +1791,7 @@ void fxSetupFXUnits( GLcontext *ctx ) GLuint newstate = fxMesa->new_state; if (MESA_VERBOSE&VERBOSE_DRIVER) - gl_print_fx_state_flags("fxmesa: fxSetupFXUnits", newstate); + fx_print_state_flags("fxmesa: fxSetupFXUnits", newstate); if (newstate) { if (newstate & FX_NEW_TEXTURING) @@ -1834,10 +1815,8 @@ void fxSetupFXUnits( GLcontext *ctx ) if (newstate & FX_NEW_COLOR_MASK) fxSetupColorMask(ctx); - if (newstate & FX_NEW_CULL) { - + if (newstate & FX_NEW_CULL) fxSetupCull(ctx); - } fxMesa->draw_point = fxMesa->initial_point; fxMesa->draw_line = fxMesa->initial_line; @@ -1855,6 +1834,7 @@ void fxSetupFXUnits( GLcontext *ctx ) * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_setup(void); int gl_fx_dummy_function_setup(void) { return 0; diff --git a/src/mesa/drivers/glide/fxtexman.c b/src/mesa/drivers/glide/fxtexman.c index 3944ea2ef6c..b98ccedd3f9 100644 --- a/src/mesa/drivers/glide/fxtexman.c +++ b/src/mesa/drivers/glide/fxtexman.c @@ -738,6 +738,7 @@ fxTMRestoreTextures_NoLock(fxMesaContext ctx) { * Need this to provide at least one external definition. */ +extern int gl_fx_dummy_function_texman(void); int gl_fx_dummy_function_texman(void) { return 0; diff --git a/src/mesa/drivers/x11/xm_tri.c b/src/mesa/drivers/x11/xm_tri.c index 1ffe277ecc7..97235c0b27a 100644 --- a/src/mesa/drivers/x11/xm_tri.c +++ b/src/mesa/drivers/x11/xm_tri.c @@ -1,4 +1,4 @@ -/* $Id: xm_tri.c,v 1.12 2000/11/22 07:32:18 joukj Exp $ */ +/* $Id: xm_tri.c,v 1.13 2000/11/24 10:25:09 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -1410,8 +1410,8 @@ static void flat_LOOKUP8_triangle( GLcontext *ctx, #ifdef DEBUG -static void -_xmesa_print_triangle_func( swrast_tri_func triFunc ) +extern void _xmesa_print_triangle_func( swrast_tri_func triFunc ); +void _xmesa_print_triangle_func( swrast_tri_func triFunc ) { printf("XMesa tri func = "); if (triFunc ==smooth_TRUECOLOR_z_triangle) diff --git a/src/mesa/main/Makefile.X11 b/src/mesa/main/Makefile.X11 index acec47b09ca..84384f4c81e 100644 --- a/src/mesa/main/Makefile.X11 +++ b/src/mesa/main/Makefile.X11 @@ -1,4 +1,4 @@ -# $Id: Makefile.X11,v 1.33 2000/11/16 21:05:34 keithw Exp $ +# $Id: Makefile.X11,v 1.34 2000/11/24 10:25:05 keithw Exp $ # Mesa 3-D graphics library # Version: 3.5 @@ -21,6 +21,7 @@ LIBDIR = ../lib CORE_SOURCES = \ + tnl/t_vtxfmt.c \ tnl/t_bbox.c \ tnl/t_clip.c \ tnl/t_context.c \ @@ -31,7 +32,6 @@ CORE_SOURCES = \ tnl/t_fog.c \ tnl/t_light.c \ tnl/t_pipeline.c \ - tnl/t_rect.c \ tnl/t_shade.c \ tnl/t_stages.c \ tnl/t_texture.c \ @@ -39,10 +39,11 @@ CORE_SOURCES = \ tnl/t_varray.c \ tnl/t_vb.c \ tnl/t_vbcull.c \ - tnl/t_vbfill.c \ tnl/t_vbindirect.c \ tnl/t_vbrender.c \ tnl/t_vbxform.c \ + api_loopback.c \ + api_noop.c \ accum.c \ alpha.c \ attrib.c \ @@ -90,7 +91,6 @@ CORE_SOURCES = \ polygon.c \ rastpos.c \ readpix.c \ - rect.c \ scissor.c \ state.c \ stencil.c \ @@ -100,6 +100,7 @@ CORE_SOURCES = \ texture.c \ texutil.c \ varray.c \ + vtxfmt.c \ winpos.c \ X86/x86.c \ X86/common_x86.c \ @@ -147,6 +148,8 @@ CORE_SOURCES = \ DRIVER_SOURCES = \ + FX/fxvtxfmt.c \ + FX/fxvtxprims.c \ FX/fxapi.c \ FX/fxdd.c \ FX/fxddspan.c \ diff --git a/src/mesa/main/clip.c b/src/mesa/main/clip.c index 2df12db2e5f..0dc365131de 100644 --- a/src/mesa/main/clip.c +++ b/src/mesa/main/clip.c @@ -1,4 +1,4 @@ -/* $Id: clip.c,v 1.16 2000/11/22 07:32:16 joukj Exp $ */ +/* $Id: clip.c,v 1.17 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -78,7 +78,7 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) * whenever the projection matrix changes. */ if (ctx->ModelView.flags & MAT_DIRTY) - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); gl_transform_vector( ctx->Transform.EyeUserPlane[p], equation, ctx->ModelView.inv ); @@ -90,7 +90,7 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) */ if (ctx->Transform.ClipEnabled[p]) { if (ctx->ProjectionMatrix.flags & MAT_DIRTY) - _math_matrix_analyze( &ctx->ProjectionMatrix ); + _math_matrix_analyse( &ctx->ProjectionMatrix ); gl_transform_vector( ctx->Transform._ClipUserPlane[p], ctx->Transform.EyeUserPlane[p], @@ -98,6 +98,9 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq ) } ctx->NewState |= _NEW_TRANSFORM; + + if (ctx->Driver.ClipPlane) + ctx->Driver.ClipPlane( ctx, plane, equation ); } diff --git a/src/mesa/main/colormac.h b/src/mesa/main/colormac.h index 57d4350cc49..f0a7cc96b22 100644 --- a/src/mesa/main/colormac.h +++ b/src/mesa/main/colormac.h @@ -1,4 +1,4 @@ -/* $Id: colormac.h,v 1.3 2000/11/16 21:05:34 keithw Exp $ */ +/* $Id: colormac.h,v 1.4 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -38,7 +38,7 @@ #include "config.h" #include "macros.h" #include "mmath.h" -/* Do not reference types.h from this file. +/* Do not reference mtypes.h from this file. */ diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 170bb37e8c6..3fdeb28dd3d 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1,4 +1,4 @@ -/* $Id: context.c,v 1.108 2000/11/22 07:32:16 joukj Exp $ */ +/* $Id: context.c,v 1.109 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -690,70 +690,6 @@ init_texture_unit( GLcontext *ctx, GLuint unit ) } -static void -init_fallback_arrays( GLcontext *ctx ) -{ - struct gl_client_array *cl; - GLuint i; - - cl = &ctx->Fallback.Normal; - cl->Size = 3; - cl->Type = GL_FLOAT; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) ctx->Current.Normal; - cl->Enabled = 1; - - cl = &ctx->Fallback.Color; - cl->Size = 4; - cl->Type = GL_UNSIGNED_BYTE; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) ctx->Current.Color; - cl->Enabled = 1; - - cl = &ctx->Fallback.SecondaryColor; - cl->Size = 3; - cl->Type = GL_UNSIGNED_BYTE; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) ctx->Current.SecondaryColor; - cl->Enabled = 1; - - cl = &ctx->Fallback.FogCoord; - cl->Size = 1; - cl->Type = GL_FLOAT; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) &ctx->Current.FogCoord; - cl->Enabled = 1; - - cl = &ctx->Fallback.Index; - cl->Size = 1; - cl->Type = GL_UNSIGNED_INT; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) &ctx->Current.Index; - cl->Enabled = 1; - - for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++) { - cl = &ctx->Fallback.TexCoord[i]; - cl->Size = 4; - cl->Type = GL_FLOAT; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) ctx->Current.Texcoord[i]; - cl->Enabled = 1; - } - - cl = &ctx->Fallback.EdgeFlag; - cl->Size = 1; - cl->Type = GL_UNSIGNED_BYTE; - cl->Stride = 0; - cl->StrideB = 0; - cl->Ptr = (void *) &ctx->Current.EdgeFlag; - cl->Enabled = 1; -} /* Initialize a 1-D evaluator map */ @@ -908,7 +844,6 @@ init_attrib_groups( GLcontext *ctx ) ctx->Current.EdgeFlag = GL_TRUE; ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 ); - init_fallback_arrays( ctx ); /* Depth buffer group */ ctx->Depth.Test = GL_FALSE; @@ -1525,6 +1460,9 @@ _mesa_initialize_context( GLcontext *ctx, _mesa_init_dlist_table(ctx->Save, dispatchSize); ctx->CurrentDispatch = ctx->Exec; + ctx->ExecPrefersFloat = GL_FALSE; + ctx->SavePrefersFloat = GL_FALSE; + #if defined(MESA_TRACE) ctx->TraceCtx = CALLOC( sizeof(trace_context_t) ); #if 0 diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 2c9a024842c..250c63d813f 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -1,4 +1,4 @@ -/* $Id: dd.h,v 1.42 2000/11/16 21:05:34 keithw Exp $ */ +/* $Id: dd.h,v 1.43 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -29,7 +29,7 @@ #ifndef DD_INCLUDED #define DD_INCLUDED -/* THIS FILE ONLY INCLUDED BY types.h !!!!! */ +/* THIS FILE ONLY INCLUDED BY mtypes.h !!!!! */ struct gl_pixelstore_attrib; @@ -872,6 +872,12 @@ struct dd_function_table { */ + void (*LockArraysEXT)( GLcontext *ctx, GLint first, GLsizei count ); + void (*UnlockArraysEXT)( GLcontext *ctx ); + /* + */ + + /* * State-changing functions (drawing functions are above) * @@ -888,9 +894,11 @@ struct dd_function_table { GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA ); void (*ClearDepth)(GLcontext *ctx, GLclampd d); + void (*ClearStencil)(GLcontext *ctx, GLint s); void (*ColorMask)(GLcontext *ctx, GLboolean rmask, GLboolean gmask, GLboolean bmask, GLboolean amask ); void (*CullFace)(GLcontext *ctx, GLenum mode); + void (*ClipPlane)(GLcontext *ctx, GLenum plane, const GLfloat *equation ); void (*FrontFace)(GLcontext *ctx, GLenum mode); void (*DepthFunc)(GLcontext *ctx, GLenum func); void (*DepthMask)(GLcontext *ctx, GLboolean flag); @@ -909,10 +917,12 @@ struct dd_function_table { void (*PolygonStipple)(GLcontext *ctx, const GLubyte *mask ); void (*Scissor)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h); void (*ShadeModel)(GLcontext *ctx, GLenum mode); - void (*ClearStencil)(GLcontext *ctx, GLint s); void (*StencilFunc)(GLcontext *ctx, GLenum func, GLint ref, GLuint mask); void (*StencilMask)(GLcontext *ctx, GLuint mask); void (*StencilOp)(GLcontext *ctx, GLenum fail, GLenum zfail, GLenum zpass); + void (*TexGen)(GLcontext *ctx, GLenum coord, GLenum pname, + const GLfloat *params ); + void (*TextureMatrix)(GLcontext *ctx, GLuint unit, const GLmatrix *mat); void (*Viewport)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h); /* State-query functions @@ -945,5 +955,114 @@ struct dd_function_table { + + + + +typedef struct { + + void (*ArrayElement)( GLint ); /* NOTE */ + void (*Color3f)( GLfloat, GLfloat, GLfloat ); + void (*Color3fv)( const GLfloat * ); + void (*Color3ub)( GLubyte, GLubyte, GLubyte ); + void (*Color3ubv)( const GLubyte * ); + void (*Color4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (*Color4fv)( const GLfloat * ); + void (*Color4ub)( GLubyte, GLubyte, GLubyte, GLubyte ); + void (*Color4ubv)( const GLubyte * ); + void (*EdgeFlag)( GLboolean ); + void (*EdgeFlagv)( const GLboolean * ); + void (*EvalCoord1f)( GLfloat ); /* NOTE */ + void (*EvalCoord1fv)( const GLfloat * ); /* NOTE */ + void (*EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */ + void (*EvalCoord2fv)( const GLfloat * ); /* NOTE */ + void (*EvalPoint1)( GLint ); /* NOTE */ + void (*EvalPoint2)( GLint, GLint ); /* NOTE */ + void (*FogCoordfEXT)( GLfloat ); + void (*FogCoordfvEXT)( const GLfloat * ); + void (*Indexi)( GLint ); + void (*Indexiv)( const GLint * ); + void (*Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */ + void (*MultiTexCoord1fARB)( GLenum, GLfloat ); + void (*MultiTexCoord1fvARB)( GLenum, const GLfloat * ); + void (*MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat ); + void (*MultiTexCoord2fvARB)( GLenum, const GLfloat * ); + void (*MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat ); + void (*MultiTexCoord3fvARB)( GLenum, const GLfloat * ); + void (*MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat ); + void (*MultiTexCoord4fvARB)( GLenum, const GLfloat * ); + void (*Normal3f)( GLfloat, GLfloat, GLfloat ); + void (*Normal3fv)( const GLfloat * ); + void (*SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat ); + void (*SecondaryColor3fvEXT)( const GLfloat * ); + void (*SecondaryColor3ubEXT)( GLubyte, GLubyte, GLubyte ); + void (*SecondaryColor3ubvEXT)( const GLubyte * ); + void (*TexCoord1f)( GLfloat ); + void (*TexCoord1fv)( const GLfloat * ); + void (*TexCoord2f)( GLfloat, GLfloat ); + void (*TexCoord2fv)( const GLfloat * ); + void (*TexCoord3f)( GLfloat, GLfloat, GLfloat ); + void (*TexCoord3fv)( const GLfloat * ); + void (*TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (*TexCoord4fv)( const GLfloat * ); + void (*Vertex2f)( GLfloat, GLfloat ); + void (*Vertex2fv)( const GLfloat * ); + void (*Vertex3f)( GLfloat, GLfloat, GLfloat ); + void (*Vertex3fv)( const GLfloat * ); + void (*Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat ); + void (*Vertex4fv)( const GLfloat * ); + void (*CallList)( GLuint ); /* NOTE */ + void (*Begin)( GLenum ); + void (*End)( void ); + /* Drivers present a reduced set of the functions possible in + * begin/end objects. Core mesa provides translation stubs for the + * remaining functions to map down to these entrypoints. + * + * These are the initial values to be installed into dispatch by + * mesa. If the t&l driver wants to modify the dispatch table + * while installed, it must do so itself. It would be possible for + * the vertexformat to install it's own initial values for these + * functions, but this way there is an obvious list of what is + * expected of the driver. + * + * If the driver wants to hook in entrypoints other than those + * listed above, it must restore them to their original values in + * the disable() callback, below. + */ + + void (*Rectf)( GLfloat, GLfloat, GLfloat, GLfloat ); + /* + */ + + + void (*DrawArrays)( GLenum mode, GLint start, GLsizei count ); + void (*DrawElements)( GLenum mode, GLsizei count, GLenum type, + const GLvoid *indices ); + void (*DrawRangeElements)(GLenum mode, GLuint start, + GLuint end, GLsizei count, + GLenum type, const GLvoid *indices); + /* These may or may not belong here. Heuristic: If an array is + * enabled, the installed vertex format should support that array and + * it's current size natively. + */ + + void (*EvalMesh1)( GLenum mode, GLint i1, GLint i2 ); + void (*EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + /* If you don't support eval, fallback to the default vertex format + * on receiving an eval call and use the pipeline mechanism to + * provide partial t&l acceleration. + * + * Mesa will provide a set of helper functions to do eval within + * accelerated vertex formats, eventually... + */ + + GLboolean prefer_float_colors; + /* Should core send non-standard colors to glColor4f or glColor4ub + */ + + +} GLvertexformat; + + #endif diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 01f222caf79..171ae32ae19 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -1,4 +1,4 @@ -/* $Id: dlist.c,v 1.52 2000/11/22 07:32:16 joukj Exp $ */ +/* $Id: dlist.c,v 1.53 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -30,6 +30,7 @@ #else #include "glheader.h" #include "accum.h" +#include "api_loopback.h" #include "attrib.h" #include "bitmap.h" #include "blend.h" @@ -62,7 +63,6 @@ #include "points.h" #include "polygon.h" #include "readpix.h" -#include "rect.h" #include "state.h" #include "texobj.h" #include "teximage.h" @@ -73,9 +73,6 @@ #include "math/m_matrix.h" #include "math/m_xform.h" -#include "tnl/t_vbfill.h" -#include "tnl/t_eval.h" -#include "tnl/t_varray.h" #endif @@ -216,7 +213,6 @@ typedef enum { OPCODE_PUSH_MATRIX, OPCODE_PUSH_NAME, OPCODE_RASTER_POS, - OPCODE_RECTF, OPCODE_READ_BUFFER, OPCODE_RESET_HISTOGRAM, OPCODE_RESET_MIN_MAX, @@ -605,7 +601,6 @@ void gl_init_lists( void ) InstSize[OPCODE_PUSH_MATRIX] = 1; InstSize[OPCODE_PUSH_NAME] = 2; InstSize[OPCODE_RASTER_POS] = 5; - InstSize[OPCODE_RECTF] = 5; InstSize[OPCODE_READ_BUFFER] = 2; InstSize[OPCODE_RESET_HISTOGRAM] = 2; InstSize[OPCODE_RESET_MIN_MAX] = 2; @@ -2852,59 +2847,6 @@ static void save_ReadBuffer( GLenum mode ) } -static void save_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ) -{ - GET_CURRENT_CONTEXT(ctx); - Node *n; - FLUSH_TNL( ctx, FLUSH_STORED_VERTICES ); - n = ALLOC_INSTRUCTION( ctx, OPCODE_RECTF, 4 ); - if (n) { - n[1].f = x1; - n[2].f = y1; - n[3].f = x2; - n[4].f = y2; - } - if (ctx->ExecuteFlag) { - (*ctx->Exec->Rectf)( x1, y1, x2, y2 ); - } -} - -static void save_Rectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) -{ - save_Rectf(x1, y1, x2, y2); -} - -static void save_Rectdv(const GLdouble *v1, const GLdouble *v2) -{ - save_Rectf(v1[0], v1[1], v2[0], v2[1]); -} - -static void save_Rectfv( const GLfloat *v1, const GLfloat *v2 ) -{ - save_Rectf(v1[0], v1[1], v2[0], v2[1]); -} - -static void save_Recti(GLint x1, GLint y1, GLint x2, GLint y2) -{ - save_Rectf(x1, y1, x2, y2); -} - -static void save_Rectiv(const GLint *v1, const GLint *v2) -{ - save_Rectf(v1[0], v1[1], v2[0], v2[1]); -} - -static void save_Rects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) -{ - save_Rectf(x1, y1, x2, y2); -} - -static void save_Rectsv(const GLshort *v1, const GLshort *v2) -{ - save_Rectf(v1[0], v1[1], v2[0], v2[1]); -} - - static void save_ResetHistogram(GLenum target) { @@ -4481,10 +4423,6 @@ static void execute_list( GLcontext *ctx, GLuint list ) case OPCODE_READ_BUFFER: (*ctx->Exec->ReadBuffer)( n[1].e ); break; - case OPCODE_RECTF: - (*ctx->Exec->Rectf)( n[1].f, n[2].f, n[3].f, n[4].f ); - FLUSH_TNL( ctx, FLUSH_STORED_VERTICES ); - break; case OPCODE_RESET_HISTOGRAM: (*ctx->Exec->ResetHistogram)( n[1].e ); break; @@ -4824,7 +4762,9 @@ _mesa_NewList( GLuint list, GLenum mode ) /* - * End definition of current display list. + * End definition of current display list. Is the current + * ASSERT_OUTSIDE_BEGIN_END strong enough to really guarentee that + * we are outside begin/end calls? */ void _mesa_EndList( void ) @@ -4952,16 +4892,21 @@ _mesa_ListBase( GLuint base ) /* * Assign all the pointers in to point to Mesa's display list * building functions. + * + * This does not include any of the tnl functions - they are + * initialized from _mesa_init_api_defaults and from the active vtxfmt + * struct. */ void _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) { _mesa_init_no_op_table(table, tableSize); + _mesa_loopback_init_api_table( table, GL_FALSE ); + /* GL 1.0 */ table->Accum = save_Accum; table->AlphaFunc = save_AlphaFunc; - table->Begin = _mesa_Begin; table->Bitmap = save_Bitmap; table->BlendFunc = save_BlendFunc; table->CallList = save_CallList; @@ -4973,38 +4918,6 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->ClearIndex = save_ClearIndex; table->ClearStencil = save_ClearStencil; table->ClipPlane = save_ClipPlane; - table->Color3b = _mesa_Color3b; - table->Color3bv = _mesa_Color3bv; - table->Color3d = _mesa_Color3d; - table->Color3dv = _mesa_Color3dv; - table->Color3f = _mesa_Color3f; - table->Color3fv = _mesa_Color3fv; - table->Color3i = _mesa_Color3i; - table->Color3iv = _mesa_Color3iv; - table->Color3s = _mesa_Color3s; - table->Color3sv = _mesa_Color3sv; - table->Color3ub = _mesa_Color3ub; - table->Color3ubv = _mesa_Color3ubv; - table->Color3ui = _mesa_Color3ui; - table->Color3uiv = _mesa_Color3uiv; - table->Color3us = _mesa_Color3us; - table->Color3usv = _mesa_Color3usv; - table->Color4b = _mesa_Color4b; - table->Color4bv = _mesa_Color4bv; - table->Color4d = _mesa_Color4d; - table->Color4dv = _mesa_Color4dv; - table->Color4f = _mesa_Color4f; - table->Color4fv = _mesa_Color4fv; - table->Color4i = _mesa_Color4i; - table->Color4iv = _mesa_Color4iv; - table->Color4s = _mesa_Color4s; - table->Color4sv = _mesa_Color4sv; - table->Color4ub = _mesa_Color4ub; - table->Color4ubv = _mesa_Color4ubv; - table->Color4ui = _mesa_Color4ui; - table->Color4uiv = _mesa_Color4uiv; - table->Color4us = _mesa_Color4us; - table->Color4usv = _mesa_Color4usv; table->ColorMask = save_ColorMask; table->ColorMaterial = save_ColorMaterial; table->CopyPixels = save_CopyPixels; @@ -5016,30 +4929,12 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->Disable = save_Disable; table->DrawBuffer = save_DrawBuffer; table->DrawPixels = save_DrawPixels; - table->EdgeFlag = _mesa_EdgeFlag; - table->EdgeFlagv = _mesa_EdgeFlagv; table->Enable = save_Enable; - table->End = _mesa_End; table->EndList = _mesa_EndList; - table->EvalCoord1d = _mesa_EvalCoord1d; - table->EvalCoord1dv = _mesa_EvalCoord1dv; - table->EvalCoord1f = _mesa_EvalCoord1f; - table->EvalCoord1fv = _mesa_EvalCoord1fv; - table->EvalCoord2d = _mesa_EvalCoord2d; - table->EvalCoord2dv = _mesa_EvalCoord2dv; - table->EvalCoord2f = _mesa_EvalCoord2f; - table->EvalCoord2fv = _mesa_EvalCoord2fv; table->EvalMesh1 = save_EvalMesh1; table->EvalMesh2 = save_EvalMesh2; - table->EvalPoint1 = _mesa_EvalPoint1; - table->EvalPoint2 = _mesa_EvalPoint2; - table->FeedbackBuffer = _mesa_FeedbackBuffer; table->Finish = _mesa_Finish; table->Flush = _mesa_Flush; - table->FogCoordfEXT = _mesa_FogCoordfEXT; - table->FogCoordfvEXT = _mesa_FogCoordfvEXT; - table->FogCoorddEXT = _mesa_FogCoorddEXT; - table->FogCoorddvEXT = _mesa_FogCoorddvEXT; table->Fogf = save_Fogf; table->Fogfv = save_Fogfv; table->Fogi = save_Fogi; @@ -5077,14 +4972,6 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->GetTexParameteriv = _mesa_GetTexParameteriv; table->Hint = save_Hint; table->IndexMask = save_IndexMask; - table->Indexd = _mesa_Indexd; - table->Indexdv = _mesa_Indexdv; - table->Indexf = _mesa_Indexf; - table->Indexfv = _mesa_Indexfv; - table->Indexi = _mesa_Indexi; - table->Indexiv = _mesa_Indexiv; - table->Indexs = _mesa_Indexs; - table->Indexsv = _mesa_Indexsv; table->InitNames = save_InitNames; table->IsEnabled = _mesa_IsEnabled; table->IsList = _mesa_IsList; @@ -5112,24 +4999,10 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->MapGrid1f = save_MapGrid1f; table->MapGrid2d = save_MapGrid2d; table->MapGrid2f = save_MapGrid2f; - table->Materialf = _mesa_Materialf; - table->Materialfv = _mesa_Materialfv; - table->Materiali = _mesa_Materiali; - table->Materialiv = _mesa_Materialiv; table->MatrixMode = save_MatrixMode; table->MultMatrixd = save_MultMatrixd; table->MultMatrixf = save_MultMatrixf; table->NewList = save_NewList; - table->Normal3b = _mesa_Normal3b; - table->Normal3bv = _mesa_Normal3bv; - table->Normal3d = _mesa_Normal3d; - table->Normal3dv = _mesa_Normal3dv; - table->Normal3f = _mesa_Normal3f; - table->Normal3fv = _mesa_Normal3fv; - table->Normal3i = _mesa_Normal3i; - table->Normal3iv = _mesa_Normal3iv; - table->Normal3s = _mesa_Normal3s; - table->Normal3sv = _mesa_Normal3sv; table->Ortho = save_Ortho; table->PassThrough = save_PassThrough; table->PixelMapfv = save_PixelMapfv; @@ -5176,74 +5049,18 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->RasterPos4sv = save_RasterPos4sv; table->ReadBuffer = save_ReadBuffer; table->ReadPixels = _mesa_ReadPixels; - table->Rectd = save_Rectd; - table->Rectdv = save_Rectdv; - table->Rectf = save_Rectf; - table->Rectfv = save_Rectfv; - table->Recti = save_Recti; - table->Rectiv = save_Rectiv; - table->Rects = save_Rects; - table->Rectsv = save_Rectsv; table->RenderMode = _mesa_RenderMode; table->Rotated = save_Rotated; table->Rotatef = save_Rotatef; table->Scaled = save_Scaled; table->Scalef = save_Scalef; table->Scissor = save_Scissor; - table->SecondaryColor3bEXT = _mesa_SecondaryColor3bEXT; - table->SecondaryColor3bvEXT = _mesa_SecondaryColor3bvEXT; - table->SecondaryColor3sEXT = _mesa_SecondaryColor3sEXT; - table->SecondaryColor3svEXT = _mesa_SecondaryColor3svEXT; - table->SecondaryColor3iEXT = _mesa_SecondaryColor3iEXT; - table->SecondaryColor3ivEXT = _mesa_SecondaryColor3ivEXT; - table->SecondaryColor3fEXT = _mesa_SecondaryColor3fEXT; - table->SecondaryColor3fvEXT = _mesa_SecondaryColor3fvEXT; - table->SecondaryColor3dEXT = _mesa_SecondaryColor3dEXT; - table->SecondaryColor3dvEXT = _mesa_SecondaryColor3dvEXT; - table->SecondaryColor3ubEXT = _mesa_SecondaryColor3ubEXT; - table->SecondaryColor3ubvEXT = _mesa_SecondaryColor3ubvEXT; - table->SecondaryColor3usEXT = _mesa_SecondaryColor3usEXT; - table->SecondaryColor3usvEXT = _mesa_SecondaryColor3usvEXT; - table->SecondaryColor3uiEXT = _mesa_SecondaryColor3uiEXT; - table->SecondaryColor3uivEXT = _mesa_SecondaryColor3uivEXT; - table->SecondaryColorPointerEXT = _mesa_SecondaryColorPointerEXT; + table->FeedbackBuffer = _mesa_FeedbackBuffer; table->SelectBuffer = _mesa_SelectBuffer; table->ShadeModel = save_ShadeModel; table->StencilFunc = save_StencilFunc; table->StencilMask = save_StencilMask; table->StencilOp = save_StencilOp; - table->TexCoord1d = _mesa_TexCoord1d; - table->TexCoord1dv = _mesa_TexCoord1dv; - table->TexCoord1f = _mesa_TexCoord1f; - table->TexCoord1fv = _mesa_TexCoord1fv; - table->TexCoord1i = _mesa_TexCoord1i; - table->TexCoord1iv = _mesa_TexCoord1iv; - table->TexCoord1s = _mesa_TexCoord1s; - table->TexCoord1sv = _mesa_TexCoord1sv; - table->TexCoord2d = _mesa_TexCoord2d; - table->TexCoord2dv = _mesa_TexCoord2dv; - table->TexCoord2f = _mesa_TexCoord2f; - table->TexCoord2fv = _mesa_TexCoord2fv; - table->TexCoord2i = _mesa_TexCoord2i; - table->TexCoord2iv = _mesa_TexCoord2iv; - table->TexCoord2s = _mesa_TexCoord2s; - table->TexCoord2sv = _mesa_TexCoord2sv; - table->TexCoord3d = _mesa_TexCoord3d; - table->TexCoord3dv = _mesa_TexCoord3dv; - table->TexCoord3f = _mesa_TexCoord3f; - table->TexCoord3fv = _mesa_TexCoord3fv; - table->TexCoord3i = _mesa_TexCoord3i; - table->TexCoord3iv = _mesa_TexCoord3iv; - table->TexCoord3s = _mesa_TexCoord3s; - table->TexCoord3sv = _mesa_TexCoord3sv; - table->TexCoord4d = _mesa_TexCoord4d; - table->TexCoord4dv = _mesa_TexCoord4dv; - table->TexCoord4f = _mesa_TexCoord4f; - table->TexCoord4fv = _mesa_TexCoord4fv; - table->TexCoord4i = _mesa_TexCoord4i; - table->TexCoord4iv = _mesa_TexCoord4iv; - table->TexCoord4s = _mesa_TexCoord4s; - table->TexCoord4sv = _mesa_TexCoord4sv; table->TexEnvf = save_TexEnvf; table->TexEnvfv = save_TexEnvfv; table->TexEnvi = save_TexEnvi; @@ -5262,35 +5079,10 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->TexParameteriv = save_TexParameteriv; table->Translated = save_Translated; table->Translatef = save_Translatef; - table->Vertex2d = _mesa_Vertex2d; - table->Vertex2dv = _mesa_Vertex2dv; - table->Vertex2f = _mesa_Vertex2f; - table->Vertex2fv = _mesa_Vertex2fv; - table->Vertex2i = _mesa_Vertex2i; - table->Vertex2iv = _mesa_Vertex2iv; - table->Vertex2s = _mesa_Vertex2s; - table->Vertex2sv = _mesa_Vertex2sv; - table->Vertex3d = _mesa_Vertex3d; - table->Vertex3dv = _mesa_Vertex3dv; - table->Vertex3f = _mesa_Vertex3f; - table->Vertex3fv = _mesa_Vertex3fv; - table->Vertex3i = _mesa_Vertex3i; - table->Vertex3iv = _mesa_Vertex3iv; - table->Vertex3s = _mesa_Vertex3s; - table->Vertex3sv = _mesa_Vertex3sv; - table->Vertex4d = _mesa_Vertex4d; - table->Vertex4dv = _mesa_Vertex4dv; - table->Vertex4f = _mesa_Vertex4f; - table->Vertex4fv = _mesa_Vertex4fv; - table->Vertex4i = _mesa_Vertex4i; - table->Vertex4iv = _mesa_Vertex4iv; - table->Vertex4s = _mesa_Vertex4s; - table->Vertex4sv = _mesa_Vertex4sv; table->Viewport = save_Viewport; /* GL 1.1 */ table->AreTexturesResident = _mesa_AreTexturesResident; - table->ArrayElement = _mesa_ArrayElement; table->BindTexture = save_BindTexture; table->ColorPointer = _mesa_ColorPointer; table->CopyTexImage1D = save_CopyTexImage1D; @@ -5299,15 +5091,11 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->CopyTexSubImage2D = save_CopyTexSubImage2D; table->DeleteTextures = _mesa_DeleteTextures; table->DisableClientState = _mesa_DisableClientState; - table->DrawArrays = _mesa_DrawArrays; - table->DrawElements = _mesa_DrawElements; table->EdgeFlagPointer = _mesa_EdgeFlagPointer; table->EnableClientState = _mesa_EnableClientState; table->GenTextures = _mesa_GenTextures; table->GetPointerv = _mesa_GetPointerv; table->IndexPointer = _mesa_IndexPointer; - table->Indexub = _mesa_Indexub; - table->Indexubv = _mesa_Indexubv; table->InterleavedArrays = _mesa_InterleavedArrays; table->IsTexture = _mesa_IsTexture; table->NormalPointer = _mesa_NormalPointer; @@ -5321,7 +5109,6 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) /* GL 1.2 */ table->CopyTexSubImage3D = save_CopyTexSubImage3D; - table->DrawRangeElements = _mesa_DrawRangeElements; table->TexImage3D = save_TexImage3D; table->TexSubImage3D = save_TexSubImage3D; @@ -5424,38 +5211,6 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) /* GL_ARB_multitexture */ table->ActiveTextureARB = save_ActiveTextureARB; table->ClientActiveTextureARB = save_ClientActiveTextureARB; - table->MultiTexCoord1dARB = _mesa_MultiTexCoord1dARB; - table->MultiTexCoord1dvARB = _mesa_MultiTexCoord1dvARB; - table->MultiTexCoord1fARB = _mesa_MultiTexCoord1fARB; - table->MultiTexCoord1fvARB = _mesa_MultiTexCoord1fvARB; - table->MultiTexCoord1iARB = _mesa_MultiTexCoord1iARB; - table->MultiTexCoord1ivARB = _mesa_MultiTexCoord1ivARB; - table->MultiTexCoord1sARB = _mesa_MultiTexCoord1sARB; - table->MultiTexCoord1svARB = _mesa_MultiTexCoord1svARB; - table->MultiTexCoord2dARB = _mesa_MultiTexCoord2dARB; - table->MultiTexCoord2dvARB = _mesa_MultiTexCoord2dvARB; - table->MultiTexCoord2fARB = _mesa_MultiTexCoord2fARB; - table->MultiTexCoord2fvARB = _mesa_MultiTexCoord2fvARB; - table->MultiTexCoord2iARB = _mesa_MultiTexCoord2iARB; - table->MultiTexCoord2ivARB = _mesa_MultiTexCoord2ivARB; - table->MultiTexCoord2sARB = _mesa_MultiTexCoord2sARB; - table->MultiTexCoord2svARB = _mesa_MultiTexCoord2svARB; - table->MultiTexCoord3dARB = _mesa_MultiTexCoord3dARB; - table->MultiTexCoord3dvARB = _mesa_MultiTexCoord3dvARB; - table->MultiTexCoord3fARB = _mesa_MultiTexCoord3fARB; - table->MultiTexCoord3fvARB = _mesa_MultiTexCoord3fvARB; - table->MultiTexCoord3iARB = _mesa_MultiTexCoord3iARB; - table->MultiTexCoord3ivARB = _mesa_MultiTexCoord3ivARB; - table->MultiTexCoord3sARB = _mesa_MultiTexCoord3sARB; - table->MultiTexCoord3svARB = _mesa_MultiTexCoord3svARB; - table->MultiTexCoord4dARB = _mesa_MultiTexCoord4dARB; - table->MultiTexCoord4dvARB = _mesa_MultiTexCoord4dvARB; - table->MultiTexCoord4fARB = _mesa_MultiTexCoord4fARB; - table->MultiTexCoord4fvARB = _mesa_MultiTexCoord4fvARB; - table->MultiTexCoord4iARB = _mesa_MultiTexCoord4iARB; - table->MultiTexCoord4ivARB = _mesa_MultiTexCoord4ivARB; - table->MultiTexCoord4sARB = _mesa_MultiTexCoord4sARB; - table->MultiTexCoord4svARB = _mesa_MultiTexCoord4svARB; /* GL_EXT_blend_func_separate */ table->BlendFuncSeparateEXT = save_BlendFuncSeparateEXT; @@ -5503,6 +5258,12 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize ) table->CompressedTexSubImage2DARB = save_CompressedTexSubImage2DARB; table->CompressedTexSubImage1DARB = save_CompressedTexSubImage1DARB; table->GetCompressedTexImageARB = _mesa_GetCompressedTexImageARB; + + /* GL_EXT_secondary_color */ + table->SecondaryColorPointerEXT = _mesa_SecondaryColorPointerEXT; + + /* GL_EXT_fog_coord */ + table->FogCoordPointerEXT = _mesa_FogCoordPointerEXT; } @@ -5623,9 +5384,6 @@ static void print_list( GLcontext *ctx, FILE *f, GLuint list ) case OPCODE_RASTER_POS: fprintf(f,"RasterPos %g %g %g %g\n", n[1].f, n[2].f,n[3].f,n[4].f); break; - case OPCODE_RECTF: - fprintf( f, "Rectf %g %g %g %g\n", n[1].f, n[2].f, n[3].f, n[4].f); - break; case OPCODE_ROTATE: fprintf(f,"Rotate %g %g %g %g\n", n[1].f, n[2].f, n[3].f, n[4].f ); break; diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 7ac2f79087b..d2ad97a0da8 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -1,4 +1,4 @@ -/* $Id: enable.c,v 1.33 2000/11/22 07:32:16 joukj Exp $ */ +/* $Id: enable.c,v 1.34 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -100,7 +100,7 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state ) ctx->Transform._AnyClip++; if (ctx->ProjectionMatrix.flags & MAT_DIRTY) { - _math_matrix_analyze( &ctx->ProjectionMatrix ); + _math_matrix_analyse( &ctx->ProjectionMatrix ); } /* This derived state also calculated in clip.c and diff --git a/src/mesa/main/light.c b/src/mesa/main/light.c index a1c58f8f3cf..af274eabcea 100644 --- a/src/mesa/main/light.c +++ b/src/mesa/main/light.c @@ -1,4 +1,4 @@ -/* $Id: light.c,v 1.27 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: light.c,v 1.28 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -122,7 +122,7 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params ) case GL_SPOT_DIRECTION: /* transform direction by inverse modelview */ if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) { - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); } TRANSFORM_NORMAL( l->EyeDirection, params, ctx->ModelView.inv ); break; @@ -568,58 +568,48 @@ void gl_update_material( GLcontext *ctx, if (bitmask & (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT)) { struct gl_material *mat = &ctx->Light.Material[0]; COPY_3V( ctx->Light._BaseColor[0], mat->Emission ); - ACC_SCALE_3V( ctx->Light._BaseColor[0], mat->Ambient, ctx->Light.Model.Ambient ); + ACC_SCALE_3V( ctx->Light._BaseColor[0], mat->Ambient, + ctx->Light.Model.Ambient ); } if (bitmask & (BACK_EMISSION_BIT | BACK_AMBIENT_BIT)) { struct gl_material *mat = &ctx->Light.Material[1]; COPY_3V( ctx->Light._BaseColor[1], mat->Emission ); - ACC_SCALE_3V( ctx->Light._BaseColor[1], mat->Ambient, ctx->Light.Model.Ambient ); + ACC_SCALE_3V( ctx->Light._BaseColor[1], mat->Ambient, + ctx->Light.Model.Ambient ); } /* update material diffuse values */ if (bitmask & FRONT_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat tmp[4]; - SUB_3V( tmp, src[0].Diffuse, mat->Diffuse ); + COPY_4FV( mat->Diffuse, src[0].Diffuse ); foreach (light, list) { - ACC_SCALE_3V( light->_MatDiffuse[0], light->Diffuse, tmp ); + SCALE_3V( light->_MatDiffuse[0], light->Diffuse, mat->Diffuse ); } - COPY_4FV( mat->Diffuse, src[0].Diffuse ); FLOAT_COLOR_TO_CHAN(ctx->Light._BaseAlpha[0], mat->Diffuse[3]); } if (bitmask & BACK_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - GLfloat tmp[4]; - SUB_3V( tmp, src[1].Diffuse, mat->Diffuse ); + COPY_4FV( mat->Diffuse, src[1].Diffuse ); foreach (light, list) { - ACC_SCALE_3V( light->_MatDiffuse[1], light->Diffuse, tmp ); + SCALE_3V( light->_MatDiffuse[1], light->Diffuse, mat->Diffuse ); } - COPY_4FV( mat->Diffuse, src[1].Diffuse ); FLOAT_COLOR_TO_CHAN(ctx->Light._BaseAlpha[1], mat->Diffuse[3]); } /* update material specular values */ if (bitmask & FRONT_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat tmp[4]; - SUB_3V( tmp, src[0].Specular, mat->Specular ); + COPY_4FV( mat->Specular, src[0].Specular ); foreach (light, list) { - ACC_SCALE_3V( light->_MatSpecular[0], light->Specular, tmp ); - light->_IsMatSpecular[0] = - (LEN_SQUARED_3FV(light->_MatSpecular[0]) > 1e-16); + ACC_SCALE_3V( light->_MatSpecular[0], light->Specular, mat->Specular); } - COPY_4FV( mat->Specular, src[0].Specular ); } if (bitmask & BACK_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - GLfloat tmp[4]; - SUB_3V( tmp, src[1].Specular, mat->Specular ); + COPY_4FV( mat->Specular, src[1].Specular ); foreach (light, list) { - ACC_SCALE_3V( light->_MatSpecular[1], light->Specular, tmp ); - light->_IsMatSpecular[1] = - (LEN_SQUARED_3FV(light->_MatSpecular[1]) > 1e-16); + ACC_SCALE_3V( light->_MatSpecular[1], light->Specular, mat->Specular); } - COPY_4FV( mat->Specular, src[1].Specular ); } if (bitmask & FRONT_SHININESS_BIT) { @@ -733,49 +723,37 @@ void gl_update_color_material( GLcontext *ctx, /* update light->_MatDiffuse = light's diffuse * material's diffuse */ if (bitmask & FRONT_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat tmp[4]; - SUB_3V( tmp, color, mat->Diffuse ); + COPY_4FV( mat->Diffuse, color ); foreach (light, list) { - ACC_SCALE_3V( light->_MatDiffuse[0], light->Diffuse, tmp ); + SCALE_3V( light->_MatDiffuse[0], light->Diffuse, mat->Diffuse ); } - COPY_4FV( mat->Diffuse, color ); FLOAT_COLOR_TO_CHAN(ctx->Light._BaseAlpha[0], mat->Diffuse[3]); } if (bitmask & BACK_DIFFUSE_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - GLfloat tmp[4]; - SUB_3V( tmp, color, mat->Diffuse ); + COPY_4FV( mat->Diffuse, color ); foreach (light, list) { - ACC_SCALE_3V( light->_MatDiffuse[1], light->Diffuse, tmp ); + SCALE_3V( light->_MatDiffuse[1], light->Diffuse, mat->Diffuse ); } - COPY_4FV( mat->Diffuse, color ); FLOAT_COLOR_TO_CHAN(ctx->Light._BaseAlpha[1], mat->Diffuse[3]); } /* update light->_MatSpecular = light's specular * material's specular */ if (bitmask & FRONT_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[0]; - GLfloat tmp[4]; - SUB_3V( tmp, color, mat->Specular ); + COPY_4FV( mat->Specular, color ); foreach (light, list) { - ACC_SCALE_3V( light->_MatSpecular[0], light->Specular, tmp ); - light->_IsMatSpecular[0] = - (LEN_SQUARED_3FV(light->_MatSpecular[0]) > 1e-16); + ACC_SCALE_3V( light->_MatSpecular[0], light->Specular, mat->Specular); } - COPY_4FV( mat->Specular, color ); } if (bitmask & BACK_SPECULAR_BIT) { struct gl_material *mat = &ctx->Light.Material[1]; - GLfloat tmp[4]; - SUB_3V( tmp, color, mat->Specular ); + COPY_4FV( mat->Specular, color ); foreach (light, list) { - ACC_SCALE_3V( light->_MatSpecular[1], light->Specular, tmp ); - light->_IsMatSpecular[1] = - (LEN_SQUARED_3FV(light->_MatSpecular[1]) > 1e-16); + ACC_SCALE_3V( light->_MatSpecular[1], light->Specular, mat->Specular); } - COPY_4FV( mat->Specular, color ); } if (0) @@ -839,51 +817,6 @@ _mesa_ColorMaterial( GLenum face, GLenum mode ) -void -_mesa_Materialf( GLenum face, GLenum pname, GLfloat param ) -{ - _mesa_Materialfv( face, pname, ¶m ); -} - - - -void -_mesa_Materiali(GLenum face, GLenum pname, GLint param ) -{ - _mesa_Materialiv(face, pname, ¶m); -} - - -void -_mesa_Materialiv(GLenum face, GLenum pname, const GLint *params ) -{ - GLfloat fparam[4]; - switch (pname) { - case GL_AMBIENT: - case GL_DIFFUSE: - case GL_SPECULAR: - case GL_EMISSION: - case GL_AMBIENT_AND_DIFFUSE: - fparam[0] = INT_TO_FLOAT( params[0] ); - fparam[1] = INT_TO_FLOAT( params[1] ); - fparam[2] = INT_TO_FLOAT( params[2] ); - fparam[3] = INT_TO_FLOAT( params[3] ); - break; - case GL_SHININESS: - fparam[0] = (GLfloat) params[0]; - break; - case GL_COLOR_INDEXES: - fparam[0] = (GLfloat) params[0]; - fparam[1] = (GLfloat) params[1]; - fparam[2] = (GLfloat) params[2]; - break; - default: - /* Error will be caught later in gl_Materialfv */ - ; - } - _mesa_Materialfv(face, pname, fparam); -} - void _mesa_GetMaterialfv( GLenum face, GLenum pname, GLfloat *params ) @@ -1190,8 +1123,6 @@ gl_update_lighting( GLcontext *ctx ) SCALE_3V( light->_MatAmbient[side], light->Ambient, mat->Ambient ); SCALE_3V( light->_MatSpecular[side], light->Specular, mat->Specular); - light->_IsMatSpecular[side] = - (LEN_SQUARED_3FV(light->_MatSpecular[side]) > 1e-16); } } } diff --git a/src/mesa/main/light.h b/src/mesa/main/light.h index 134e3782e58..604e4d5806e 100644 --- a/src/mesa/main/light.h +++ b/src/mesa/main/light.h @@ -1,4 +1,4 @@ -/* $Id: light.h,v 1.6 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: light.h,v 1.7 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -62,18 +62,6 @@ _mesa_LightModeli( GLenum pname, GLint param ); extern void _mesa_LightModeliv( GLenum pname, const GLint *params ); -extern void -_mesa_Materialf( GLenum face, GLenum pname, GLfloat param ); - -extern void -_mesa_Materialfv( GLenum face, GLenum pname, const GLfloat *params ); - -extern void -_mesa_Materiali( GLenum face, GLenum pname, GLint param ); - -extern void -_mesa_Materialiv( GLenum face, GLenum pname, const GLint *params ); - extern void _mesa_GetLightfv( GLenum light, GLenum pname, GLfloat *params ); diff --git a/src/mesa/main/macros.h b/src/mesa/main/macros.h index d5d9e42e7f7..02121e3e120 100644 --- a/src/mesa/main/macros.h +++ b/src/mesa/main/macros.h @@ -1,4 +1,4 @@ -/* $Id: macros.h,v 1.14 2000/11/16 21:05:35 keithw Exp $ */ +/* $Id: macros.h,v 1.15 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -35,7 +35,7 @@ #include "glheader.h" -/* Do not reference types.h from this file. +/* Do not reference mtypes.h from this file. */ diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c index 6573a46c02f..6106a80affe 100644 --- a/src/mesa/main/matrix.c +++ b/src/mesa/main/matrix.c @@ -1,4 +1,4 @@ -/* $Id: matrix.c,v 1.27 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: matrix.c,v 1.28 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -57,10 +57,10 @@ /**********************************************************************/ -#define GET_ACTIVE_MATRIX(ctx, mat, flags, where) \ +#define GET_ACTIVE_MATRIX(ctx, mat, flags, where) \ do { \ - ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, where); \ - if (MESA_VERBOSE&VERBOSE_API) fprintf(stderr, "%s\n", where); \ + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, where); \ + if (MESA_VERBOSE&VERBOSE_API) fprintf(stderr, "%s\n", where); \ switch (ctx->Transform.MatrixMode) { \ case GL_MODELVIEW: \ mat = &ctx->ModelView; \ diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 03ac0c4f2a3..e18bdda81be 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1,4 +1,4 @@ -/* $Id: mtypes.h,v 1.1 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: mtypes.h,v 1.2 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -208,7 +208,6 @@ struct gl_light { GLfloat _MatSpecular[2][3]; /* material spec * light specular */ GLfloat _dli; /* CI diffuse light intensity */ GLfloat _sli; /* CI specular light intensity */ - GLboolean _IsMatSpecular[2]; }; @@ -502,7 +501,6 @@ struct gl_light_attrib { #define LIGHT_POSITIONAL 0x4 #define LIGHT_SPOT 0x10 #define LIGHT_LOCAL_VIEWER 0x20 -#define LIGHT_TWO_SIDE 0x40 #define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER) @@ -724,7 +722,6 @@ struct gl_stencil_attrib { #define ENABLE_LIGHT 0x1000000 #define ENABLE_FOG 0x2000000 #define ENABLE_USERCLIP 0x4000000 -#define ENABLE_VIEWCLIP 0x8000000 #define ENABLE_NORMALIZE 0x10000000 #define ENABLE_RESCALE 0x20000000 #define ENABLE_POINT_ATTEN 0x40000000 @@ -976,23 +973,9 @@ struct gl_array_attrib { GLuint LockFirst; GLuint LockCount; - }; -/* These are used to make the ctx->Current values look like - * arrays (with zero StrideB). - */ -struct gl_fallback_arrays { - struct gl_client_array Normal; - struct gl_client_array Color; - struct gl_client_array SecondaryColor; - struct gl_client_array FogCoord; - struct gl_client_array Index; - struct gl_client_array TexCoord[MAX_TEXTURE_UNITS]; - struct gl_client_array EdgeFlag; -}; - struct gl_feedback { @@ -1428,6 +1411,9 @@ struct __GLcontextRec { struct _glapi_table *Save; /* Display list save funcs */ struct _glapi_table *Exec; /* Execute funcs */ struct _glapi_table *CurrentDispatch; /* == Save or Exec !! */ + + GLboolean ExecPrefersFloat; /* What preference for color conversion? */ + GLboolean SavePrefersFloat; GLvisual Visual; GLframebuffer *DrawBuffer; /* buffer for writing */ @@ -1529,8 +1515,6 @@ struct __GLcontextRec { struct gl_color_table PostColorMatrixColorTable; struct gl_color_table ProxyPostColorMatrixColorTable; - struct gl_fallback_arrays Fallback; - GLenum ErrorValue; /* Last error code */ GLenum RenderMode; /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */ GLuint NewState; /* bitwise-or of _NEW_* flags */ diff --git a/src/mesa/main/rastpos.c b/src/mesa/main/rastpos.c index 63f4e5aa49e..9f6a49330d6 100644 --- a/src/mesa/main/rastpos.c +++ b/src/mesa/main/rastpos.c @@ -1,4 +1,4 @@ -/* $Id: rastpos.c,v 1.15 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: rastpos.c,v 1.16 2000/11/24 10:25:05 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -168,7 +168,7 @@ static void gl_shade_rastpos( GLcontext *ctx, ACC_SCALE_SCALAR_3V(contrib, n_dot_VP, light->_MatDiffuse[0]); diffuse += n_dot_VP * light->_dli * attenuation; - if (light->_IsMatSpecular[0]) { + { if (ctx->Light.Model.LocalViewer) { GLfloat v[3]; COPY_3V(v, vertex); diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 8db7f013040..c0c9e98e5fb 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -1,4 +1,4 @@ -/* $Id: state.c,v 1.47 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: state.c,v 1.48 2000/11/24 10:25:06 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -37,6 +37,7 @@ #include "glheader.h" #include "accum.h" #include "alpha.h" +#include "api_loopback.h" #include "attrib.h" #include "bitmap.h" #include "blend.h" @@ -68,7 +69,6 @@ #include "polygon.h" #include "rastpos.h" #include "readpix.h" -#include "rect.h" #include "scissor.h" #include "state.h" #include "stencil.h" @@ -83,10 +83,6 @@ #include "swrast/swrast.h" #include "math/m_matrix.h" #include "math/m_xform.h" -#include "tnl/t_eval.h" -#include "tnl/t_vbfill.h" -#include "tnl/t_varray.h" -#include "tnl/t_rect.h" #endif @@ -119,6 +115,9 @@ _mesa_init_no_op_table(struct _glapi_table *table, GLuint tableSize) /* * Initialize the given dispatch table with pointers to Mesa's * immediate-mode commands. + * + * Pointers to begin/end object commands and a few others + * are provided via the vtxfmt interface elsewhere. */ void _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) @@ -126,10 +125,11 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) /* first initialize all dispatch slots to no-op */ _mesa_init_no_op_table(exec, tableSize); + _mesa_loopback_init_api_table( exec, GL_FALSE ); + /* load the dispatch slots we understand */ exec->Accum = _mesa_Accum; exec->AlphaFunc = _mesa_AlphaFunc; - exec->Begin = _mesa_Begin; exec->Bitmap = _mesa_Bitmap; exec->BlendFunc = _mesa_BlendFunc; exec->CallList = _mesa_CallList; @@ -141,38 +141,6 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->ClearIndex = _mesa_ClearIndex; exec->ClearStencil = _mesa_ClearStencil; exec->ClipPlane = _mesa_ClipPlane; - exec->Color3b = _mesa_Color3b; - exec->Color3bv = _mesa_Color3bv; - exec->Color3d = _mesa_Color3d; - exec->Color3dv = _mesa_Color3dv; - exec->Color3f = _mesa_Color3f; - exec->Color3fv = _mesa_Color3fv; - exec->Color3i = _mesa_Color3i; - exec->Color3iv = _mesa_Color3iv; - exec->Color3s = _mesa_Color3s; - exec->Color3sv = _mesa_Color3sv; - exec->Color3ub = _mesa_Color3ub; - exec->Color3ubv = _mesa_Color3ubv; - exec->Color3ui = _mesa_Color3ui; - exec->Color3uiv = _mesa_Color3uiv; - exec->Color3us = _mesa_Color3us; - exec->Color3usv = _mesa_Color3usv; - exec->Color4b = _mesa_Color4b; - exec->Color4bv = _mesa_Color4bv; - exec->Color4d = _mesa_Color4d; - exec->Color4dv = _mesa_Color4dv; - exec->Color4f = _mesa_Color4f; - exec->Color4fv = _mesa_Color4fv; - exec->Color4i = _mesa_Color4i; - exec->Color4iv = _mesa_Color4iv; - exec->Color4s = _mesa_Color4s; - exec->Color4sv = _mesa_Color4sv; - exec->Color4ub = _mesa_Color4ub; - exec->Color4ubv = _mesa_Color4ubv; - exec->Color4ui = _mesa_Color4ui; - exec->Color4uiv = _mesa_Color4uiv; - exec->Color4us = _mesa_Color4us; - exec->Color4usv = _mesa_Color4usv; exec->ColorMask = _mesa_ColorMask; exec->ColorMaterial = _mesa_ColorMaterial; exec->CopyPixels = _mesa_CopyPixels; @@ -184,33 +152,12 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->Disable = _mesa_Disable; exec->DrawBuffer = _mesa_DrawBuffer; exec->DrawPixels = _mesa_DrawPixels; - exec->EdgeFlag = _mesa_EdgeFlag; - exec->EdgeFlagv = _mesa_EdgeFlagv; exec->Enable = _mesa_Enable; - exec->End = _mesa_End; exec->EndList = _mesa_EndList; - exec->EvalCoord1d = _mesa_EvalCoord1d; - exec->EvalCoord1dv = _mesa_EvalCoord1dv; - exec->EvalCoord1f = _mesa_EvalCoord1f; - exec->EvalCoord1fv = _mesa_EvalCoord1fv; - exec->EvalCoord2d = _mesa_EvalCoord2d; - exec->EvalCoord2dv = _mesa_EvalCoord2dv; - exec->EvalCoord2f = _mesa_EvalCoord2f; - exec->EvalCoord2fv = _mesa_EvalCoord2fv; - exec->EvalMesh1 = _mesa_EvalMesh1; - exec->EvalMesh2 = _mesa_EvalMesh2; - exec->EvalPoint1 = _mesa_EvalPoint1; - exec->EvalPoint2 = _mesa_EvalPoint2; exec->FeedbackBuffer = _mesa_FeedbackBuffer; exec->Finish = _mesa_Finish; exec->Flush = _mesa_Flush; - - exec->FogCoordfEXT = _mesa_FogCoordfEXT; - exec->FogCoordfvEXT = _mesa_FogCoordfvEXT; - exec->FogCoorddEXT = _mesa_FogCoorddEXT; - exec->FogCoorddvEXT = _mesa_FogCoorddvEXT; exec->FogCoordPointerEXT = _mesa_FogCoordPointerEXT; - exec->Fogf = _mesa_Fogf; exec->Fogfv = _mesa_Fogfv; exec->Fogi = _mesa_Fogi; @@ -248,14 +195,6 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->GetTexParameteriv = _mesa_GetTexParameteriv; exec->Hint = _mesa_Hint; exec->IndexMask = _mesa_IndexMask; - exec->Indexd = _mesa_Indexd; - exec->Indexdv = _mesa_Indexdv; - exec->Indexf = _mesa_Indexf; - exec->Indexfv = _mesa_Indexfv; - exec->Indexi = _mesa_Indexi; - exec->Indexiv = _mesa_Indexiv; - exec->Indexs = _mesa_Indexs; - exec->Indexsv = _mesa_Indexsv; exec->InitNames = _mesa_InitNames; exec->IsEnabled = _mesa_IsEnabled; exec->IsList = _mesa_IsList; @@ -283,24 +222,10 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->MapGrid1f = _mesa_MapGrid1f; exec->MapGrid2d = _mesa_MapGrid2d; exec->MapGrid2f = _mesa_MapGrid2f; - exec->Materialf = _mesa_Materialf; - exec->Materialfv = _mesa_Materialfv; - exec->Materiali = _mesa_Materiali; - exec->Materialiv = _mesa_Materialiv; exec->MatrixMode = _mesa_MatrixMode; exec->MultMatrixd = _mesa_MultMatrixd; exec->MultMatrixf = _mesa_MultMatrixf; exec->NewList = _mesa_NewList; - exec->Normal3b = _mesa_Normal3b; - exec->Normal3bv = _mesa_Normal3bv; - exec->Normal3d = _mesa_Normal3d; - exec->Normal3dv = _mesa_Normal3dv; - exec->Normal3f = _mesa_Normal3f; - exec->Normal3fv = _mesa_Normal3fv; - exec->Normal3i = _mesa_Normal3i; - exec->Normal3iv = _mesa_Normal3iv; - exec->Normal3s = _mesa_Normal3s; - exec->Normal3sv = _mesa_Normal3sv; exec->Ortho = _mesa_Ortho; exec->PassThrough = _mesa_PassThrough; exec->PixelMapfv = _mesa_PixelMapfv; @@ -347,74 +272,18 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->RasterPos4sv = _mesa_RasterPos4sv; exec->ReadBuffer = _mesa_ReadBuffer; exec->ReadPixels = _mesa_ReadPixels; - exec->Rectd = _mesa_Rectd; - exec->Rectdv = _mesa_Rectdv; - exec->Rectf = _mesa_Rectf; - exec->Rectfv = _mesa_Rectfv; - exec->Recti = _mesa_Recti; - exec->Rectiv = _mesa_Rectiv; - exec->Rects = _mesa_Rects; - exec->Rectsv = _mesa_Rectsv; exec->RenderMode = _mesa_RenderMode; exec->Rotated = _mesa_Rotated; exec->Rotatef = _mesa_Rotatef; exec->Scaled = _mesa_Scaled; exec->Scalef = _mesa_Scalef; exec->Scissor = _mesa_Scissor; - exec->SecondaryColor3bEXT = _mesa_SecondaryColor3bEXT; - exec->SecondaryColor3bvEXT = _mesa_SecondaryColor3bvEXT; - exec->SecondaryColor3sEXT = _mesa_SecondaryColor3sEXT; - exec->SecondaryColor3svEXT = _mesa_SecondaryColor3svEXT; - exec->SecondaryColor3iEXT = _mesa_SecondaryColor3iEXT; - exec->SecondaryColor3ivEXT = _mesa_SecondaryColor3ivEXT; - exec->SecondaryColor3fEXT = _mesa_SecondaryColor3fEXT; - exec->SecondaryColor3fvEXT = _mesa_SecondaryColor3fvEXT; - exec->SecondaryColor3dEXT = _mesa_SecondaryColor3dEXT; - exec->SecondaryColor3dvEXT = _mesa_SecondaryColor3dvEXT; - exec->SecondaryColor3ubEXT = _mesa_SecondaryColor3ubEXT; - exec->SecondaryColor3ubvEXT = _mesa_SecondaryColor3ubvEXT; - exec->SecondaryColor3usEXT = _mesa_SecondaryColor3usEXT; - exec->SecondaryColor3usvEXT = _mesa_SecondaryColor3usvEXT; - exec->SecondaryColor3uiEXT = _mesa_SecondaryColor3uiEXT; - exec->SecondaryColor3uivEXT = _mesa_SecondaryColor3uivEXT; exec->SecondaryColorPointerEXT = _mesa_SecondaryColorPointerEXT; exec->SelectBuffer = _mesa_SelectBuffer; exec->ShadeModel = _mesa_ShadeModel; exec->StencilFunc = _mesa_StencilFunc; exec->StencilMask = _mesa_StencilMask; exec->StencilOp = _mesa_StencilOp; - exec->TexCoord1d = _mesa_TexCoord1d; - exec->TexCoord1dv = _mesa_TexCoord1dv; - exec->TexCoord1f = _mesa_TexCoord1f; - exec->TexCoord1fv = _mesa_TexCoord1fv; - exec->TexCoord1i = _mesa_TexCoord1i; - exec->TexCoord1iv = _mesa_TexCoord1iv; - exec->TexCoord1s = _mesa_TexCoord1s; - exec->TexCoord1sv = _mesa_TexCoord1sv; - exec->TexCoord2d = _mesa_TexCoord2d; - exec->TexCoord2dv = _mesa_TexCoord2dv; - exec->TexCoord2f = _mesa_TexCoord2f; - exec->TexCoord2fv = _mesa_TexCoord2fv; - exec->TexCoord2i = _mesa_TexCoord2i; - exec->TexCoord2iv = _mesa_TexCoord2iv; - exec->TexCoord2s = _mesa_TexCoord2s; - exec->TexCoord2sv = _mesa_TexCoord2sv; - exec->TexCoord3d = _mesa_TexCoord3d; - exec->TexCoord3dv = _mesa_TexCoord3dv; - exec->TexCoord3f = _mesa_TexCoord3f; - exec->TexCoord3fv = _mesa_TexCoord3fv; - exec->TexCoord3i = _mesa_TexCoord3i; - exec->TexCoord3iv = _mesa_TexCoord3iv; - exec->TexCoord3s = _mesa_TexCoord3s; - exec->TexCoord3sv = _mesa_TexCoord3sv; - exec->TexCoord4d = _mesa_TexCoord4d; - exec->TexCoord4dv = _mesa_TexCoord4dv; - exec->TexCoord4f = _mesa_TexCoord4f; - exec->TexCoord4fv = _mesa_TexCoord4fv; - exec->TexCoord4i = _mesa_TexCoord4i; - exec->TexCoord4iv = _mesa_TexCoord4iv; - exec->TexCoord4s = _mesa_TexCoord4s; - exec->TexCoord4sv = _mesa_TexCoord4sv; exec->TexEnvf = _mesa_TexEnvf; exec->TexEnvfv = _mesa_TexEnvfv; exec->TexEnvi = _mesa_TexEnvi; @@ -433,35 +302,10 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->TexParameteriv = _mesa_TexParameteriv; exec->Translated = _mesa_Translated; exec->Translatef = _mesa_Translatef; - exec->Vertex2d = _mesa_Vertex2d; - exec->Vertex2dv = _mesa_Vertex2dv; - exec->Vertex2f = _mesa_Vertex2f; - exec->Vertex2fv = _mesa_Vertex2fv; - exec->Vertex2i = _mesa_Vertex2i; - exec->Vertex2iv = _mesa_Vertex2iv; - exec->Vertex2s = _mesa_Vertex2s; - exec->Vertex2sv = _mesa_Vertex2sv; - exec->Vertex3d = _mesa_Vertex3d; - exec->Vertex3dv = _mesa_Vertex3dv; - exec->Vertex3f = _mesa_Vertex3f; - exec->Vertex3fv = _mesa_Vertex3fv; - exec->Vertex3i = _mesa_Vertex3i; - exec->Vertex3iv = _mesa_Vertex3iv; - exec->Vertex3s = _mesa_Vertex3s; - exec->Vertex3sv = _mesa_Vertex3sv; - exec->Vertex4d = _mesa_Vertex4d; - exec->Vertex4dv = _mesa_Vertex4dv; - exec->Vertex4f = _mesa_Vertex4f; - exec->Vertex4fv = _mesa_Vertex4fv; - exec->Vertex4i = _mesa_Vertex4i; - exec->Vertex4iv = _mesa_Vertex4iv; - exec->Vertex4s = _mesa_Vertex4s; - exec->Vertex4sv = _mesa_Vertex4sv; exec->Viewport = _mesa_Viewport; /* 1.1 */ exec->AreTexturesResident = _mesa_AreTexturesResident; - exec->ArrayElement = _mesa_ArrayElement; exec->BindTexture = _mesa_BindTexture; exec->ColorPointer = _mesa_ColorPointer; exec->CopyTexImage1D = _mesa_CopyTexImage1D; @@ -470,15 +314,11 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) exec->CopyTexSubImage2D = _mesa_CopyTexSubImage2D; exec->DeleteTextures = _mesa_DeleteTextures; exec->DisableClientState = _mesa_DisableClientState; - exec->DrawArrays = _mesa_DrawArrays; - exec->DrawElements = _mesa_DrawElements; exec->EdgeFlagPointer = _mesa_EdgeFlagPointer; exec->EnableClientState = _mesa_EnableClientState; exec->GenTextures = _mesa_GenTextures; exec->GetPointerv = _mesa_GetPointerv; exec->IndexPointer = _mesa_IndexPointer; - exec->Indexub = _mesa_Indexub; - exec->Indexubv = _mesa_Indexubv; exec->InterleavedArrays = _mesa_InterleavedArrays; exec->IsTexture = _mesa_IsTexture; exec->NormalPointer = _mesa_NormalPointer; @@ -492,7 +332,6 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) /* 1.2 */ exec->CopyTexSubImage3D = _mesa_CopyTexSubImage3D; - exec->DrawRangeElements = _mesa_DrawRangeElements; exec->TexImage3D = _mesa_TexImage3D; exec->TexSubImage3D = _mesa_TexSubImage3D; @@ -634,38 +473,6 @@ _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize) /* ARB 1. GL_ARB_multitexture */ exec->ActiveTextureARB = _mesa_ActiveTextureARB; exec->ClientActiveTextureARB = _mesa_ClientActiveTextureARB; - exec->MultiTexCoord1dARB = _mesa_MultiTexCoord1dARB; - exec->MultiTexCoord1dvARB = _mesa_MultiTexCoord1dvARB; - exec->MultiTexCoord1fARB = _mesa_MultiTexCoord1fARB; - exec->MultiTexCoord1fvARB = _mesa_MultiTexCoord1fvARB; - exec->MultiTexCoord1iARB = _mesa_MultiTexCoord1iARB; - exec->MultiTexCoord1ivARB = _mesa_MultiTexCoord1ivARB; - exec->MultiTexCoord1sARB = _mesa_MultiTexCoord1sARB; - exec->MultiTexCoord1svARB = _mesa_MultiTexCoord1svARB; - exec->MultiTexCoord2dARB = _mesa_MultiTexCoord2dARB; - exec->MultiTexCoord2dvARB = _mesa_MultiTexCoord2dvARB; - exec->MultiTexCoord2fARB = _mesa_MultiTexCoord2fARB; - exec->MultiTexCoord2fvARB = _mesa_MultiTexCoord2fvARB; - exec->MultiTexCoord2iARB = _mesa_MultiTexCoord2iARB; - exec->MultiTexCoord2ivARB = _mesa_MultiTexCoord2ivARB; - exec->MultiTexCoord2sARB = _mesa_MultiTexCoord2sARB; - exec->MultiTexCoord2svARB = _mesa_MultiTexCoord2svARB; - exec->MultiTexCoord3dARB = _mesa_MultiTexCoord3dARB; - exec->MultiTexCoord3dvARB = _mesa_MultiTexCoord3dvARB; - exec->MultiTexCoord3fARB = _mesa_MultiTexCoord3fARB; - exec->MultiTexCoord3fvARB = _mesa_MultiTexCoord3fvARB; - exec->MultiTexCoord3iARB = _mesa_MultiTexCoord3iARB; - exec->MultiTexCoord3ivARB = _mesa_MultiTexCoord3ivARB; - exec->MultiTexCoord3sARB = _mesa_MultiTexCoord3sARB; - exec->MultiTexCoord3svARB = _mesa_MultiTexCoord3svARB; - exec->MultiTexCoord4dARB = _mesa_MultiTexCoord4dARB; - exec->MultiTexCoord4dvARB = _mesa_MultiTexCoord4dvARB; - exec->MultiTexCoord4fARB = _mesa_MultiTexCoord4fARB; - exec->MultiTexCoord4fvARB = _mesa_MultiTexCoord4fvARB; - exec->MultiTexCoord4iARB = _mesa_MultiTexCoord4iARB; - exec->MultiTexCoord4ivARB = _mesa_MultiTexCoord4ivARB; - exec->MultiTexCoord4sARB = _mesa_MultiTexCoord4sARB; - exec->MultiTexCoord4svARB = _mesa_MultiTexCoord4svARB; /* ARB 3. GL_ARB_transpose_matrix */ exec->LoadTransposeMatrixdARB = _mesa_LoadTransposeMatrixdARB; @@ -733,7 +540,7 @@ calculate_model_project_matrix( GLcontext *ctx ) &ctx->ProjectionMatrix, &ctx->ModelView ); - _math_matrix_analyze( &ctx->_ModelProjectMatrix ); + _math_matrix_analyse( &ctx->_ModelProjectMatrix ); } } @@ -824,8 +631,8 @@ update_drawbuffer( GLcontext *ctx ) static void update_projection( GLcontext *ctx ) { - _math_matrix_analyze( &ctx->ProjectionMatrix ); - + _math_matrix_analyse( &ctx->ProjectionMatrix ); + /* Recompute clip plane positions in clipspace. This is also done * in _mesa_ClipPlane(). */ @@ -921,7 +728,7 @@ void gl_update_state( GLcontext *ctx ) gl_print_state("", new_state); if (new_state & _NEW_MODELVIEW) - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); if (new_state & _NEW_PROJECTION) update_projection( ctx ); @@ -930,7 +737,7 @@ void gl_update_state( GLcontext *ctx ) _mesa_update_texture_matrices( ctx ); if (new_state & _NEW_COLOR_MATRIX) - _math_matrix_analyze( &ctx->ColorMatrix ); + _math_matrix_analyse( &ctx->ColorMatrix ); /* References ColorMatrix.type (derived above). */ diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index e481bedf24f..eee2a3a6ae6 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -1,4 +1,4 @@ -/* $Id: texstate.c,v 1.24 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: texstate.c,v 1.25 2000/11/24 10:25:06 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -1116,7 +1116,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) { - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); } gl_transform_vector( texUnit->EyePlaneS, params, ctx->ModelView.inv ); @@ -1164,7 +1164,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) { - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); } gl_transform_vector( texUnit->EyePlaneT, params, ctx->ModelView.inv ); @@ -1208,7 +1208,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) { - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); } gl_transform_vector( texUnit->EyePlaneR, params, ctx->ModelView.inv ); @@ -1244,7 +1244,7 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) { - _math_matrix_analyze( &ctx->ModelView ); + _math_matrix_analyse( &ctx->ModelView ); } gl_transform_vector( texUnit->EyePlaneQ, params, ctx->ModelView.inv ); @@ -1258,6 +1258,9 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" ); return; } + + if (ctx->Driver.TexGen) + ctx->Driver.TexGen( ctx, coord, pname, params ); ctx->NewState |= _NEW_TEXTURE; } diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index d03f0b79ff0..7b9b1052c21 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -1,4 +1,4 @@ -/* $Id: varray.c,v 1.32 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: varray.c,v 1.33 2000/11/24 10:25:06 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -692,3 +692,48 @@ _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) +/* Transform the array components now, upto the setup call. When + * actual draw commands arrive, the data will be merged prior to + * calling render_vb. + */ +void +_mesa_LockArraysEXT(GLint first, GLsizei count) +{ + GET_CURRENT_CONTEXT(ctx); + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx, "glLockArraysEXT" ); + + if (MESA_VERBOSE & VERBOSE_API) + fprintf(stderr, "glLockArrays %d %d\n", first, count); + + if (first == 0 && count > 0 && count <= ctx->Const.MaxArrayLockSize) { + ctx->Array.LockFirst = first; + ctx->Array.LockCount = count; + } + else { + ctx->Array.LockFirst = 0; + ctx->Array.LockCount = 0; + } + + ctx->NewState |= _NEW_ARRAY; + + if (ctx->Driver.LockArraysEXT) + ctx->Driver.LockArraysEXT( ctx, first, count ); +} + + +void +_mesa_UnlockArraysEXT( void ) +{ + GET_CURRENT_CONTEXT(ctx); + ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx, "glUnlockArraysEXT" ); + + if (MESA_VERBOSE & VERBOSE_API) + fprintf(stderr, "glUnlockArrays\n"); + + ctx->Array.LockFirst = 0; + ctx->Array.LockCount = 0; + ctx->NewState |= _NEW_ARRAY; + + if (ctx->Driver.UnlockArraysEXT) + ctx->Driver.UnlockArraysEXT( ctx ); +} diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h index 3e30cf5bf1f..c365d914a57 100644 --- a/src/mesa/main/varray.h +++ b/src/mesa/main/varray.h @@ -1,4 +1,4 @@ -/* $Id: varray.h,v 1.10 2000/11/22 07:32:17 joukj Exp $ */ +/* $Id: varray.h,v 1.11 2000/11/24 10:25:06 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -36,6 +36,12 @@ extern void _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); +extern void +_mesa_UnlockArraysEXT( void ); + +extern void +_mesa_LockArraysEXT(GLint first, GLsizei count); + extern void _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr); diff --git a/src/mesa/math/m_matrix.c b/src/mesa/math/m_matrix.c index 0a722fe3ea1..0e04e7c8ab9 100644 --- a/src/mesa/math/m_matrix.c +++ b/src/mesa/math/m_matrix.c @@ -1,4 +1,4 @@ -/* $Id: m_matrix.c,v 1.3 2000/11/20 15:16:33 brianp Exp $ */ +/* $Id: m_matrix.c,v 1.4 2000/11/24 10:25:11 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -739,7 +739,7 @@ _math_matrix_ortho( GLmatrix *mat, /* Determine type and flags from scratch. This is expensive enough to * only want to do it once. */ -static void analyze_from_scratch( GLmatrix *mat ) +static void analyse_from_scratch( GLmatrix *mat ) { const GLfloat *m = mat->m; GLuint mask = 0; @@ -851,7 +851,7 @@ static void analyze_from_scratch( GLmatrix *mat ) /* Analyse a matrix given that its flags are accurate - this is the * more common operation, hopefully. */ -static void analyze_from_flags( GLmatrix *mat ) +static void analyse_from_flags( GLmatrix *mat ) { const GLfloat *m = mat->m; @@ -891,13 +891,13 @@ static void analyze_from_flags( GLmatrix *mat ) void -_math_matrix_analyze( GLmatrix *mat ) +_math_matrix_analyse( GLmatrix *mat ) { if (mat->flags & MAT_DIRTY_TYPE) { if (mat->flags & MAT_DIRTY_FLAGS) - analyze_from_scratch( mat ); + analyse_from_scratch( mat ); else - analyze_from_flags( mat ); + analyse_from_flags( mat ); } if (mat->inv && (mat->flags & MAT_DIRTY_INVERSE)) { diff --git a/src/mesa/math/m_matrix.h b/src/mesa/math/m_matrix.h index 8eedbdb9424..0d3c61dfe5e 100644 --- a/src/mesa/math/m_matrix.h +++ b/src/mesa/math/m_matrix.h @@ -1,4 +1,4 @@ -/* $Id: m_matrix.h,v 1.1 2000/11/16 21:05:41 keithw Exp $ */ +/* $Id: m_matrix.h,v 1.2 2000/11/24 10:25:11 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -151,7 +151,7 @@ extern void _math_matrix_copy( GLmatrix *to, const GLmatrix *from ); extern void -_math_matrix_analyze( GLmatrix *mat ); +_math_matrix_analyse( GLmatrix *mat ); extern void _math_matrix_print( const GLmatrix *m ); diff --git a/src/mesa/math/m_xform.c b/src/mesa/math/m_xform.c index 8257d806470..a6e34e9eb2b 100644 --- a/src/mesa/math/m_xform.c +++ b/src/mesa/math/m_xform.c @@ -1,4 +1,4 @@ -/* $Id: m_xform.c,v 1.3 2000/11/18 08:10:24 jtaylor Exp $ */ +/* $Id: m_xform.c,v 1.4 2000/11/24 10:25:11 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -173,7 +173,7 @@ void gl_transform_vector( GLfloat u[4], const GLfloat v[4], const GLfloat m[16] /* Useful for one-off point transformations, as in clipping. - * Note that because the matrix isn't analyzed we do too many + * Note that because the matrix isn't analysed we do too many * multiplies, and that the result is always 4-clean. */ void gl_transform_point_sz( GLfloat Q[4], const GLfloat M[16], diff --git a/src/mesa/swrast_setup/ss_vbtmp.h b/src/mesa/swrast_setup/ss_vbtmp.h index 47b30055000..1303883f4f4 100644 --- a/src/mesa/swrast_setup/ss_vbtmp.h +++ b/src/mesa/swrast_setup/ss_vbtmp.h @@ -55,7 +55,7 @@ static void TAG(rs)(struct vertex_buffer *VB, GLuint start, GLuint end) /* TODO: Get import_client_data to pad vectors out to 4 cleanly. */ - gl_import_client_data( VB, tnl->_RenderFlags, + _tnl_import_client_data( VB, tnl->_RenderFlags, (VB->ClipOrMask ? /* VEC_CLEAN| */VEC_WRITABLE|VEC_GOOD_STRIDE : /* VEC_CLEAN| */VEC_GOOD_STRIDE)); diff --git a/src/mesa/tnl/t_context.c b/src/mesa/tnl/t_context.c index 78608459b94..457aa1c85fc 100644 --- a/src/mesa/tnl/t_context.c +++ b/src/mesa/tnl/t_context.c @@ -1,5 +1,6 @@ #include "mtypes.h" #include "mem.h" +#include "vtxfmt.h" #include "t_context.h" #include "t_clip.h" @@ -15,10 +16,11 @@ #include "t_vb.h" #include "t_vbrender.h" #include "t_vbxform.h" +#include "t_vtxfmt.h" #include "tnl.h" #if !defined(THREADS) -struct immediate *_mesa_CurrentInput = NULL; +struct immediate *_tnl_CurrentInput = NULL; #endif @@ -31,9 +33,9 @@ _tnl_flush_vertices( GLcontext *ctx, GLuint flush_flags ) if ((IM->Flag[IM->Count] & (VERT_BEGIN|VERT_END)) != VERT_END || (flush_flags & (FLUSH_STORED_VERTICES|FLUSH_UPDATE_CURRENT))) { - if (IM->Flag[IM->Start]) - _mesa_flush_vb( ctx ); - + if (IM->Flag[IM->Start]) + _tnl_maybe_transform_vb( IM ); + /* Although this code updates the ctx->Current values, that bit * is left set as there is no easy mechanism to set it * elsewhere. This means that each time core wants to examine @@ -50,6 +52,53 @@ _tnl_flush_vertices( GLcontext *ctx, GLuint flush_flags ) } + + void +_tnl_MakeCurrent( GLcontext *ctx, + GLframebuffer *drawBuffer, + GLframebuffer *readBuffer ) +{ +#ifndef THREADS + SET_IMMEDIATE( ctx, TNL_VB(ctx)->IM ); +#endif +} + + +/* Update all state that references _NeedEyeCoords + */ + void +_tnl_LightingSpaceChange( GLcontext *ctx ) +{ + _tnl_update_normal_transform( ctx ); +} + + +static void +install_driver_callbacks( GLcontext *ctx ) +{ + ctx->Driver.RenderVBCulledTab = _tnl_render_tab_cull; + ctx->Driver.RenderVBClippedTab = _tnl_render_tab_clipped; + ctx->Driver.RenderVBRawTab = _tnl_render_tab_raw; + ctx->Driver.NewList = _tnl_NewList; + ctx->Driver.EndList = _tnl_EndList; + ctx->Driver.FlushVertices = _tnl_flush_vertices; + ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT; + ctx->Driver.LightingSpaceChange = _tnl_LightingSpaceChange; + ctx->Driver.MakeCurrent = _tnl_MakeCurrent; + ctx->Driver.VertexPointer = _tnl_VertexPointer; + ctx->Driver.NormalPointer = _tnl_NormalPointer; + ctx->Driver.ColorPointer = _tnl_ColorPointer; + ctx->Driver.FogCoordPointer = _tnl_FogCoordPointer; + ctx->Driver.IndexPointer = _tnl_IndexPointer; + ctx->Driver.SecondaryColorPointer = _tnl_SecondaryColorPointer; + ctx->Driver.TexCoordPointer = _tnl_TexCoordPointer; + ctx->Driver.EdgeFlagPointer = _tnl_EdgeFlagPointer; + ctx->Driver.LockArraysEXT = _tnl_LockArraysEXT; + ctx->Driver.UnlockArraysEXT = _tnl_UnlockArraysEXT; +} + + + GLboolean _tnl_CreateContext( GLcontext *ctx ) { @@ -61,13 +110,13 @@ _tnl_CreateContext( GLcontext *ctx ) */ if (firsttime) { firsttime = 0; - _tnl_clip_init( ); - _tnl_eval_init( ); - _tnl_shade_init( ); - _tnl_texture_init( ); - _tnl_trans_elt_init( ); - _tnl_vbrender_init( ); - _tnl_stages_init( ); + _tnl_clip_init(); + _tnl_eval_init(); + _tnl_shade_init(); + _tnl_texture_init(); + _tnl_trans_elt_init(); + _tnl_vbrender_init(); + _tnl_stages_init(); } /* Create the TNLcontext structure @@ -79,7 +128,7 @@ _tnl_CreateContext( GLcontext *ctx ) /* Create and hook in the data structures available from ctx. */ - ctx->swtnl_vb = (void *)gl_vb_create_for_immediate( ctx ); + ctx->swtnl_vb = (void *)_tnl_vb_create_for_immediate( ctx ); if (!ctx->swtnl_vb) { FREE(tnl); ctx->swtnl_context = 0; @@ -93,6 +142,12 @@ _tnl_CreateContext( GLcontext *ctx ) */ _tnl_dlist_init( ctx ); _tnl_pipeline_init( ctx ); + _tnl_vtxfmt_init( ctx ); + _tnl_cva_init( ctx ); + + _tnl_reset_vb( TNL_VB(ctx) ); + _tnl_reset_input( ctx, 0, 0 ); /* initially outside begin/end */ + tnl->_CurrentFlag = (VERT_NORM | VERT_INDEX | @@ -108,30 +163,14 @@ _tnl_CreateContext( GLcontext *ctx ) tnl->_CurrentPrimitive = GL_POLYGON+1; - gl_reset_vb( TNL_VB(ctx) ); - gl_reset_input( ctx ); - + /* Hook our functions into exec and compile dispatch tables. + */ + _mesa_install_save_vtxfmt( ctx, &tnl->vtxfmt ); + _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt ); - /* Set a few default values in the driver struct. This is a - * temporary mechanism. + /* Set a few default values in the driver struct. */ - ctx->Driver.RenderVBCulledTab = _tnl_render_tab_cull; - ctx->Driver.RenderVBClippedTab = _tnl_render_tab_clipped; - ctx->Driver.RenderVBRawTab = _tnl_render_tab_raw; - ctx->Driver.NewList = _tnl_NewList; - ctx->Driver.EndList = _tnl_EndList; - ctx->Driver.FlushVertices = _tnl_flush_vertices; - ctx->Driver.NeedFlush = FLUSH_UPDATE_CURRENT; - ctx->Driver.LightingSpaceChange = _tnl_LightingSpaceChange; - ctx->Driver.MakeCurrent = _tnl_MakeCurrent; - ctx->Driver.VertexPointer = _tnl_VertexPointer; - ctx->Driver.NormalPointer = _tnl_NormalPointer; - ctx->Driver.ColorPointer = _tnl_ColorPointer; - ctx->Driver.FogCoordPointer = _tnl_FogCoordPointer; - ctx->Driver.IndexPointer = _tnl_IndexPointer; - ctx->Driver.SecondaryColorPointer = _tnl_SecondaryColorPointer; - ctx->Driver.TexCoordPointer = _tnl_TexCoordPointer; - ctx->Driver.EdgeFlagPointer = _tnl_EdgeFlagPointer; + install_driver_callbacks(ctx); return GL_TRUE; } @@ -143,9 +182,9 @@ _tnl_DestroyContext( GLcontext *ctx ) TNLcontext *tnl = TNL_CONTEXT(ctx); if (TNL_CURRENT_IM(ctx) != TNL_VB(ctx)->IM) - gl_immediate_free( TNL_CURRENT_IM(ctx) ); + _tnl_immediate_free( TNL_CURRENT_IM(ctx) ); - gl_vb_free( TNL_VB(ctx) ); + _tnl_vb_free( TNL_VB(ctx) ); /* Free cache of immediate buffers. */ while (tnl->nr_im_queued-- > 0) { @@ -156,23 +195,15 @@ _tnl_DestroyContext( GLcontext *ctx ) } -/* Update all state that references _NeedEyeCoords - */ -void -_tnl_LightingSpaceChange( GLcontext *ctx ) -{ - _tnl_update_normal_transform( ctx ); -} - void _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) { if (new_state & _NEW_LIGHT) - gl_update_lighting_function(ctx); + _tnl_update_lighting_function(ctx); if (new_state & _NEW_ARRAY) - gl_update_client_state( ctx ); + _tnl_update_client_state( ctx ); if (new_state & _NEW_TEXTURE) if (ctx->_Enabled & ENABLE_TEXGEN_ANY) @@ -182,20 +213,54 @@ _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ) _DD_NEW_TRI_LIGHT_TWOSIDE | _DD_NEW_SEPERATE_SPECULAR | _DD_NEW_TRI_UNFILLED )) - gl_update_clipmask(ctx); + _tnl_update_clipmask(ctx); if (new_state & _TNL_NEW_NORMAL_TRANSFORM) _tnl_update_normal_transform( ctx ); - gl_update_pipelines(ctx); + _tnl_update_pipelines(ctx); } void -_tnl_MakeCurrent( GLcontext *ctx, - GLframebuffer *drawBuffer, - GLframebuffer *readBuffer ) +_tnl_wakeup_exec( GLcontext *ctx ) { -#ifndef THREADS - SET_IMMEDIATE( ctx, TNL_VB(ctx)->IM ); -#endif + TNLcontext *tnl = TNL_CONTEXT(ctx); + + fprintf(stderr, "%s\n", __FUNCTION__); + + install_driver_callbacks(ctx); + + /* Hook our functions into exec and compile dispatch tables. + */ + _mesa_install_exec_vtxfmt( ctx, &tnl->vtxfmt ); + + /* Call all appropriate driver callbacks to revive state. + */ + _tnl_MakeCurrent( ctx, ctx->DrawBuffer, ctx->ReadBuffer ); + _tnl_UnlockArraysEXT( ctx ); + _tnl_LockArraysEXT( ctx, ctx->Array.LockFirst, ctx->Array.LockCount ); + + /* Equivalent to calling all _tnl_*Pointer functions: + */ + tnl->_ArrayNewState = ~0; + + /* Assume we haven't been getting state updates either: + */ + _tnl_InvalidateState( ctx, ~0 ); + + /* Special state not restored by other methods: + */ + _tnl_recalc_current_flag( ctx ); } + +void +_tnl_wakeup_save_exec( GLcontext *ctx ) +{ + TNLcontext *tnl = TNL_CONTEXT(ctx); + + fprintf(stderr, "%s\n", __FUNCTION__); + + _tnl_wakeup_exec( ctx ); + _mesa_install_save_vtxfmt( ctx, &tnl->vtxfmt ); +} + diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index 484b6b12dff..5f6de86aac0 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -1,5 +1,5 @@ -/* $Id: t_context.h,v 1.3 2000/11/22 07:32:18 joukj Exp $ */ +/* $Id: t_context.h,v 1.4 2000/11/24 10:25:12 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -142,6 +142,9 @@ #define VERT_TEX3_1234 (VERT_TEX3_4|VERT_TEX3_123) #define VERT_TEX3_ANY VERT_TEX3_12 +#define VERT_TEX_ANY_ANY (VERT_TEX0_ANY|VERT_TEX1_ANY| \ + VERT_TEX2_ANY|VERT_TEX3_ANY) + #define NR_TEXSIZE_BITS 3 #define VERT_TEX_ANY(i) (VERT_TEX0_ANY << ((i) * NR_TEXSIZE_BITS)) @@ -173,12 +176,6 @@ VERT_FOG_COORD) -/* For beginstate - */ -#define VERT_BEGIN_0 0x1 /* glBegin (if initially inside beg/end) */ -#define VERT_BEGIN_1 0x2 /* glBegin (if initially outside beg/end) */ -#define VERT_ERROR_0 0x4 /* invalid_operation in initial state 0 */ -#define VERT_ERROR_1 0x8 /* invalid_operation in initial state 1 */ struct gl_pipeline; @@ -240,7 +237,6 @@ enum { #define VERT_ERROR_0 0x4 /* invalid_operation in initial state 0 */ #define VERT_ERROR_1 0x8 /* invalid_operation in initial state 1 */ - /* KW: Represents everything that can take place between a begin and * end, and can represent multiple begin/end pairs. This plus *any* * state variable (GLcontext) should be all you need to replay the @@ -259,7 +255,8 @@ struct immediate */ GLuint Start, Count; GLuint LastData; /* count or count+1 */ - GLuint AndFlag, OrFlag, BeginState; + GLuint AndFlag, OrFlag; + GLuint BeginState, SavedBeginState; GLuint LastPrimitive; GLuint ArrayAndFlags; /* precalc'ed for glArrayElt */ @@ -437,7 +434,7 @@ typedef struct vertex_buffer } TNLvertexbuffer; -typedef void (*gl_shade_func)( struct vertex_buffer *VB ); +typedef void (*shade_func)( struct vertex_buffer *VB ); typedef void (*clip_interp_func)( struct vertex_buffer *VB, GLuint dst, GLfloat t, GLuint in, GLuint out ); @@ -531,12 +528,26 @@ struct gl_cva { GLuint orflag; GLuint merge; + GLuint locked; GLuint lock_changed; GLuint last_orflag; GLuint last_array_flags; GLuint last_array_new_state; }; +/* These are used to make the ctx->Current values look like + * arrays (with zero StrideB). + */ +struct gl_fallback_arrays { + struct gl_client_array Normal; + struct gl_client_array Color; + struct gl_client_array SecondaryColor; + struct gl_client_array FogCoord; + struct gl_client_array Index; + struct gl_client_array TexCoord[MAX_TEXTURE_UNITS]; + struct gl_client_array EdgeFlag; +}; + typedef void (*texgen_func)( struct vertex_buffer *VB, @@ -577,18 +588,24 @@ typedef struct tnl_context { clip_poly_func *_poly_clip_tab; clip_line_func *_line_clip_tab; clip_interp_func _ClipInterpFunc; /* Clip interpolation function */ - normal_func *_NormalTransform; - gl_shade_func *_shade_func_tab; /* Current shading function table */ + normal_func *_NormalTransform; + shade_func *_shade_func_tab; /* Current shading function table */ GLenum _CurrentPrimitive; /* Prim or GL_POLYGON+1 */ GLuint _CurrentFlag; + GLboolean _ReplayHardBeginEnd; /* Display list execution of rect, etc */ + GLuint _RenderFlags; /* Active inputs to render stage */ /* Cache of unused immediate structs */ struct immediate *freed_im_queue; GLuint nr_im_queued; + struct gl_fallback_arrays Fallback; + + GLvertexformat vtxfmt; + } TNLcontext; @@ -597,7 +614,6 @@ typedef struct tnl_context { #define TNL_CURRENT_IM(ctx) ((struct immediate *)(ctx->swtnl_im)) #define TNL_VB(ctx) ((struct vertex_buffer *)(ctx->swtnl_vb)) -extern void _tnl_reset_immediate( GLcontext *ctx ); extern GLboolean _tnl_flush_vertices( GLcontext *ctx, GLuint flush_flags ); @@ -617,12 +633,12 @@ _tnl_LightingSpaceChange( GLcontext *ctx ); #define GET_IMMEDIATE struct immediate *IM = TNL_CURRENT_IM(((GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context()))) #define SET_IMMEDIATE(ctx, im) ctx->swtnl_im = (void *)im #else -extern struct immediate *_mesa_CurrentInput; -#define GET_IMMEDIATE struct immediate *IM = _mesa_CurrentInput +extern struct immediate *_tnl_CurrentInput; +#define GET_IMMEDIATE struct immediate *IM = _tnl_CurrentInput #define SET_IMMEDIATE(ctx, im) \ do { \ ctx->swtnl_im = (void *)im; \ - _mesa_CurrentInput = im; \ + _tnl_CurrentInput = im; \ } while (0) #endif diff --git a/src/mesa/tnl/t_pipeline.c b/src/mesa/tnl/t_pipeline.c index d61f63f9b3d..42b9d051556 100644 --- a/src/mesa/tnl/t_pipeline.c +++ b/src/mesa/tnl/t_pipeline.c @@ -1,4 +1,4 @@ -/* $Id: t_pipeline.c,v 1.3 2000/11/22 07:32:18 joukj Exp $ */ +/* $Id: t_pipeline.c,v 1.4 2000/11/24 10:25:12 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -41,6 +41,7 @@ #include "t_bbox.h" #include "t_clip.h" #include "t_cva.h" +#include "t_debug.h" #include "t_fog.h" #include "t_light.h" #include "t_pipeline.h" @@ -55,7 +56,7 @@ -void gl_print_pipe_ops( const char *msg, GLuint flags ) +void _tnl_print_pipe_ops( const char *msg, GLuint flags ) { fprintf(stderr, "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s\n", @@ -80,13 +81,13 @@ void gl_print_pipe_ops( const char *msg, GLuint flags ) /* Have to reset only those parts of the vb which are being recalculated. */ -void gl_reset_cva_vb( struct vertex_buffer *VB, GLuint stages ) +void _tnl_reset_cva_vb( struct vertex_buffer *VB, GLuint stages ) { GLcontext *ctx = VB->ctx; TNLcontext *tnl = TNL_CONTEXT(ctx); if (MESA_VERBOSE&VERBOSE_PIPELINE) - gl_print_pipe_ops( "reset cva vb", stages ); + _tnl_print_pipe_ops( "reset cva vb", stages ); if (stages & PIPE_OP_VERT_XFORM) { @@ -142,8 +143,8 @@ static void pipeline_ctr( struct gl_pipeline *p, GLcontext *ctx, GLuint type ) p->type = type; p->ops = 0; - for (i = 0 ; i < gl_default_nr_stages ; i++) - p->state_change |= gl_default_pipeline[i].state_change; + for (i = 0 ; i < _tnl_default_nr_stages ; i++) + p->state_change |= _tnl_default_pipeline[i].state_change; } @@ -151,12 +152,12 @@ void _tnl_pipeline_init( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); - MEMCPY( tnl->PipelineStage, - gl_default_pipeline, - sizeof(*gl_default_pipeline) * gl_default_nr_stages ); - - tnl->NrPipelineStages = gl_default_nr_stages; - + MEMCPY( tnl->PipelineStage, + _tnl_default_pipeline, + sizeof(*_tnl_default_pipeline) * _tnl_default_nr_stages ); + + tnl->NrPipelineStages = _tnl_default_nr_stages; + pipeline_ctr( &tnl->CVA.elt, ctx, PIPE_IMMEDIATE); pipeline_ctr( &tnl->CVA.pre, ctx, PIPE_PRECALC ); } @@ -224,7 +225,7 @@ static void build_full_precalc_pipeline( GLcontext *ctx ) if (MESA_VERBOSE & VERBOSE_PIPELINE) { fprintf(stderr, ": Rebuild pipeline\n"); - gl_print_vert_flags("orflag", cva->orflag); + _tnl_print_vert_flags("orflag", cva->orflag); } @@ -290,7 +291,7 @@ static void build_full_precalc_pipeline( GLcontext *ctx ) pre->changed_ops = changed_ops; } -void gl_build_precalc_pipeline( GLcontext *ctx ) +void _tnl_build_precalc_pipeline( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct gl_pipeline *pre = &tnl->CVA.pre; @@ -307,7 +308,7 @@ void gl_build_precalc_pipeline( GLcontext *ctx ) tnl->CVA.orflag = 0; if (MESA_VERBOSE&VERBOSE_PIPELINE) - gl_print_pipeline( ctx, pre ); + _tnl_print_pipeline( ctx, pre ); } @@ -378,7 +379,7 @@ static void build_full_immediate_pipeline( GLcontext *ctx ) -void gl_build_immediate_pipeline( GLcontext *ctx ) +void _tnl_build_immediate_pipeline( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct gl_pipeline *elt = &tnl->CVA.elt; @@ -392,12 +393,12 @@ void gl_build_immediate_pipeline( GLcontext *ctx ) tnl->CVA.orflag = 0; if (MESA_VERBOSE&VERBOSE_PIPELINE) - gl_print_pipeline( ctx, elt ); + _tnl_print_pipeline( ctx, elt ); } #define INTERESTED ~0 -void gl_update_pipelines( GLcontext *ctx ) +void _tnl_update_pipelines( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); GLuint newstate = ctx->NewState; @@ -476,7 +477,7 @@ void gl_update_pipelines( GLcontext *ctx ) cva->last_array_flags = tnl->_ArrayFlags; } -void gl_run_pipeline( struct vertex_buffer *VB ) +void _tnl_run_pipeline( struct vertex_buffer *VB ) { struct gl_pipeline *pipe = VB->pipeline; struct gl_pipeline_stage **stages = pipe->stages; @@ -484,8 +485,8 @@ void gl_run_pipeline( struct vertex_buffer *VB ) pipe->data_valid = 1; /* optimized stages might want to reset this. */ - if (0) gl_print_pipeline( VB->ctx, pipe ); - + if (0) _tnl_print_pipeline( VB->ctx, pipe ); + START_FAST_MATH(x); for ( VB->Culled = 0; *stages && !VB->Culled ; stages++ ) diff --git a/src/mesa/tnl/t_pipeline.h b/src/mesa/tnl/t_pipeline.h index 5609b79af90..b9ae641894f 100644 --- a/src/mesa/tnl/t_pipeline.h +++ b/src/mesa/tnl/t_pipeline.h @@ -1,4 +1,4 @@ -/* $Id: t_pipeline.h,v 1.2 2000/11/22 07:32:18 joukj Exp $ */ +/* $Id: t_pipeline.h,v 1.3 2000/11/24 10:25:12 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -36,24 +36,25 @@ #include "mtypes.h" #include "t_context.h" -extern void gl_update_materials( struct vertex_buffer *VB); - extern void _tnl_pipeline_init( GLcontext *ctx ); -extern void gl_update_pipelines( GLcontext *ctx ); -extern void gl_build_precalc_pipeline( GLcontext *ctx ); -extern void gl_build_immediate_pipeline( GLcontext *ctx ); +extern void _tnl_update_materials( struct vertex_buffer *VB); + +extern void _tnl_update_pipelines( GLcontext *ctx ); + +extern void _tnl_build_precalc_pipeline( GLcontext *ctx ); +extern void _tnl_build_immediate_pipeline( GLcontext *ctx ); -extern void gl_print_vert_flags( const char *name, GLuint flags ); -extern void gl_print_pipeline( GLcontext *ctx, struct gl_pipeline *p ); -extern void gl_print_active_pipeline( GLcontext *ctx, struct gl_pipeline *p ); +extern void _tnl_print_vert_flags( const char *name, GLuint flags ); +extern void _tnl_print_pipeline( GLcontext *ctx, struct gl_pipeline *p ); +extern void _tnl_print_active_pipeline( GLcontext *ctx, struct gl_pipeline *p ); -extern void gl_run_pipeline( struct vertex_buffer *VB ); +extern void _tnl_run_pipeline( struct vertex_buffer *VB ); -extern void gl_clean_color( struct vertex_buffer *VB ); +extern void _tnl_clean_color( struct vertex_buffer *VB ); -extern void gl_reset_cva_vb( struct vertex_buffer *VB, GLuint stages ); +extern void _tnl_reset_cva_vb( struct vertex_buffer *VB, GLuint stages ); -extern void gl_print_pipe_ops( const char *msg, GLuint flags ); +extern void _tnl_print_pipe_ops( const char *msg, GLuint flags ); #endif diff --git a/src/mesa/tnl/tnl.h b/src/mesa/tnl/tnl.h index c8207765903..c14ed296ad5 100644 --- a/src/mesa/tnl/tnl.h +++ b/src/mesa/tnl/tnl.h @@ -44,5 +44,19 @@ _tnl_DestroyContext( GLcontext *ctx ); extern void _tnl_InvalidateState( GLcontext *ctx, GLuint new_state ); +/* Functions to revive the tnl module after being unhooked from + * dispatch and/or driver callbacks. + */ + +/* Restore just the ctx->Exec table: + */ +extern void +_tnl_wakeup_exec( GLcontext *ctx ); + +/* Restore both ctx->Exec and ctx->Save: + */ +extern void +_tnl_wakeup_save_exec( GLcontext *ctx ); + #endif diff --git a/src/mesa/x86/common_x86_asm.h b/src/mesa/x86/common_x86_asm.h index f52f56da685..517e668ddb7 100644 --- a/src/mesa/x86/common_x86_asm.h +++ b/src/mesa/x86/common_x86_asm.h @@ -1,4 +1,4 @@ -/* $Id: common_x86_asm.h,v 1.3 2000/11/16 21:05:41 keithw Exp $ */ +/* $Id: common_x86_asm.h,v 1.4 2000/11/24 10:25:10 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -39,7 +39,7 @@ #ifndef __COMMON_X86_ASM_H__ #define __COMMON_X86_ASM_H__ -/* Do not reference types.h from this file. +/* Do not reference mtypes.h from this file. */ #include "common_x86_features.h"