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

📄 r200_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
   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;   }   default:     break;   }}static void r200UpdateLocalViewer ( GLcontext *ctx ){/* It looks like for the texgen modes GL_SPHERE_MAP, GL_NORMAL_MAP and   GL_REFLECTION_MAP we need R200_LOCAL_VIEWER set (fglrx does exactly that   for these and only these modes). This means specular highlights may turn out   wrong in some cases when lighting is enabled but GL_LIGHT_MODEL_LOCAL_VIEWER   is not set, though it seems to happen rarely and the effect seems quite   subtle. May need TCL fallback to fix it completely, though I'm not sure   how you'd identify the cases where the specular highlights indeed will   be wrong. Don't know if fglrx does something special in that case.*/   r200ContextPtr rmesa = R200_CONTEXT(ctx);   R200_STATECHANGE( rmesa, tcl );   if (ctx->Light.Model.LocalViewer ||       ctx->Texture._GenFlags & TEXGEN_NEED_NORMALS)      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LOCAL_VIEWER;   else      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~R200_LOCAL_VIEWER;}static void r200LightModelfv( GLcontext *ctx, GLenum pname,				const GLfloat *param ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   switch (pname) {      case GL_LIGHT_MODEL_AMBIENT: 	 update_global_ambient( ctx );	 break;      case GL_LIGHT_MODEL_LOCAL_VIEWER:	 r200UpdateLocalViewer( ctx );         break;      case GL_LIGHT_MODEL_TWO_SIDE:	 R200_STATECHANGE( rmesa, tcl );	 if (ctx->Light.Model.TwoSide)	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] |= R200_LIGHT_TWOSIDE;	 else	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] &= ~(R200_LIGHT_TWOSIDE);	 if (rmesa->TclFallback) {	    r200ChooseRenderState( ctx );	    r200ChooseVertexState( ctx );	 }         break;      case GL_LIGHT_MODEL_COLOR_CONTROL:	 r200UpdateSpecular(ctx);         break;      default:         break;   }}static void r200ShadeModel( GLcontext *ctx, GLenum mode ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLuint s = rmesa->hw.set.cmd[SET_SE_CNTL];   s &= ~(R200_DIFFUSE_SHADE_MASK |	  R200_ALPHA_SHADE_MASK |	  R200_SPECULAR_SHADE_MASK |	  R200_FOG_SHADE_MASK |	  R200_DISC_FOG_SHADE_MASK);   switch ( mode ) {   case GL_FLAT:      s |= (R200_DIFFUSE_SHADE_FLAT |	    R200_ALPHA_SHADE_FLAT |	    R200_SPECULAR_SHADE_FLAT |	    R200_FOG_SHADE_FLAT |	    R200_DISC_FOG_SHADE_FLAT);      break;   case GL_SMOOTH:      s |= (R200_DIFFUSE_SHADE_GOURAUD |	    R200_ALPHA_SHADE_GOURAUD |	    R200_SPECULAR_SHADE_GOURAUD |	    R200_FOG_SHADE_GOURAUD |	    R200_DISC_FOG_SHADE_GOURAUD);      break;   default:      return;   }   if ( rmesa->hw.set.cmd[SET_SE_CNTL] != s ) {      R200_STATECHANGE( rmesa, set );      rmesa->hw.set.cmd[SET_SE_CNTL] = s;   }}/* ============================================================= * User clip planes */static void r200ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ){   GLint p = (GLint) plane - (GLint) GL_CLIP_PLANE0;   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];   R200_STATECHANGE( rmesa, ucp[p] );   rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];   rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];   rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];   rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];}static void r200UpdateClipPlanes( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLuint p;   for (p = 0; p < ctx->Const.MaxClipPlanes; p++) {      if (ctx->Transform.ClipPlanesEnabled & (1 << p)) {	 GLint *ip = (GLint *)ctx->Transform._ClipUserPlane[p];	 R200_STATECHANGE( rmesa, ucp[p] );	 rmesa->hw.ucp[p].cmd[UCP_X] = ip[0];	 rmesa->hw.ucp[p].cmd[UCP_Y] = ip[1];	 rmesa->hw.ucp[p].cmd[UCP_Z] = ip[2];	 rmesa->hw.ucp[p].cmd[UCP_W] = ip[3];      }   }}/* ============================================================= * Stencil */static voidr200StencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func,                         GLint ref, GLuint mask ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   GLuint refmask = (((ctx->Stencil.Ref[0] & 0xff) << R200_STENCIL_REF_SHIFT) |		     ((ctx->Stencil.ValueMask[0] & 0xff) << R200_STENCIL_MASK_SHIFT));   R200_STATECHANGE( rmesa, ctx );   R200_STATECHANGE( rmesa, msk );   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~R200_STENCIL_TEST_MASK;   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~(R200_STENCIL_REF_MASK|						   R200_STENCIL_VALUE_MASK);   switch ( ctx->Stencil.Function[0] ) {   case GL_NEVER:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEVER;      break;   case GL_LESS:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LESS;      break;   case GL_EQUAL:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_EQUAL;      break;   case GL_LEQUAL:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_LEQUAL;      break;   case GL_GREATER:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GREATER;      break;   case GL_NOTEQUAL:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_NEQUAL;      break;   case GL_GEQUAL:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_GEQUAL;      break;   case GL_ALWAYS:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_TEST_ALWAYS;      break;   }   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |= refmask;}static voidr200StencilMaskSeparate( GLcontext *ctx, GLenum face, GLuint mask ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   R200_STATECHANGE( rmesa, msk );   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] &= ~R200_STENCIL_WRITE_MASK;   rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] |=      ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT);}static voidr200StencilOpSeparate( GLcontext *ctx, GLenum face, GLenum fail,                       GLenum zfail, GLenum zpass ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   R200_STATECHANGE( rmesa, ctx );   rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] &= ~(R200_STENCIL_FAIL_MASK |					       R200_STENCIL_ZFAIL_MASK |					       R200_STENCIL_ZPASS_MASK);   switch ( ctx->Stencil.FailFunc[0] ) {   case GL_KEEP:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_KEEP;      break;   case GL_ZERO:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_ZERO;      break;   case GL_REPLACE:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_REPLACE;      break;   case GL_INCR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC;      break;   case GL_DECR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC;      break;   case GL_INCR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INC_WRAP;      break;   case GL_DECR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_DEC_WRAP;      break;   case GL_INVERT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_FAIL_INVERT;      break;   }   switch ( ctx->Stencil.ZFailFunc[0] ) {   case GL_KEEP:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_KEEP;      break;   case GL_ZERO:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_ZERO;      break;   case GL_REPLACE:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_REPLACE;      break;   case GL_INCR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC;      break;   case GL_DECR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC;      break;   case GL_INCR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INC_WRAP;      break;   case GL_DECR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_DEC_WRAP;      break;   case GL_INVERT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZFAIL_INVERT;      break;   }   switch ( ctx->Stencil.ZPassFunc[0] ) {   case GL_KEEP:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_KEEP;      break;   case GL_ZERO:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_ZERO;      break;   case GL_REPLACE:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_REPLACE;      break;   case GL_INCR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC;      break;   case GL_DECR:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC;      break;   case GL_INCR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INC_WRAP;      break;   case GL_DECR_WRAP_EXT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_DEC_WRAP;      break;   case GL_INVERT:      rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_STENCIL_ZPASS_INVERT;      break;   }}static void r200ClearStencil( GLcontext *ctx, GLint s ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   rmesa->state.stencil.clear =       ((GLuint) (ctx->Stencil.Clear & 0xff) |       (0xff << R200_STENCIL_MASK_SHIFT) |       ((ctx->Stencil.WriteMask[0] & 0xff) << R200_STENCIL_WRITEMASK_SHIFT));}/* ============================================================= * Window position and viewport transformation *//* * To correctly position primitives: */#define SUBPIXEL_X 0.125#define SUBPIXEL_Y 0.125/** * Called when window size or position changes or viewport or depth range * state is changed.  We update the hardware viewport state here. */void r200UpdateWindow( GLcontext *ctx ){   r200ContextPtr rmesa = R200_CONTEXT(ctx);   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;   GLfloat xoffset = (GLfloat)dPriv->x;   GLfloat yoffset = (GLfloat)dPriv->y + dPriv->h;   const GLfloat *v = ctx->Viewport._WindowMap.m;   float_ui32_type sx = { v[MAT_SX] };   float_ui32_type tx = { v[MAT_TX] + xoffset + SUBPIXEL_X };   float_ui32_type sy = { - v[MAT_SY] };   float_ui32_type ty = { (- v[MAT_TY]) + yoffset + SUBPIXEL_Y };   float_ui32_type sz = { v[MAT_SZ] * rmesa->state.depth.scale };   float_ui32_type tz = { v[MAT_TZ] * rmesa->state.depth.scale };   R200_FIREVERTICES( rmesa );   R200_STATECHANGE( rmesa, vpt );

⌨️ 快捷键说明

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