📄 mach64_state.c
字号:
case GL_CULL_FACE: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_CULL; break; case GL_DEPTH_TEST: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_DEPTH; break; case GL_DITHER: do { GLuint s = mmesa->setup.scale_3d_cntl; FLUSH_BATCH( mmesa ); if ( ctx->Color.DitherFlag ) { /* Dithering causes problems w/ 24bpp depth */ if ( mmesa->mach64Screen->cpp == 4 ) s |= MACH64_ROUND_EN; else s |= MACH64_DITHER_EN; } else { s &= ~MACH64_DITHER_EN; s &= ~MACH64_ROUND_EN; } if ( mmesa->setup.scale_3d_cntl != s ) { mmesa->setup.scale_3d_cntl = s; mmesa->dirty |= ( MACH64_UPLOAD_SCALE_3D_CNTL ); } } while (0); break; case GL_FOG: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_FOG; break; case GL_INDEX_LOGIC_OP: case GL_COLOR_LOGIC_OP: FLUSH_BATCH( mmesa ); FALLBACK( mmesa, MACH64_FALLBACK_LOGICOP, state && ctx->Color.LogicOp != GL_COPY ); break; case GL_LIGHTING: mach64UpdateSpecularLighting(ctx); break; case GL_SCISSOR_TEST: FLUSH_BATCH( mmesa ); mmesa->scissor = state; mmesa->new_state |= MACH64_NEW_CLIP; break; case GL_STENCIL_TEST: FLUSH_BATCH( mmesa ); FALLBACK( mmesa, MACH64_FALLBACK_STENCIL, state ); break; case GL_TEXTURE_1D: case GL_TEXTURE_2D: case GL_TEXTURE_3D: FLUSH_BATCH( mmesa ); mmesa->new_state |= MACH64_NEW_TEXTURE; break; default: return; }}/* ============================================================= * Render mode */static void mach64DDRenderMode( GLcontext *ctx, GLenum mode ){ mach64ContextPtr mmesa = MACH64_CONTEXT(ctx); FALLBACK( mmesa, MACH64_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );}/* ============================================================= * State initialization, management */static void mach64DDPrintDirty( const char *msg, GLuint state ){ fprintf( stderr, "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s\n", msg, state, (state & MACH64_UPLOAD_DST_OFF_PITCH) ? "dst_off_pitch, " : "", (state & MACH64_UPLOAD_Z_ALPHA_CNTL) ? "z_alpha_cntl, " : "", (state & MACH64_UPLOAD_SCALE_3D_CNTL) ? "scale_3d_cntl, " : "", (state & MACH64_UPLOAD_DP_FOG_CLR) ? "dp_fog_clr, " : "", (state & MACH64_UPLOAD_DP_WRITE_MASK) ? "dp_write_mask, " : "", (state & MACH64_UPLOAD_DP_PIX_WIDTH) ? "dp_pix_width, " : "", (state & MACH64_UPLOAD_SETUP_CNTL) ? "setup_cntl, " : "", (state & MACH64_UPLOAD_MISC) ? "misc, " : "", (state & MACH64_UPLOAD_TEXTURE) ? "texture, " : "", (state & MACH64_UPLOAD_TEX0IMAGE) ? "tex0 image, " : "", (state & MACH64_UPLOAD_TEX1IMAGE) ? "tex1 image, " : "", (state & MACH64_UPLOAD_CLIPRECTS) ? "cliprects, " : "" );}/* * Load the current context's state into the hardware. * * NOTE: Be VERY careful about ensuring the context state is marked for * upload, the only place it shouldn't be uploaded is when the setup * state has changed in ReducedPrimitiveChange as this comes right after * a state update. * * Blits of any type should always upload the context and masks after * they are done. */void mach64EmitHwStateLocked( mach64ContextPtr mmesa ){ drm_mach64_sarea_t *sarea = mmesa->sarea; drm_mach64_context_regs_t *regs = &(mmesa->setup); mach64TexObjPtr t0 = mmesa->CurrentTexObj[0]; mach64TexObjPtr t1 = mmesa->CurrentTexObj[1]; if ( MACH64_DEBUG & DEBUG_VERBOSE_MSG ) { mach64DDPrintDirty( __FUNCTION__, mmesa->dirty ); } if ( t0 && t1 && mmesa->mach64Screen->numTexHeaps > 1 ) { if (t0->heap != t1->heap || (mmesa->dirty & MACH64_UPLOAD_TEX0IMAGE) || (mmesa->dirty & MACH64_UPLOAD_TEX1IMAGE)) mach64UploadMultiTexImages( mmesa, t0, t1 ); } else { if ( mmesa->dirty & MACH64_UPLOAD_TEX0IMAGE ) { if ( t0 ) mach64UploadTexImages( mmesa, t0 ); } if ( mmesa->dirty & MACH64_UPLOAD_TEX1IMAGE ) { if ( t1 ) mach64UploadTexImages( mmesa, t1 ); } } if ( mmesa->dirty & (MACH64_UPLOAD_CONTEXT | MACH64_UPLOAD_MISC) ) { memcpy( &sarea->context_state, regs, MACH64_NR_CONTEXT_REGS * sizeof(GLuint) ); } if ( mmesa->dirty & MACH64_UPLOAD_TEXTURE ) { mach64EmitTexStateLocked( mmesa, t0, t1 ); } sarea->vertsize = mmesa->vertex_size; /* Turn off the texture cache flushing. */ mmesa->setup.tex_cntl &= ~MACH64_TEX_CACHE_FLUSH; sarea->dirty |= mmesa->dirty; mmesa->dirty &= MACH64_UPLOAD_CLIPRECTS;}static void mach64DDPrintState( const char *msg, GLuint flags ){ fprintf( stderr, "%s: (0x%x) %s%s%s%s%s%s%s%s%s\n", msg, flags, (flags & MACH64_NEW_CONTEXT) ? "context, " : "", (flags & MACH64_NEW_ALPHA) ? "alpha, " : "", (flags & MACH64_NEW_DEPTH) ? "depth, " : "", (flags & MACH64_NEW_FOG) ? "fog, " : "", (flags & MACH64_NEW_CLIP) ? "clip, " : "", (flags & MACH64_NEW_TEXTURE) ? "texture, " : "", (flags & MACH64_NEW_CULL) ? "cull, " : "", (flags & MACH64_NEW_MASKS) ? "masks, " : "", (flags & MACH64_NEW_WINDOW) ? "window, " : "" );}/* Update the hardware state */void mach64DDUpdateHWState( GLcontext *ctx ){ mach64ContextPtr mmesa = MACH64_CONTEXT(ctx); int new_state = mmesa->new_state; if ( MACH64_DEBUG & DEBUG_VERBOSE_MSG ) { fprintf( stderr, "%s:\n", __FUNCTION__ ); } if ( new_state ) { FLUSH_BATCH( mmesa ); mmesa->new_state = 0; if ( MACH64_DEBUG & DEBUG_VERBOSE_MSG ) mach64DDPrintState( __FUNCTION__, new_state ); /* Update the various parts of the context's state. */ if ( new_state & MACH64_NEW_ALPHA ) mach64UpdateAlphaMode( ctx ); if ( new_state & MACH64_NEW_DEPTH ) mach64UpdateZMode( ctx ); if ( new_state & MACH64_NEW_FOG ) mach64UpdateFogAttrib( ctx ); if ( new_state & MACH64_NEW_CLIP ) mach64UpdateClipping( ctx ); if ( new_state & MACH64_NEW_WINDOW ) mach64CalcViewport( ctx ); if ( new_state & MACH64_NEW_CULL ) mach64UpdateCull( ctx ); if ( new_state & MACH64_NEW_MASKS ) mach64UpdateMasks( ctx ); if ( new_state & MACH64_NEW_TEXTURE ) mach64UpdateTextureState( ctx ); }}static void mach64DDInvalidateState( GLcontext *ctx, GLuint new_state ){ _swrast_InvalidateState( ctx, new_state ); _swsetup_InvalidateState( ctx, new_state ); _vbo_InvalidateState( ctx, new_state ); _tnl_InvalidateState( ctx, new_state ); MACH64_CONTEXT(ctx)->NewGLState |= new_state;}/* Initialize the context's hardware state */void mach64DDInitState( mach64ContextPtr mmesa ){ GLuint format; switch ( mmesa->mach64Screen->cpp ) { case 2: format = MACH64_DATATYPE_RGB565; break; case 4: format = MACH64_DATATYPE_ARGB8888; break; default: fprintf( stderr, "Error: Unsupported pixel depth... exiting\n" ); exit( -1 ); } /* Always have a 16-bit depth buffer * but Z coordinates are specified in 16.1 format to the setup engine. */ mmesa->depth_scale = 2.0; mmesa->ClearColor = 0x00000000; mmesa->ClearDepth = 0x0000ffff; mmesa->Fallback = 0; if ( mmesa->glCtx->Visual.doubleBufferMode ) { mmesa->drawOffset = mmesa->readOffset = mmesa->mach64Screen->backOffset; mmesa->drawPitch = mmesa->readPitch = mmesa->mach64Screen->backPitch; } else { mmesa->drawOffset = mmesa->readOffset = mmesa->mach64Screen->frontOffset; mmesa->drawPitch = mmesa->readPitch = mmesa->mach64Screen->frontPitch; } /* Harware state: */ mmesa->setup.dst_off_pitch = (((mmesa->drawPitch/8) << 22) | (mmesa->drawOffset >> 3)); mmesa->setup.z_off_pitch = (((mmesa->mach64Screen->depthPitch/8) << 22) | (mmesa->mach64Screen->depthOffset >> 3)); mmesa->setup.z_cntl = (MACH64_Z_TEST_LESS | MACH64_Z_MASK_EN); mmesa->setup.alpha_tst_cntl = (MACH64_ALPHA_TEST_ALWAYS | MACH64_ALPHA_DST_SRCALPHA | MACH64_ALPHA_TST_SRC_TEXEL | (0 << MACH64_REF_ALPHA_SHIFT)); mmesa->setup.scale_3d_cntl = (MACH64_SCALE_PIX_EXPAND_DYNAMIC_RANGE | /* MACH64_SCALE_DITHER_ERROR_DIFFUSE | */ MACH64_SCALE_DITHER_2D_TABLE | /* MACH64_DITHER_INIT_CURRENT | */ MACH64_DITHER_INIT_RESET | MACH64_SCALE_3D_FCN_SHADE | MACH64_ALPHA_FOG_DIS | MACH64_ALPHA_BLEND_SRC_ONE | MACH64_ALPHA_BLEND_DST_ZERO | MACH64_TEX_LIGHT_FCN_MODULATE | MACH64_MIP_MAP_DISABLE | MACH64_BILINEAR_TEX_EN | MACH64_TEX_BLEND_FCN_LINEAR); /* GL spec says dithering initially enabled, but dithering causes * problems w/ 24bpp depth */ if ( mmesa->mach64Screen->cpp == 4 ) mmesa->setup.scale_3d_cntl |= MACH64_ROUND_EN; else mmesa->setup.scale_3d_cntl |= MACH64_DITHER_EN; mmesa->setup.sc_left_right = 0x1fff0000; mmesa->setup.sc_top_bottom = 0x3fff0000; mmesa->setup.dp_fog_clr = 0x00ffffff; mmesa->setup.dp_write_mask = 0xffffffff; mmesa->setup.dp_pix_width = ((format << 0) | (format << 4) | (format << 8) | (format << 16) | (format << 28)); mmesa->setup.dp_mix = (MACH64_BKGD_MIX_S | MACH64_FRGD_MIX_S); mmesa->setup.dp_src = (MACH64_BKGD_SRC_3D | MACH64_FRGD_SRC_3D | MACH64_MONO_SRC_ONE); mmesa->setup.clr_cmp_cntl = 0x00000000; mmesa->setup.gui_traj_cntl = (MACH64_DST_X_LEFT_TO_RIGHT | MACH64_DST_Y_TOP_TO_BOTTOM); mmesa->setup.setup_cntl = (MACH64_FLAT_SHADE_OFF | MACH64_SOLID_MODE_OFF | MACH64_LOG_MAX_INC_ADJ); mmesa->setup.setup_cntl = 0; mmesa->setup.tex_size_pitch = 0x00000000; mmesa->setup.tex_cntl = ((0 << MACH64_LOD_BIAS_SHIFT) | (0 << MACH64_COMP_FACTOR_SHIFT) | MACH64_COMP_COMBINE_MODULATE | MACH64_COMP_BLEND_NEAREST | MACH64_COMP_FILTER_NEAREST | /* MACH64_TEXTURE_TILING | */#ifdef MACH64_PREMULT_TEXCOORDS MACH64_TEX_ST_DIRECT | #endif MACH64_TEX_SRC_LOCAL | MACH64_TEX_UNCOMPRESSED | MACH64_TEX_CACHE_FLUSH | MACH64_TEX_CACHE_SIZE_4K); mmesa->setup.secondary_tex_off = 0x00000000; mmesa->setup.tex_offset = 0x00000000; mmesa->new_state = MACH64_NEW_ALL;}/* Initialize the driver's state functions. */void mach64DDInitStateFuncs( GLcontext *ctx ){ ctx->Driver.UpdateState = mach64DDInvalidateState; ctx->Driver.ClearIndex = NULL; ctx->Driver.ClearColor = mach64DDClearColor; ctx->Driver.DrawBuffer = mach64DDDrawBuffer; ctx->Driver.ReadBuffer = mach64DDReadBuffer; ctx->Driver.IndexMask = NULL; ctx->Driver.ColorMask = mach64DDColorMask; ctx->Driver.AlphaFunc = mach64DDAlphaFunc; ctx->Driver.BlendEquationSeparate = mach64DDBlendEquationSeparate; ctx->Driver.BlendFuncSeparate = mach64DDBlendFuncSeparate; ctx->Driver.ClearDepth = mach64DDClearDepth; ctx->Driver.CullFace = mach64DDCullFace; ctx->Driver.FrontFace = mach64DDFrontFace; ctx->Driver.DepthFunc = mach64DDDepthFunc; ctx->Driver.DepthMask = mach64DDDepthMask; ctx->Driver.Enable = mach64DDEnable; ctx->Driver.Fogfv = mach64DDFogfv; ctx->Driver.Hint = NULL; ctx->Driver.Lightfv = NULL; ctx->Driver.LightModelfv = mach64DDLightModelfv; ctx->Driver.LogicOpcode = mach64DDLogicOpCode; ctx->Driver.PolygonMode = NULL; ctx->Driver.PolygonStipple = NULL; ctx->Driver.RenderMode = mach64DDRenderMode; ctx->Driver.Scissor = mach64DDScissor; ctx->Driver.ShadeModel = mach64DDShadeModel; ctx->Driver.DepthRange = mach64DepthRange; ctx->Driver.Viewport = mach64Viewport;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -