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

📄 mach64_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   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 + -