⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tdfx_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
                           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 + -