📄 radeon_state.c
字号:
} 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 + -