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

📄 r200_state.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] |= 	 ((R200_VTX_FP_RGBA << R200_VTX_COLOR_1_SHIFT));	      rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] |= R200_OUTPUT_COLOR_1;   }   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {      R200_STATECHANGE( rmesa, ctx );      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;   }   /* Update vertex/render formats    */   if (rmesa->TclFallback) {       r200ChooseRenderState( ctx );      r200ChooseVertexState( ctx );   }}/* ============================================================= * Materials *//* Update on colormaterial, material emmissive/ambient,  * lightmodel.globalambient */static void update_global_ambient( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   float *fcmd = (float *)R200_DB_STATE( glt );   /* Need to do more if both emmissive & ambient are PREMULT:    * I believe this is not nessary when using source_material. This condition thus    * will never happen currently, and the function has no dependencies on materials now    */   if ((rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] &       ((3 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |	(3 << R200_FRONT_AMBIENT_SOURCE_SHIFT))) == 0)    {      COPY_3V( &fcmd[GLT_RED], 	       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION]);      ACC_SCALE_3V( &fcmd[GLT_RED],		   ctx->Light.Model.Ambient,		   ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT]);   }    else   {      COPY_3V( &fcmd[GLT_RED], ctx->Light.Model.Ambient );   }      R200_DB_STATECHANGE(rmesa, &rmesa->hw.glt);}/* Update on change to  *    - light[p].colors *    - light[p].enabled */static void update_light_colors( GLcontext *ctx, GLuint p ){   struct gl_light *l = &ctx->Light.Light[p];/*     fprintf(stderr, "%s\n", __FUNCTION__); */   if (l->Enabled) {      r200ContextPtr rmesa = R200_CONTEXT(ctx);      float *fcmd = (float *)R200_DB_STATE( lit[p] );      COPY_4V( &fcmd[LIT_AMBIENT_RED], l->Ambient );	       COPY_4V( &fcmd[LIT_DIFFUSE_RED], l->Diffuse );      COPY_4V( &fcmd[LIT_SPECULAR_RED], l->Specular );            R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );   }}static void r200ColorMaterial( GLcontext *ctx, GLenum face, GLenum mode ){      r200ContextPtr rmesa = R200_CONTEXT(ctx);      GLuint light_model_ctl1 = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1];      light_model_ctl1 &= ~((0xf << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |			   (0xf << R200_FRONT_AMBIENT_SOURCE_SHIFT) |			   (0xf << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |		   (0xf << R200_FRONT_SPECULAR_SOURCE_SHIFT) |		   (0xf << R200_BACK_EMISSIVE_SOURCE_SHIFT) |		   (0xf << R200_BACK_AMBIENT_SOURCE_SHIFT) |		   (0xf << R200_BACK_DIFFUSE_SOURCE_SHIFT) |		   (0xf << R200_BACK_SPECULAR_SOURCE_SHIFT));   if (ctx->Light.ColorMaterialEnabled) {      GLuint mask = ctx->Light.ColorMaterialBitmask;         if (mask & MAT_BIT_FRONT_EMISSION) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);      }      else	 light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<			     R200_FRONT_EMISSIVE_SOURCE_SHIFT);      if (mask & MAT_BIT_FRONT_AMBIENT) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_FRONT_AMBIENT_SOURCE_SHIFT);      }      else         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<			     R200_FRONT_AMBIENT_SOURCE_SHIFT);	       if (mask & MAT_BIT_FRONT_DIFFUSE) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);      }      else         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<			     R200_FRONT_DIFFUSE_SOURCE_SHIFT);         if (mask & MAT_BIT_FRONT_SPECULAR) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_FRONT_SPECULAR_SOURCE_SHIFT);      }      else {         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_0 <<			     R200_FRONT_SPECULAR_SOURCE_SHIFT);      }         if (mask & MAT_BIT_BACK_EMISSION) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_BACK_EMISSIVE_SOURCE_SHIFT);      }      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<			     R200_BACK_EMISSIVE_SOURCE_SHIFT);      if (mask & MAT_BIT_BACK_AMBIENT) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_BACK_AMBIENT_SOURCE_SHIFT);      }      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<			     R200_BACK_AMBIENT_SOURCE_SHIFT);      if (mask & MAT_BIT_BACK_DIFFUSE) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_BACK_DIFFUSE_SOURCE_SHIFT);   }      else light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<			     R200_BACK_DIFFUSE_SOURCE_SHIFT);      if (mask & MAT_BIT_BACK_SPECULAR) {	 light_model_ctl1 |= (R200_LM1_SOURCE_VERTEX_COLOR_0 <<			     R200_BACK_SPECULAR_SOURCE_SHIFT);      }      else {         light_model_ctl1 |= (R200_LM1_SOURCE_MATERIAL_1 <<			     R200_BACK_SPECULAR_SOURCE_SHIFT);      }      }   else {       /* Default to SOURCE_MATERIAL:        */     light_model_ctl1 |=        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_EMISSIVE_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_AMBIENT_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_DIFFUSE_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_0 << R200_FRONT_SPECULAR_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_EMISSIVE_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_AMBIENT_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_DIFFUSE_SOURCE_SHIFT) |        (R200_LM1_SOURCE_MATERIAL_1 << R200_BACK_SPECULAR_SOURCE_SHIFT);   }   if (light_model_ctl1 != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1]) {      R200_STATECHANGE( rmesa, tcl );      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = light_model_ctl1;   }      }void r200UpdateMaterial( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLfloat (*mat)[4] = ctx->Light.Material.Attrib;   GLfloat *fcmd = (GLfloat *)R200_DB_STATE( mtl[0] );   GLfloat *fcmd2 = (GLfloat *)R200_DB_STATE( mtl[1] );   GLuint mask = ~0;      /* Might be possible and faster to update everything unconditionally? */   if (ctx->Light.ColorMaterialEnabled)      mask &= ~ctx->Light.ColorMaterialBitmask;   if (R200_DEBUG & DEBUG_STATE)      fprintf(stderr, "%s\n", __FUNCTION__);   if (mask & MAT_BIT_FRONT_EMISSION) {      fcmd[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_FRONT_EMISSION][0];      fcmd[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_FRONT_EMISSION][1];      fcmd[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_FRONT_EMISSION][2];      fcmd[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_FRONT_EMISSION][3];   }   if (mask & MAT_BIT_FRONT_AMBIENT) {      fcmd[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_FRONT_AMBIENT][0];      fcmd[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_FRONT_AMBIENT][1];      fcmd[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_FRONT_AMBIENT][2];      fcmd[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_FRONT_AMBIENT][3];   }   if (mask & MAT_BIT_FRONT_DIFFUSE) {      fcmd[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_FRONT_DIFFUSE][0];      fcmd[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][1];      fcmd[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_FRONT_DIFFUSE][2];      fcmd[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_FRONT_DIFFUSE][3];   }   if (mask & MAT_BIT_FRONT_SPECULAR) {      fcmd[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_FRONT_SPECULAR][0];      fcmd[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_FRONT_SPECULAR][1];      fcmd[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_FRONT_SPECULAR][2];      fcmd[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_FRONT_SPECULAR][3];   }   if (mask & MAT_BIT_FRONT_SHININESS) {      fcmd[MTL_SHININESS]       = mat[MAT_ATTRIB_FRONT_SHININESS][0];   }   if (mask & MAT_BIT_BACK_EMISSION) {      fcmd2[MTL_EMMISSIVE_RED]   = mat[MAT_ATTRIB_BACK_EMISSION][0];      fcmd2[MTL_EMMISSIVE_GREEN] = mat[MAT_ATTRIB_BACK_EMISSION][1];      fcmd2[MTL_EMMISSIVE_BLUE]  = mat[MAT_ATTRIB_BACK_EMISSION][2];      fcmd2[MTL_EMMISSIVE_ALPHA] = mat[MAT_ATTRIB_BACK_EMISSION][3];   }   if (mask & MAT_BIT_BACK_AMBIENT) {      fcmd2[MTL_AMBIENT_RED]     = mat[MAT_ATTRIB_BACK_AMBIENT][0];      fcmd2[MTL_AMBIENT_GREEN]   = mat[MAT_ATTRIB_BACK_AMBIENT][1];      fcmd2[MTL_AMBIENT_BLUE]    = mat[MAT_ATTRIB_BACK_AMBIENT][2];      fcmd2[MTL_AMBIENT_ALPHA]   = mat[MAT_ATTRIB_BACK_AMBIENT][3];   }   if (mask & MAT_BIT_BACK_DIFFUSE) {      fcmd2[MTL_DIFFUSE_RED]     = mat[MAT_ATTRIB_BACK_DIFFUSE][0];      fcmd2[MTL_DIFFUSE_GREEN]   = mat[MAT_ATTRIB_BACK_DIFFUSE][1];      fcmd2[MTL_DIFFUSE_BLUE]    = mat[MAT_ATTRIB_BACK_DIFFUSE][2];      fcmd2[MTL_DIFFUSE_ALPHA]   = mat[MAT_ATTRIB_BACK_DIFFUSE][3];   }   if (mask & MAT_BIT_BACK_SPECULAR) {      fcmd2[MTL_SPECULAR_RED]    = mat[MAT_ATTRIB_BACK_SPECULAR][0];      fcmd2[MTL_SPECULAR_GREEN]  = mat[MAT_ATTRIB_BACK_SPECULAR][1];      fcmd2[MTL_SPECULAR_BLUE]   = mat[MAT_ATTRIB_BACK_SPECULAR][2];      fcmd2[MTL_SPECULAR_ALPHA]  = mat[MAT_ATTRIB_BACK_SPECULAR][3];   }   if (mask & MAT_BIT_BACK_SHININESS) {      fcmd2[MTL_SHININESS]       = mat[MAT_ATTRIB_BACK_SHININESS][0];   }   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[0] );   R200_DB_STATECHANGE( rmesa, &rmesa->hw.mtl[1] );   /* currently material changes cannot trigger a global ambient change, I believe this is correct    update_global_ambient( ctx ); */}/* _NEW_LIGHT * _NEW_MODELVIEW * _MESA_NEW_NEED_EYE_COORDS * * Uses derived state from mesa: *       _VP_inf_norm *       _h_inf_norm *       _Position *       _NormDirection *       _ModelViewInvScale *       _NeedEyeCoords *       _EyeZDir * * which are calculated in light.c and are correct for the current * lighting space (model or eye), hence dependencies on _NEW_MODELVIEW * and _MESA_NEW_NEED_EYE_COORDS.   */static void update_light( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   /* Have to check these, or have an automatic shortcircuit mechanism    * to remove noop statechanges. (Or just do a better job on the    * front end).    */   {      GLuint tmp = rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0];      if (ctx->_NeedEyeCoords)	 tmp &= ~R200_LIGHT_IN_MODELSPACE;      else	 tmp |= R200_LIGHT_IN_MODELSPACE;            if (tmp != rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0])       {	 R200_STATECHANGE( rmesa, tcl );	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = tmp;      }   }   {      GLfloat *fcmd = (GLfloat *)R200_DB_STATE( eye );      fcmd[EYE_X] = ctx->_EyeZDir[0];      fcmd[EYE_Y] = ctx->_EyeZDir[1];      fcmd[EYE_Z] = - ctx->_EyeZDir[2];      fcmd[EYE_RESCALE_FACTOR] = ctx->_ModelViewInvScale;      R200_DB_STATECHANGE( rmesa, &rmesa->hw.eye );   }   if (ctx->Light.Enabled) {      GLint p;      for (p = 0 ; p < MAX_LIGHTS; p++) {	 if (ctx->Light.Light[p].Enabled) {	    struct gl_light *l = &ctx->Light.Light[p];	    GLfloat *fcmd = (GLfloat *)R200_DB_STATE( lit[p] );	    	    if (l->EyePosition[3] == 0.0) {	       COPY_3FV( &fcmd[LIT_POSITION_X], l->_VP_inf_norm ); 	       COPY_3FV( &fcmd[LIT_DIRECTION_X], l->_h_inf_norm ); 	       fcmd[LIT_POSITION_W] = 0;	       fcmd[LIT_DIRECTION_W] = 0;	    } else {	       COPY_4V( &fcmd[LIT_POSITION_X], l->_Position );	       fcmd[LIT_DIRECTION_X] = -l->_NormDirection[0];	       fcmd[LIT_DIRECTION_Y] = -l->_NormDirection[1];	       fcmd[LIT_DIRECTION_Z] = -l->_NormDirection[2];	       fcmd[LIT_DIRECTION_W] = 0;	    }	    R200_DB_STATECHANGE( rmesa, &rmesa->hw.lit[p] );	 }      }   }}static void r200Lightfv( GLcontext *ctx, GLenum light,			   GLenum pname, const GLfloat *params ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLint p = light - GL_LIGHT0;   struct gl_light *l = &ctx->Light.Light[p];   GLfloat *fcmd = (GLfloat *)rmesa->hw.lit[p].cmd;      switch (pname) {   case GL_AMBIENT:		   case GL_DIFFUSE:   case GL_SPECULAR:      update_light_colors( ctx, p );      break;   case GL_SPOT_DIRECTION:       /* picked up in update_light */	      break;   case GL_POSITION: {      /* positions picked up in update_light, but can do flag here */	      GLuint flag = (p&1)? R200_LIGHT_1_IS_LOCAL : R200_LIGHT_0_IS_LOCAL;      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;      R200_STATECHANGE(rmesa, tcl);      if (l->EyePosition[3] != 0.0F)	 rmesa->hw.tcl.cmd[idx] |= flag;      else	 rmesa->hw.tcl.cmd[idx] &= ~flag;      break;   }   case GL_SPOT_EXPONENT:      R200_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_SPOT_EXPONENT] = params[0];      break;   case GL_SPOT_CUTOFF: {      GLuint flag = (p&1) ? R200_LIGHT_1_IS_SPOT : R200_LIGHT_0_IS_SPOT;      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;      R200_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;      R200_STATECHANGE(rmesa, tcl);      if (l->SpotCutoff != 180.0F)	 rmesa->hw.tcl.cmd[idx] |= flag;      else	 rmesa->hw.tcl.cmd[idx] &= ~flag;      break;   }   case GL_CONSTANT_ATTENUATION:      R200_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_CONST] = params[0];      if ( params[0] == 0.0 )	 fcmd[LIT_ATTEN_CONST_INV] = FLT_MAX;      else	 fcmd[LIT_ATTEN_CONST_INV] = 1.0 / params[0];      break;   case GL_LINEAR_ATTENUATION:      R200_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_LINEAR] = params[0];      break;   case GL_QUADRATIC_ATTENUATION:      R200_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_QUADRATIC] = params[0];      break;   default:      return;   }   /* Set RANGE_ATTEN only when needed */   switch (pname) {   case GL_POSITION:   case GL_CONSTANT_ATTENUATION:   case GL_LINEAR_ATTENUATION:   case GL_QUADRATIC_ATTENUATION: {      GLuint *icmd = (GLuint *)R200_DB_STATE( tcl );      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;      GLuint atten_flag = ( p&1 ) ? R200_LIGHT_1_ENABLE_RANGE_ATTEN				  : R200_LIGHT_0_ENABLE_RANGE_ATTEN;      GLuint atten_const_flag = ( p&1 ) ? R200_LIGHT_1_CONSTANT_RANGE_ATTEN				  : R200_LIGHT_0_CONSTANT_RANGE_ATTEN;      if ( l->EyePosition[3] == 0.0F ||	   ( ( fcmd[LIT_ATTEN_CONST] == 0.0 || fcmd[LIT_ATTEN_CONST] == 1.0 ) &&	     fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) ) {	 /* Disable attenuation */	 icmd[idx] &= ~atten_flag;      } else {	 if ( fcmd[LIT_ATTEN_QUADRATIC] == 0.0 && fcmd[LIT_ATTEN_LINEAR] == 0.0 ) {	    /* Enable only constant portion of attenuation calculation */	    icmd[idx] |= ( atten_flag | atten_const_flag );	 } else {	    /* Enable full attenuation calculation */	    icmd[idx] &= ~atten_const_flag;	    icmd[idx] |= atten_flag;	 }      }      R200_DB_STATECHANGE( rmesa, &rmesa->hw.tcl );      break;

⌨️ 快捷键说明

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