📄 r200_state_init.c
字号:
} rmesa->hw.prf.cmd[PRF_PP_TRI_PERF] = R200_TRI_CUTOFF_MASK - R200_TRI_CUTOFF_MASK * driQueryOptionf (&rmesa->optionCache,"texture_blend_quality"); rmesa->hw.prf.cmd[PRF_PP_PERF_CNTL] = 0; rmesa->hw.set.cmd[SET_SE_CNTL] = (R200_FFACE_CULL_CCW | R200_BFACE_SOLID | R200_FFACE_SOLID | R200_FLAT_SHADE_VTX_LAST | R200_DIFFUSE_SHADE_GOURAUD | R200_ALPHA_SHADE_GOURAUD | R200_SPECULAR_SHADE_GOURAUD | R200_FOG_SHADE_GOURAUD | R200_DISC_FOG_SHADE_GOURAUD | R200_VTX_PIX_CENTER_OGL | R200_ROUND_MODE_TRUNC | R200_ROUND_PREC_8TH_PIX); rmesa->hw.set.cmd[SET_RE_CNTL] = (R200_PERSPECTIVE_ENABLE | R200_SCISSOR_ENABLE); rmesa->hw.lin.cmd[LIN_RE_LINE_PATTERN] = ((1 << 16) | 0xffff); rmesa->hw.lin.cmd[LIN_RE_LINE_STATE] = ((0 << R200_LINE_CURRENT_PTR_SHIFT) | (1 << R200_LINE_CURRENT_COUNT_SHIFT)); rmesa->hw.lin.cmd[LIN_SE_LINE_WIDTH] = (1 << 4); rmesa->hw.msk.cmd[MSK_RB3D_STENCILREFMASK] = ((0x00 << R200_STENCIL_REF_SHIFT) | (0xff << R200_STENCIL_MASK_SHIFT) | (0xff << R200_STENCIL_WRITEMASK_SHIFT)); rmesa->hw.msk.cmd[MSK_RB3D_ROPCNTL] = R200_ROP_COPY; rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK] = 0xffffffff; rmesa->hw.tam.cmd[TAM_DEBUG3] = 0; rmesa->hw.msc.cmd[MSC_RE_MISC] = ((0 << R200_STIPPLE_X_OFFSET_SHIFT) | (0 << R200_STIPPLE_Y_OFFSET_SHIFT) | R200_STIPPLE_BIG_BIT_ORDER); rmesa->hw.cst.cmd[CST_PP_CNTL_X] = 0; rmesa->hw.cst.cmd[CST_RB3D_DEPTHXY_OFFSET] = 0; rmesa->hw.cst.cmd[CST_RE_AUX_SCISSOR_CNTL] = 0x0; rmesa->hw.cst.cmd[CST_RE_SCISSOR_TL_0] = 0; rmesa->hw.cst.cmd[CST_RE_SCISSOR_BR_0] = 0; rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] =#ifdef MESA_BIG_ENDIAN R200_VC_32BIT_SWAP;#else R200_VC_NO_SWAP;#endif if (!(rmesa->r200Screen->chip_flags & RADEON_CHIPSET_TCL)) { /* Bypass TCL */ rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] |= (1<<8); } rmesa->hw.cst.cmd[CST_RE_POINTSIZE] = (((GLuint)(ctx->Const.MaxPointSize * 16.0)) << R200_MAXPOINTSIZE_SHIFT) | 0x10; rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_0] = (0x0 << R200_VERTEX_POSITION_ADDR__SHIFT); rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_1] = (0x02 << R200_VTX_COLOR_0_ADDR__SHIFT) | (0x03 << R200_VTX_COLOR_1_ADDR__SHIFT); rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_2] = (0x06 << R200_VTX_TEX_0_ADDR__SHIFT) | (0x07 << R200_VTX_TEX_1_ADDR__SHIFT) | (0x08 << R200_VTX_TEX_2_ADDR__SHIFT) | (0x09 << R200_VTX_TEX_3_ADDR__SHIFT); rmesa->hw.cst.cmd[CST_SE_TCL_INPUT_VTX_3] = (0x0A << R200_VTX_TEX_4_ADDR__SHIFT) | (0x0B << R200_VTX_TEX_5_ADDR__SHIFT); rmesa->hw.vpt.cmd[VPT_SE_VPORT_XSCALE] = 0x00000000; rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = 0x00000000; rmesa->hw.vpt.cmd[VPT_SE_VPORT_YSCALE] = 0x00000000; rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = 0x00000000; rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZSCALE] = 0x00000000; rmesa->hw.vpt.cmd[VPT_SE_VPORT_ZOFFSET] = 0x00000000; for ( i = 0 ; i < ctx->Const.MaxTextureUnits ; i++ ) { rmesa->hw.tex[i].cmd[TEX_PP_TXFILTER] = R200_BORDER_MODE_OGL; rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT] = ((i << R200_TXFORMAT_ST_ROUTE_SHIFT) | /* <-- note i */ (2 << R200_TXFORMAT_WIDTH_SHIFT) | (2 << R200_TXFORMAT_HEIGHT_SHIFT)); rmesa->hw.tex[i].cmd[TEX_PP_BORDER_COLOR] = 0; rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT_X] = (/* R200_TEXCOORD_PROJ | */ 0x100000); /* Small default bias */ if (rmesa->r200Screen->drmSupportsFragShader) { rmesa->hw.tex[i].cmd[TEX_PP_TXOFFSET_NEWDRM] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.tex[i].cmd[TEX_PP_CUBIC_FACES] = 0; rmesa->hw.tex[i].cmd[TEX_PP_TXMULTI_CTL] = 0; } else { rmesa->hw.tex[i].cmd[TEX_PP_TXOFFSET_OLDDRM] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; } rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_FACES] = 0; rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F1] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F2] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F3] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F4] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_F5] = rmesa->r200Screen->texOffset[RADEON_LOCAL_TEX_HEAP]; rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND] = (R200_TXC_ARG_A_ZERO | R200_TXC_ARG_B_ZERO | R200_TXC_ARG_C_DIFFUSE_COLOR | R200_TXC_OP_MADD); rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND2] = ((i << R200_TXC_TFACTOR_SEL_SHIFT) | R200_TXC_SCALE_1X | R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND] = (R200_TXA_ARG_A_ZERO | R200_TXA_ARG_B_ZERO | R200_TXA_ARG_C_DIFFUSE_ALPHA | R200_TXA_OP_MADD); rmesa->hw.pix[i].cmd[PIX_PP_TXABLEND2] = ((i << R200_TXA_TFACTOR_SEL_SHIFT) | R200_TXA_SCALE_1X | R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); } rmesa->hw.tf.cmd[TF_TFACTOR_0] = 0; rmesa->hw.tf.cmd[TF_TFACTOR_1] = 0; rmesa->hw.tf.cmd[TF_TFACTOR_2] = 0; rmesa->hw.tf.cmd[TF_TFACTOR_3] = 0; rmesa->hw.tf.cmd[TF_TFACTOR_4] = 0; rmesa->hw.tf.cmd[TF_TFACTOR_5] = 0; rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = (R200_VAP_TCL_ENABLE | (0x9 << R200_VAP_VF_MAX_VTX_NUM__SHIFT)); rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = (R200_VPORT_X_SCALE_ENA | R200_VPORT_Y_SCALE_ENA | R200_VPORT_Z_SCALE_ENA | R200_VPORT_X_OFFSET_ENA | R200_VPORT_Y_OFFSET_ENA | R200_VPORT_Z_OFFSET_ENA |/* FIXME: Turn on for tex rect only */ R200_VTX_ST_DENORMALIZED | R200_VTX_W0_FMT); rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = 0; rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = 0; rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_0] = ((R200_VTX_Z0 | R200_VTX_W0 | (R200_VTX_FP_RGBA << R200_VTX_COLOR_0_SHIFT))); rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_VTXFMT_1] = 0; rmesa->hw.vtx.cmd[VTX_TCL_OUTPUT_COMPSEL] = (R200_OUTPUT_XYZW); rmesa->hw.vtx.cmd[VTX_STATE_CNTL] = R200_VSC_UPDATE_USER_COLOR_0_ENABLE; /* Matrix selection */ rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_0] = (R200_MTX_MV << R200_MODELVIEW_0_SHIFT); rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_1] = (R200_MTX_IMV << R200_IT_MODELVIEW_0_SHIFT); rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_2] = (R200_MTX_MVP << R200_MODELPROJECT_0_SHIFT); rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_3] = ((R200_MTX_TEX0 << R200_TEXMAT_0_SHIFT) | (R200_MTX_TEX1 << R200_TEXMAT_1_SHIFT) | (R200_MTX_TEX2 << R200_TEXMAT_2_SHIFT) | (R200_MTX_TEX3 << R200_TEXMAT_3_SHIFT)); rmesa->hw.msl.cmd[MSL_MATRIX_SELECT_4] = ((R200_MTX_TEX4 << R200_TEXMAT_4_SHIFT) | (R200_MTX_TEX5 << R200_TEXMAT_5_SHIFT)); /* General TCL state */ rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_0] = (R200_SPECULAR_LIGHTS | R200_DIFFUSE_SPECULAR_COMBINE | R200_LOCAL_LIGHT_VEC_GL | R200_LM0_SOURCE_MATERIAL_0 << R200_FRONT_SHININESS_SOURCE_SHIFT | R200_LM0_SOURCE_MATERIAL_1 << R200_BACK_SHININESS_SOURCE_SHIFT); rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL_1] = ((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)); rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_0] = 0; /* filled in via callbacks */ rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_1] = 0; rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_2] = 0; rmesa->hw.tcl.cmd[TCL_PER_LIGHT_CTL_3] = 0; rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] = (R200_UCP_IN_CLIP_SPACE | R200_CULL_FRONT_IS_CCW); /* Texgen/Texmat state */ rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_2] = 0x00ffffff; rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_3] = ((0 << R200_TEXGEN_0_INPUT_TEX_SHIFT) | (1 << R200_TEXGEN_1_INPUT_TEX_SHIFT) | (2 << R200_TEXGEN_2_INPUT_TEX_SHIFT) | (3 << R200_TEXGEN_3_INPUT_TEX_SHIFT) | (4 << R200_TEXGEN_4_INPUT_TEX_SHIFT) | (5 << R200_TEXGEN_5_INPUT_TEX_SHIFT)); rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_0] = 0; rmesa->hw.tcg.cmd[TCG_TEX_PROC_CTL_1] = ((0 << R200_TEXGEN_0_INPUT_SHIFT) | (1 << R200_TEXGEN_1_INPUT_SHIFT) | (2 << R200_TEXGEN_2_INPUT_SHIFT) | (3 << R200_TEXGEN_3_INPUT_SHIFT) | (4 << R200_TEXGEN_4_INPUT_SHIFT) | (5 << R200_TEXGEN_5_INPUT_SHIFT)); rmesa->hw.tcg.cmd[TCG_TEX_CYL_WRAP_CTL] = 0; for (i = 0 ; i < 8; i++) { struct gl_light *l = &ctx->Light.Light[i]; GLenum p = GL_LIGHT0 + i; *(float *)&(rmesa->hw.lit[i].cmd[LIT_RANGE_CUTOFF]) = FLT_MAX; ctx->Driver.Lightfv( ctx, p, GL_AMBIENT, l->Ambient ); ctx->Driver.Lightfv( ctx, p, GL_DIFFUSE, l->Diffuse ); ctx->Driver.Lightfv( ctx, p, GL_SPECULAR, l->Specular ); ctx->Driver.Lightfv( ctx, p, GL_POSITION, NULL ); ctx->Driver.Lightfv( ctx, p, GL_SPOT_DIRECTION, NULL ); ctx->Driver.Lightfv( ctx, p, GL_SPOT_EXPONENT, &l->SpotExponent ); ctx->Driver.Lightfv( ctx, p, GL_SPOT_CUTOFF, &l->SpotCutoff ); ctx->Driver.Lightfv( ctx, p, GL_CONSTANT_ATTENUATION, &l->ConstantAttenuation ); ctx->Driver.Lightfv( ctx, p, GL_LINEAR_ATTENUATION, &l->LinearAttenuation ); ctx->Driver.Lightfv( ctx, p, GL_QUADRATIC_ATTENUATION, &l->QuadraticAttenuation ); *(float *)&(rmesa->hw.lit[i].cmd[LIT_ATTEN_XXX]) = 0.0; } ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_AMBIENT, ctx->Light.Model.Ambient ); TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); for (i = 0 ; i < 6; i++) { ctx->Driver.ClipPlane( ctx, GL_CLIP_PLANE0 + i, NULL ); } ctx->Driver.Fogfv( ctx, GL_FOG_MODE, NULL ); ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density ); ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start ); ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End ); ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color ); ctx->Driver.Fogfv( ctx, GL_FOG_COORDINATE_SOURCE_EXT, NULL ); rmesa->hw.grd.cmd[GRD_VERT_GUARD_CLIP_ADJ] = IEEE_ONE; rmesa->hw.grd.cmd[GRD_VERT_GUARD_DISCARD_ADJ] = IEEE_ONE; rmesa->hw.grd.cmd[GRD_HORZ_GUARD_CLIP_ADJ] = IEEE_ONE; rmesa->hw.grd.cmd[GRD_HORZ_GUARD_DISCARD_ADJ] = IEEE_ONE; rmesa->hw.eye.cmd[EYE_X] = 0; rmesa->hw.eye.cmd[EYE_Y] = 0; rmesa->hw.eye.cmd[EYE_Z] = IEEE_ONE; rmesa->hw.eye.cmd[EYE_RESCALE_FACTOR] = IEEE_ONE; rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] = R200_PS_SE_SEL_STATE | R200_PS_MULT_CONST; /* ptp_eye is presumably used to calculate the attenuation wrt a different location? In any case, since point attenuation triggers _needeyecoords, it is constant. Probably ignored as long as R200_PS_USE_MODEL_EYE_VEC isn't set */ rmesa->hw.ptp.cmd[PTP_EYE_X] = 0; rmesa->hw.ptp.cmd[PTP_EYE_Y] = 0; rmesa->hw.ptp.cmd[PTP_EYE_Z] = IEEE_ONE | 0x80000000; /* -1.0 */ rmesa->hw.ptp.cmd[PTP_EYE_3] = 0; /* no idea what the ptp_vport_scale values are good for, except the PTSIZE one - hopefully doesn't matter */ rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_0] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_1] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_PTSIZE] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_VPORT_SCALE_3] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_ATT_CONST_QUAD] = 0; rmesa->hw.ptp.cmd[PTP_ATT_CONST_LIN] = 0; rmesa->hw.ptp.cmd[PTP_ATT_CONST_CON] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_ATT_CONST_3] = 0; rmesa->hw.ptp.cmd[PTP_CLAMP_MIN] = IEEE_ONE; rmesa->hw.ptp.cmd[PTP_CLAMP_MAX] = 0x44ffe000; /* 2047 */ rmesa->hw.ptp.cmd[PTP_CLAMP_2] = 0; rmesa->hw.ptp.cmd[PTP_CLAMP_3] = 0; r200LightingSpaceChange( ctx ); rmesa->hw.all_dirty = GL_TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -