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

📄 r200_state.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
   R200_ROP_OR_REVERSE,   R200_ROP_COPY_INVERTED,   R200_ROP_OR_INVERTED,   R200_ROP_NAND,   R200_ROP_SET,};static void r200LogicOpCode( GLcontext *ctx, GLenum opcode ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLuint rop = (GLuint)opcode - GL_CLEAR;   ASSERT( rop < 16 );   R200_STATECHANGE( rmesa, msk );   rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = r200_rop_tab[rop];}void r200SetCliprects( r200ContextPtr rmesa, GLenum mode ){   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;   switch ( mode ) {   case GL_FRONT_LEFT:      rmesa->numClipRects = dPriv->numClipRects;      rmesa->pClipRects = dPriv->pClipRects;      break;   case GL_BACK_LEFT:      /* Can't ignore 2d windows if we are page flipping.       */      if ( dPriv->numBackClipRects == 0 || rmesa->doPageFlip ) {	 rmesa->numClipRects = dPriv->numClipRects;	 rmesa->pClipRects = dPriv->pClipRects;      }      else {	 rmesa->numClipRects = dPriv->numBackClipRects;	 rmesa->pClipRects = dPriv->pBackClipRects;      }      break;   default:      fprintf(stderr, "bad mode in r200SetCliprects\n");      return;   }   if (rmesa->state.scissor.enabled)      r200RecalcScissorRects( rmesa );}static void r200DrawBuffer( GLcontext *ctx, GLenum mode ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   if (R200_DEBUG & DEBUG_DRI)      fprintf(stderr, "%s %s\n", __FUNCTION__,	      _mesa_lookup_enum_by_nr( mode ));   R200_FIREVERTICES(rmesa);	/* don't pipeline cliprect changes */   /*    * _ColorDrawBufferMask is easier to cope with than <mode>.    * Check for software fallback, update cliprects.    */   switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {   case BUFFER_BIT_FRONT_LEFT:      FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_FALSE );      r200SetCliprects( rmesa, GL_FRONT_LEFT );      break;   case BUFFER_BIT_BACK_LEFT:      FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_FALSE );      r200SetCliprects( rmesa, GL_BACK_LEFT );      break;   default:      /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */      FALLBACK( rmesa, R200_FALLBACK_DRAW_BUFFER, GL_TRUE );      return;   }   /* We'll set the drawing engine's offset/pitch parameters later    * when we update other state.    */}static void r200ReadBuffer( GLcontext *ctx, GLenum mode ){   /* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */}/* ============================================================= * State enable/disable */static void r200Enable( GLcontext *ctx, GLenum cap, GLboolean state ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLuint p, flag;   if ( R200_DEBUG & DEBUG_STATE )      fprintf( stderr, "%s( %s = %s )\n", __FUNCTION__,	       _mesa_lookup_enum_by_nr( cap ),	       state ? "GL_TRUE" : "GL_FALSE" );   switch ( cap ) {      /* Fast track this one...       */   case GL_TEXTURE_1D:   case GL_TEXTURE_2D:   case GL_TEXTURE_3D:      break;   case GL_ALPHA_TEST:      R200_STATECHANGE( rmesa, ctx );      if (state) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_ALPHA_TEST_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ALPHA_TEST_ENABLE;      }      break;   case GL_BLEND:   case GL_COLOR_LOGIC_OP:      r200_set_blend_state( ctx );      break;   case GL_CLIP_PLANE0:   case GL_CLIP_PLANE1:   case GL_CLIP_PLANE2:   case GL_CLIP_PLANE3:   case GL_CLIP_PLANE4:   case GL_CLIP_PLANE5:       p = cap-GL_CLIP_PLANE0;      R200_STATECHANGE( rmesa, tcl );      if (state) {	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (R200_UCP_ENABLE_0<<p);	 r200ClipPlane( ctx, cap, NULL );      }      else {	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(R200_UCP_ENABLE_0<<p);      }      break;   case GL_COLOR_MATERIAL:      r200ColorMaterial( ctx, 0, 0 );      r200UpdateMaterial( ctx );      break;   case GL_CULL_FACE:      r200CullFace( ctx, 0 );      break;   case GL_DEPTH_TEST:      R200_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_Z_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_Z_ENABLE;      }      break;   case GL_DITHER:      R200_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_DITHER_ENABLE;	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE;	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;      }      break;   case GL_FOG:      R200_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_FOG_ENABLE;	 r200Fogfv( ctx, GL_FOG_MODE, NULL );      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_FOG_ENABLE;	 R200_STATECHANGE(rmesa, tcl);	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~R200_TCL_FOG_MASK;      }      r200UpdateSpecular( ctx ); /* for PK_SPEC */      if (rmesa->TclFallback) 	 r200ChooseVertexState( ctx );      _mesa_allow_light_in_model( ctx, !state );      break;   case GL_LIGHT0:   case GL_LIGHT1:   case GL_LIGHT2:   case GL_LIGHT3:   case GL_LIGHT4:   case GL_LIGHT5:   case GL_LIGHT6:   case GL_LIGHT7:      R200_STATECHANGE(rmesa, tcl);      p = cap - GL_LIGHT0;      if (p&1) 	 flag = (R200_LIGHT_1_ENABLE |		 R200_LIGHT_1_ENABLE_AMBIENT | 		 R200_LIGHT_1_ENABLE_SPECULAR);      else	 flag = (R200_LIGHT_0_ENABLE |		 R200_LIGHT_0_ENABLE_AMBIENT | 		 R200_LIGHT_0_ENABLE_SPECULAR);      if (state)	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] |= flag;      else	 rmesa->hw.tcl.cmd[p/2 + TCL_PER_LIGHT_CTL_0] &= ~flag;      /*        */      update_light_colors( ctx, p );      break;   case GL_LIGHTING:      r200UpdateSpecular(ctx);      break;   case GL_LINE_SMOOTH:      R200_STATECHANGE( rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_LINE;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_LINE;      }      break;   case GL_LINE_STIPPLE:      R200_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_PATTERN_ENABLE;      } else {	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PATTERN_ENABLE;      }      break;   case GL_NORMALIZE:      R200_STATECHANGE( rmesa, tcl );      if ( state ) {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_NORMALIZE_NORMALS;      } else {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_NORMALIZE_NORMALS;      }      break;      /* Pointsize registers on r200 only work for point sprites, and point smooth       * doesn't work for point sprites (and isn't needed for 1.0 sized aa points).       * In any case, setting pointmin == pointsizemax == 1.0 for aa points       * is enough to satisfy conform.       */   case GL_POINT_SMOOTH:      break;      /* These don't really do anything, as we don't use the 3vtx       * primitives yet.       */#if 0   case GL_POLYGON_OFFSET_POINT:      R200_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_POINT;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_POINT;      }      break;   case GL_POLYGON_OFFSET_LINE:      R200_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_LINE;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_LINE;      }      break;#endif   case GL_POLYGON_OFFSET_FILL:      R200_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  R200_ZBIAS_ENABLE_TRI;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~R200_ZBIAS_ENABLE_TRI;      }      break;   case GL_POLYGON_SMOOTH:      R200_STATECHANGE( rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  R200_ANTI_ALIAS_POLY;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~R200_ANTI_ALIAS_POLY;      }      break;   case GL_POLYGON_STIPPLE:      R200_STATECHANGE(rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_RE_CNTL] |=  R200_STIPPLE_ENABLE;      } else {	 rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_STIPPLE_ENABLE;      }      break;   case GL_RESCALE_NORMAL_EXT: {      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;      R200_STATECHANGE( rmesa, tcl );      if ( tmp ) {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;      } else {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;      }      break;   }   case GL_SCISSOR_TEST:      R200_FIREVERTICES( rmesa );      rmesa->state.scissor.enabled = state;      r200UpdateScissor( ctx );      break;   case GL_STENCIL_TEST:      if ( rmesa->state.stencil.hwBuffer ) {	 R200_STATECHANGE( rmesa, ctx );	 if ( state ) {	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_STENCIL_ENABLE;	 } else {	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_STENCIL_ENABLE;	 }      } else {	 FALLBACK( rmesa, R200_FALLBACK_STENCIL, state );      }      break;   case GL_TEXTURE_GEN_Q:   case GL_TEXTURE_GEN_R:   case GL_TEXTURE_GEN_S:   case GL_TEXTURE_GEN_T:      /* Picked up in r200UpdateTextureState.       */      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;       break;   case GL_COLOR_SUM_EXT:      r200UpdateSpecular ( ctx );      break;   case GL_VERTEX_PROGRAM_ARB:      TCL_FALLBACK(rmesa->glCtx, R200_TCL_FALLBACK_VERTEX_PROGRAM, state);      break;   case GL_FRAGMENT_SHADER_ATI:      if ( !state ) {	 /* restore normal tex env colors and make sure tex env combine will get updated	    mark env atoms dirty (as their data was overwritten by afs even	    if they didn't change) and restore tex coord routing */	 GLuint unit;	 for (unit = 0; unit < R200_MAX_TEXTURE_UNITS; unit++) {	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] &=		~(R200_TXFORMAT_ST_ROUTE_MASK | R200_TXFORMAT_LOOKUP_DISABLE);	    rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT] |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT;	    /* need to guard this with drmSupportsFragmentShader? Should never get here if	       we don't announce ATI_fs, right? */	    rmesa->hw.tex[unit].cmd[TEX_PP_TXMULTI_CTL] = 0;	    R200_STATECHANGE( rmesa, pix[unit] );	    R200_STATECHANGE( rmesa, tex[unit] );         }	 rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0;	 R200_STATECHANGE( rmesa, cst );	 R200_STATECHANGE( rmesa, tf );      }      else {	 /* need to mark this dirty as pix/tf atoms have overwritten the data	    even if the data in the atoms didn't change */	 R200_STATECHANGE( rmesa, atf );	 R200_STATECHANGE( rmesa, afs[1] );	 /* everything else picked up in r200UpdateTextureState hopefully */      }      break;   default:      return;   }}void r200LightingSpaceChange( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLboolean tmp;   if (R200_DEBUG & DEBUG_STATE)       fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);   if (ctx->_NeedEyeCoords)      tmp = ctx->Transform.RescaleNormals;   else      tmp = !ctx->Transform.RescaleNormals;   R200_STATECHANGE( rmesa, tcl );   if ( tmp ) {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |=  R200_RESCALE_NORMALS;   } else {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_RESCALE_NORMALS;   }   if (R200_DEBUG & DEBUG_STATE)       fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0]);}/* ============================================================= * Deferred state management - matrices, textures, other? */static void upload_matrix( r200ContextPtr rmesa, GLfloat *src, int idx ){   float *dest = ((float *)R200_DB_STATE( mat[idx] ))+MAT_ELT_0;   int i;   for (i = 0 ; i < 4 ; i++) {      *dest++ = src[i];      *dest++ = src[i+4];      *dest++ = src[i+8];      *dest++ = src[i+12];   }   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );}static void upload_matrix_t( r200ContextPtr rmesa, const GLfloat *src, int idx )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -