📄 tdfx_state.c
字号:
GLint ref, GLuint mask ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL;}static voidtdfxDDStencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL;}static voidtdfxDDStencilOpSeparate( GLcontext *ctx, GLenum face, GLenum sfail, GLenum zfail, GLenum zpass ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL;}/* ============================================================= * Fog - orthographic fog still not working */static void tdfxUpdateFogAttrib( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GrFogMode_t mode; GrColor_t color; if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } if ( ctx->Fog.Enabled ) { if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) { mode = GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT; } else { mode = GR_FOG_WITH_TABLE_ON_Q; } } else { mode = GR_FOG_DISABLE; } color = TDFXPACKCOLOR888((GLubyte)(ctx->Fog.Color[0]*255.0F), (GLubyte)(ctx->Fog.Color[1]*255.0F), (GLubyte)(ctx->Fog.Color[2]*255.0F)); if ( fxMesa->Fog.Mode != mode ) { fxMesa->Fog.Mode = mode; fxMesa->dirty |= TDFX_UPLOAD_FOG_MODE; fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT;/*JJJ*/ } if ( fxMesa->Fog.Color != color ) { fxMesa->Fog.Color = color; fxMesa->dirty |= TDFX_UPLOAD_FOG_COLOR; } if ( fxMesa->Fog.TableMode != ctx->Fog.Mode || fxMesa->Fog.Density != ctx->Fog.Density || fxMesa->Fog.Near != ctx->Fog.Start || fxMesa->Fog.Far != ctx->Fog.End ) { switch( ctx->Fog.Mode ) { case GL_EXP: fxMesa->Glide.guFogGenerateExp( fxMesa->Fog.Table, ctx->Fog.Density ); break; case GL_EXP2: fxMesa->Glide.guFogGenerateExp2( fxMesa->Fog.Table, ctx->Fog.Density); break; case GL_LINEAR: fxMesa->Glide.guFogGenerateLinear( fxMesa->Fog.Table, ctx->Fog.Start, ctx->Fog.End ); break; } fxMesa->Fog.TableMode = ctx->Fog.Mode; fxMesa->Fog.Density = ctx->Fog.Density; fxMesa->Fog.Near = ctx->Fog.Start; fxMesa->Fog.Far = ctx->Fog.End; fxMesa->dirty |= TDFX_UPLOAD_FOG_TABLE; }}static void tdfxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_FOG; switch (pname) { case GL_FOG_COORDINATE_SOURCE_EXT: { GLenum p = (GLenum)*param; if (p == GL_FOG_COORDINATE_EXT) { _swrast_allow_vertex_fog(ctx, GL_TRUE); _swrast_allow_pixel_fog(ctx, GL_FALSE); _tnl_allow_vertex_fog( ctx, GL_TRUE); _tnl_allow_pixel_fog( ctx, GL_FALSE); } else { _swrast_allow_vertex_fog(ctx, GL_FALSE); _swrast_allow_pixel_fog(ctx, GL_TRUE); _tnl_allow_vertex_fog( ctx, GL_FALSE); _tnl_allow_pixel_fog( ctx, GL_TRUE); } break; } default: ; }}/* ============================================================= * Clipping */static int intersect_rect( drm_clip_rect_t *out, const drm_clip_rect_t *a, const drm_clip_rect_t *b){ *out = *a; if (b->x1 > out->x1) out->x1 = b->x1; if (b->y1 > out->y1) out->y1 = b->y1; if (b->x2 < out->x2) out->x2 = b->x2; if (b->y2 < out->y2) out->y2 = b->y2; if (out->x1 >= out->x2) return 0; if (out->y1 >= out->y2) return 0; return 1;}/* * Examine XF86 cliprect list and scissor state to recompute our * cliprect list. */void tdfxUpdateClipping( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); __DRIdrawablePrivate *dPriv = fxMesa->driDrawable; if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } assert(ctx); assert(fxMesa); assert(dPriv); if ( dPriv->x != fxMesa->x_offset || dPriv->y != fxMesa->y_offset || dPriv->w != fxMesa->width || dPriv->h != fxMesa->height ) { fxMesa->x_offset = dPriv->x; fxMesa->y_offset = dPriv->y; fxMesa->width = dPriv->w; fxMesa->height = dPriv->h; fxMesa->y_delta = fxMesa->screen_height - fxMesa->y_offset - fxMesa->height; tdfxUpdateViewport( ctx ); } if (fxMesa->scissoredClipRects && fxMesa->pClipRects) { free(fxMesa->pClipRects); } if (ctx->Scissor.Enabled) { /* intersect OpenGL scissor box with all cliprects to make a new * list of cliprects. */ drm_clip_rect_t scissor; int x1 = ctx->Scissor.X + fxMesa->x_offset; int y1 = fxMesa->screen_height - fxMesa->y_delta - ctx->Scissor.Y - ctx->Scissor.Height; int x2 = x1 + ctx->Scissor.Width; int y2 = y1 + ctx->Scissor.Height; scissor.x1 = MAX2(x1, 0); scissor.y1 = MAX2(y1, 0); scissor.x2 = MAX2(x2, 0); scissor.y2 = MAX2(y2, 0); assert(scissor.x2 >= scissor.x1); assert(scissor.y2 >= scissor.y1); fxMesa->pClipRects = malloc(dPriv->numClipRects * sizeof(drm_clip_rect_t)); if (fxMesa->pClipRects) { int i; fxMesa->numClipRects = 0; for (i = 0; i < dPriv->numClipRects; i++) { if (intersect_rect(&fxMesa->pClipRects[fxMesa->numClipRects], &scissor, &dPriv->pClipRects[i])) { fxMesa->numClipRects++; } } fxMesa->scissoredClipRects = GL_TRUE; } else { /* out of memory, forgo scissor */ fxMesa->numClipRects = dPriv->numClipRects; fxMesa->pClipRects = dPriv->pClipRects; fxMesa->scissoredClipRects = GL_FALSE; } } else { fxMesa->numClipRects = dPriv->numClipRects; fxMesa->pClipRects = dPriv->pClipRects; fxMesa->scissoredClipRects = GL_FALSE; } fxMesa->dirty |= TDFX_UPLOAD_CLIP;}/* ============================================================= * Culling */void tdfxUpdateCull( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GrCullMode_t mode = GR_CULL_DISABLE; /* KW: don't need to check raster_primitive here as we don't * attempt to draw lines or points with triangles. */ if ( ctx->Polygon.CullFlag ) { switch ( ctx->Polygon.CullFaceMode ) { case GL_FRONT: if ( ctx->Polygon.FrontFace == GL_CCW ) { mode = GR_CULL_POSITIVE; } else { mode = GR_CULL_NEGATIVE; } break; case GL_BACK: if ( ctx->Polygon.FrontFace == GL_CCW ) { mode = GR_CULL_NEGATIVE; } else { mode = GR_CULL_POSITIVE; } break; case GL_FRONT_AND_BACK: /* Handled as a fallback on triangles in tdfx_tris.c */ return; default: ASSERT(0); break; } } if ( fxMesa->CullMode != mode ) { fxMesa->CullMode = mode; fxMesa->dirty |= TDFX_UPLOAD_CULL; }}static void tdfxDDCullFace( GLcontext *ctx, GLenum mode ){ tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CULL;}static void tdfxDDFrontFace( GLcontext *ctx, GLenum mode ){ tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CULL;}/* ============================================================= * Line drawing. */static void tdfxUpdateLine( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } FLUSH_BATCH( fxMesa ); fxMesa->dirty |= TDFX_UPLOAD_LINE;}static void tdfxDDLineWidth( GLcontext *ctx, GLfloat width ){ tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_LINE;}/* ============================================================= * Color Attributes */static void tdfxDDColorMask( GLcontext *ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); if ( fxMesa->Color.ColorMask[RCOMP] != r || fxMesa->Color.ColorMask[GCOMP] != g || fxMesa->Color.ColorMask[BCOMP] != b || fxMesa->Color.ColorMask[ACOMP] != a ) { fxMesa->Color.ColorMask[RCOMP] = r; fxMesa->Color.ColorMask[GCOMP] = g; fxMesa->Color.ColorMask[BCOMP] = b; fxMesa->Color.ColorMask[ACOMP] = a; fxMesa->dirty |= TDFX_UPLOAD_COLOR_MASK; if (ctx->Visual.redBits < 8) { /* Can't do RGB colormasking in 16bpp mode. */ /* We can completely ignore the alpha mask. */ FALLBACK( fxMesa, TDFX_FALLBACK_COLORMASK, (r != g || g != b) ); } }}static void tdfxDDClearColor( GLcontext *ctx, const GLfloat color[4] ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GLubyte c[4]; FLUSH_BATCH( fxMesa ); CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); fxMesa->Color.ClearColor = TDFXPACKCOLOR888( c[0], c[1], c[2] ); fxMesa->Color.ClearAlpha = c[3];}/* ============================================================= * Light Model */static void tdfxDDLightModelfv( GLcontext *ctx, GLenum pname, const GLfloat *param ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); if ( pname == GL_LIGHT_MODEL_COLOR_CONTROL ) { FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR, (ctx->Light.Enabled && ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR )); }}static void tdfxDDShadeModel( GLcontext *ctx, GLenum mode ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); /* FIXME: Can we implement native flat shading? */ FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_TEXTURE;}/* ============================================================= * Scissor */static voidtdfxDDScissor(GLcontext * ctx, GLint x, GLint y, GLsizei w, GLsizei h){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CLIP;}/* ============================================================= * Render */static void tdfxUpdateRenderAttrib( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->dirty |= TDFX_UPLOAD_RENDER_BUFFER;}/* ============================================================= * Viewport */void tdfxUpdateViewport( GLcontext *ctx ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat *m = fxMesa->hw_viewport; m[MAT_SX] = v[MAT_SX]; m[MAT_TX] = v[MAT_TX] + fxMesa->x_offset + TRI_X_OFFSET; m[MAT_SY] = v[MAT_SY]; m[MAT_TY] = v[MAT_TY] + fxMesa->y_delta + TRI_Y_OFFSET; m[MAT_SZ] = v[MAT_SZ]; m[MAT_TZ] = v[MAT_TZ]; fxMesa->SetupNewInputs |= VERT_BIT_POS;}static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_VIEWPORT;}static void tdfxDDDepthRange( GLcontext *ctx, GLclampd nearVal, GLclampd farVal ){ tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_VIEWPORT;}/* ============================================================= * State enable/disable */static void tdfxDDEnable( GLcontext *ctx, GLenum cap, GLboolean state ){ tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); switch ( cap ) { case GL_ALPHA_TEST: FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_ALPHA; break; case GL_BLEND: FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_ALPHA; FALLBACK( fxMesa, TDFX_FALLBACK_LOGICOP, (ctx->Color.ColorLogicOpEnabled && ctx->Color.LogicOp != GL_COPY)/*JJJ - more blending*/); break; case GL_CULL_FACE: FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CULL; break; case GL_DEPTH_TEST: FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_DEPTH; break; case GL_DITHER: FLUSH_BATCH( fxMesa ); if ( state ) { fxMesa->Color.Dither = GR_DITHER_2x2; } else { fxMesa->Color.Dither = GR_DITHER_DISABLE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -