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

📄 radeon_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;      }      /* Catch a possible fallback:       */      if (state) {	 ctx->Driver.BlendEquationSeparate( ctx,					    ctx->Color.BlendEquationRGB,					    ctx->Color.BlendEquationA );	 ctx->Driver.BlendFuncSeparate( ctx, ctx->Color.BlendSrcRGB,					ctx->Color.BlendDstRGB,					ctx->Color.BlendSrcA,					ctx->Color.BlendDstA );      }      else {	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_FUNC, GL_FALSE );	 FALLBACK( rmesa, RADEON_FALLBACK_BLEND_EQ, GL_FALSE );      }      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;      RADEON_STATECHANGE( rmesa, tcl );      if (state) {	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= (RADEON_UCP_ENABLE_0<<p);	 radeonClipPlane( ctx, cap, NULL );      }      else {	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~(RADEON_UCP_ENABLE_0<<p);      }      break;   case GL_COLOR_MATERIAL:      radeonColorMaterial( ctx, 0, 0 );      radeonUpdateMaterial( ctx );      break;   case GL_CULL_FACE:      radeonCullFace( ctx, 0 );      break;   case GL_DEPTH_TEST:      RADEON_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_Z_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_Z_ENABLE;      }      break;   case GL_DITHER:      RADEON_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;      }      break;   case GL_FOG:      RADEON_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= RADEON_FOG_ENABLE;	 radeonFogfv( ctx, GL_FOG_MODE, NULL );      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_FOG_ENABLE;	 RADEON_STATECHANGE(rmesa, tcl);	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;      }      radeonUpdateSpecular( ctx ); /* for PK_SPEC */      _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:      RADEON_STATECHANGE(rmesa, tcl);      p = cap - GL_LIGHT0;      if (p&1) 	 flag = (RADEON_LIGHT_1_ENABLE |		 RADEON_LIGHT_1_ENABLE_AMBIENT | 		 RADEON_LIGHT_1_ENABLE_SPECULAR);      else	 flag = (RADEON_LIGHT_0_ENABLE |		 RADEON_LIGHT_0_ENABLE_AMBIENT | 		 RADEON_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:      RADEON_STATECHANGE(rmesa, tcl);      radeonUpdateSpecular(ctx);      check_twoside_fallback( ctx );      break;   case GL_LINE_SMOOTH:      RADEON_STATECHANGE( rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_LINE;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_LINE;      }      break;   case GL_LINE_STIPPLE:      RADEON_STATECHANGE( rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_PATTERN_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_PATTERN_ENABLE;      }      break;   case GL_COLOR_LOGIC_OP:      RADEON_STATECHANGE( rmesa, ctx );      if ( (ctx->Color.ColorLogicOpEnabled || (ctx->Color.BlendEnabled	    && ctx->Color.BlendEquationRGB == GL_LOGIC_OP)) ) {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_ROP_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_ROP_ENABLE;      }      break;         case GL_NORMALIZE:      RADEON_STATECHANGE( rmesa, tcl );      if ( state ) {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_NORMALIZE_NORMALS;      } else {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_NORMALIZE_NORMALS;      }      break;   case GL_POLYGON_OFFSET_POINT:      RADEON_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_POINT;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_POINT;      }      break;   case GL_POLYGON_OFFSET_LINE:      RADEON_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_LINE;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_LINE;      }      break;   case GL_POLYGON_OFFSET_FILL:      RADEON_STATECHANGE( rmesa, set );      if ( state ) {	 rmesa->hw.set.cmd[SET_SE_CNTL] |=  RADEON_ZBIAS_ENABLE_TRI;      } else {	 rmesa->hw.set.cmd[SET_SE_CNTL] &= ~RADEON_ZBIAS_ENABLE_TRI;      }      break;   case GL_POLYGON_SMOOTH:      RADEON_STATECHANGE( rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_ANTI_ALIAS_POLY;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_ANTI_ALIAS_POLY;      }      break;   case GL_POLYGON_STIPPLE:      RADEON_STATECHANGE(rmesa, ctx );      if ( state ) {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] |=  RADEON_STIPPLE_ENABLE;      } else {	 rmesa->hw.ctx.cmd[CTX_PP_CNTL] &= ~RADEON_STIPPLE_ENABLE;      }      break;   case GL_RESCALE_NORMAL_EXT: {      GLboolean tmp = ctx->_NeedEyeCoords ? state : !state;      RADEON_STATECHANGE( rmesa, tcl );      if ( tmp ) {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;      } else {	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;      }      break;   }   case GL_SCISSOR_TEST:      RADEON_FIREVERTICES( rmesa );      rmesa->state.scissor.enabled = state;      radeonUpdateScissor( ctx );      break;   case GL_STENCIL_TEST:      if ( rmesa->state.stencil.hwBuffer ) {	 RADEON_STATECHANGE( rmesa, ctx );	 if ( state ) {	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_STENCIL_ENABLE;	 } else {	    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_STENCIL_ENABLE;	 }      } else {	 FALLBACK( rmesa, RADEON_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 radeonUpdateTextureState.       */      rmesa->recheck_texgen[ctx->Texture.CurrentUnit] = GL_TRUE;       break;   case GL_COLOR_SUM_EXT:      radeonUpdateSpecular ( ctx );      break;   default:      return;   }}static void radeonLightingSpaceChange( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   GLboolean tmp;   RADEON_STATECHANGE( rmesa, tcl );   if (RADEON_DEBUG & DEBUG_STATE)      fprintf(stderr, "%s %d BEFORE %x\n", __FUNCTION__, ctx->_NeedEyeCoords,	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);   if (ctx->_NeedEyeCoords)      tmp = ctx->Transform.RescaleNormals;   else      tmp = !ctx->Transform.RescaleNormals;   if ( tmp ) {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;   } else {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;   }   if (RADEON_DEBUG & DEBUG_STATE)       fprintf(stderr, "%s %d AFTER %x\n", __FUNCTION__, ctx->_NeedEyeCoords,	      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL]);}/* ============================================================= * Deferred state management - matrices, textures, other? */void radeonUploadTexMatrix( radeonContextPtr rmesa,			    int unit, GLboolean swapcols ){/* Here's how this works: on r100, only 3 tex coords can be submitted, so the   vector looks like this probably: (s t r|q 0) (not sure if the last coord   is hardwired to 0, could be 1 too). Interestingly, it actually looks like   texgen generates all 4 coords, at least tests with projtex indicated that.   So: if we need the q coord in the end (solely determined by the texture   target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.   Additionally, if we don't have texgen but 4 tex coords submitted, we swap   column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord   will get submitted in the "wrong", i.e. 3rd, slot.   If an app submits 3 coords for 2d targets, we assume it is saving on vertex   size and using the texture matrix to swap the r and q coords around (ut2k3   does exactly that), so we don't need the 3rd / 4th column swap - still need   the 3rd / 4th row swap of course. This will potentially break for apps which   use TexCoord3x just for fun. Additionally, it will never work if an app uses   an "advanced" texture matrix and relies on all 4 texcoord inputs to generate   the maximum needed 3. This seems impossible to do with hw tcl on r100, and   incredibly hard to detect so we can't just fallback in such a case. Assume   it never happens... - rs*/   int idx = TEXMAT_0 + unit;   float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0;   int i;   struct gl_texture_unit tUnit = rmesa->glCtx->Texture.Unit[unit];   GLfloat *src = rmesa->tmpmat[unit].m;   rmesa->TexMatColSwap &= ~(1 << unit);   if ((tUnit._ReallyEnabled & (TEXTURE_3D_BIT | TEXTURE_CUBE_BIT)) == 0) {      if (swapcols) {	 rmesa->TexMatColSwap |= 1 << unit;	 /* attention some elems are swapped 2 times! */	 *dest++ = src[0];	 *dest++ = src[4];	 *dest++ = src[12];	 *dest++ = src[8];	 *dest++ = src[1];	 *dest++ = src[5];	 *dest++ = src[13];	 *dest++ = src[9];	 *dest++ = src[2];	 *dest++ = src[6];	 *dest++ = src[15];	 *dest++ = src[11];	 /* those last 4 are probably never used */	 *dest++ = src[3];	 *dest++ = src[7];	 *dest++ = src[14];	 *dest++ = src[10];      }      else {	 for (i = 0; i < 2; i++) {	    *dest++ = src[i];	    *dest++ = src[i+4];	    *dest++ = src[i+8];	    *dest++ = src[i+12];	 }	 for (i = 3; i >= 2; i--) {	    *dest++ = src[i];	    *dest++ = src[i+4];	    *dest++ = src[i+8];	    *dest++ = src[i+12];	 }      }   }   else {      for (i = 0 ; i < 4 ; i++) {	 *dest++ = src[i];	 *dest++ = src[i+4];	 *dest++ = src[i+8];	 *dest++ = src[i+12];      }   }   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );}static void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx ){   float *dest = ((float *)RADEON_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];   }   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );}static void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx ){   float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;   memcpy(dest, src, 16*sizeof(float));   RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );}static void update_texturematrix( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );   GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];   GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];   int unit;   GLuint texMatEnabled = 0;   rmesa->NeedTexMatrix = 0;   rmesa->TexMatColSwap = 0;   for (unit = 0 ; unit < ctx->Const.MaxTextureUnits; unit++) {      if (ctx->Texture.Unit[unit]._ReallyEnabled) {	 GLboolean needMatrix = GL_FALSE;	 if (ctx->TextureMatrixStack[unit].Top->type != MATRIX_IDENTITY) {	    needMatrix = GL_TRUE;	    texMatEnabled |= (RADEON_TEXGEN_TEXMAT_0_ENABLE |			      RADEON_TEXMAT_0_ENABLE) << unit;	    if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {	       /* Need to preconcatenate any active texgen	        * obj/eyeplane matrices:	        */	       _math_matrix_mul_matrix( &rmesa->tmpmat[unit],				     ctx->TextureMatrixStack[unit].Top,				     &rmesa->TexGenMatrix[unit] );	    }	    else {	       _math_matrix_copy( &rmesa->tmpmat[unit],		  ctx->TextureMatrixStack[unit].Top );	    }	 }	 else if (rmesa->TexGenEnabled & (RADEON_TEXMAT_0_ENABLE << unit)) {	    _math_matrix_copy( &rmesa->tmpmat[unit], &rmesa->TexGenMatrix[unit] );	    needMatrix = GL_TRUE;	 }	 if (needMatrix) {	    rmesa->NeedTexMatrix |= 1 << unit;	    radeonUploadTexMatrix( rmesa, unit,			!ctx->Texture.Unit[unit].TexGenEnabled );	 }      }   }   tpc = (texMatEnabled | rmesa->TexGenEnabled);   /* TCL_TEX_COMPUTED_x is TCL_TEX_INPUT_x | 0x8 */   vs &= ~((RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_0_OUTPUT_SHIFT) |	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_1_OUTPUT_SHIFT) |	   (RADEON_TCL_TEX_COMPUTED_TEX_0 << RADEON_TCL_TEX_2_OUTPUT_SHIFT));   vs |= (((tpc & RADEON_TEXGEN_TEXMAT_0_ENABLE) <<	 (RADEON_TCL_TEX_0_OUTPUT_SHIFT + 3)) |      ((tpc & RADEON_TEXGEN_TEXMAT_1_ENABLE) <<	 (RADEON_TCL_TEX_1_OUTPUT_SHIFT + 2)) |   

⌨️ 快捷键说明

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