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

📄 i810state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_FOG] = ((GFX_OP_FOG_COLOR | color) &				      ~FOG_RESERVED_MASK);   }}/* ============================================================= */static void i810Enable(GLcontext *ctx, GLenum cap, GLboolean state){   i810ContextPtr imesa = I810_CONTEXT(ctx);   switch(cap) {   case GL_ALPHA_TEST:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_B1] &= ~B1_ALPHA_TEST_ENABLE;      if (state)	 imesa->Setup[I810_CTXREG_B1] |= B1_ALPHA_TEST_ENABLE;      break;   case GL_BLEND:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_B1] &= ~B1_BLEND_ENABLE;      if (state)	 imesa->Setup[I810_CTXREG_B1] |= B1_BLEND_ENABLE;      /* For some reason enable(GL_BLEND) affects ColorLogicOpEnabled.       */      FALLBACK( imesa, I810_FALLBACK_LOGICOP,		(ctx->Color.ColorLogicOpEnabled &&		 ctx->Color.LogicOp != GL_COPY));      break;   case GL_DEPTH_TEST:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_B1] &= ~B1_Z_TEST_ENABLE;      if (state)	 imesa->Setup[I810_CTXREG_B1] |= B1_Z_TEST_ENABLE;      break;   case GL_SCISSOR_TEST:      /* XXX without these next two lines, conform's scissor test fails */      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      I810_STATECHANGE(imesa, I810_UPLOAD_BUFFERS);      I810_FIREVERTICES(imesa);	/* don't pipeline cliprect changes */      imesa->upload_cliprects = GL_TRUE;      imesa->scissor = state;      break;   case GL_POLYGON_STIPPLE:      if (imesa->stipple_in_hw && imesa->reduced_primitive == GL_TRIANGLES)      {	 I810_STATECHANGE(imesa, I810_UPLOAD_CTX);	 imesa->Setup[I810_CTXREG_ST1] &= ~ST1_ENABLE;	 if (state)	    imesa->Setup[I810_CTXREG_ST1] |= ST1_ENABLE;      }      break;   case GL_LINE_SMOOTH:      /* Need to fatten the lines by .5, or they disappear...       */      if (imesa->reduced_primitive == GL_LINES) {	 I810_STATECHANGE(imesa, I810_UPLOAD_CTX);	 imesa->Setup[I810_CTXREG_AA] &= ~AA_ENABLE;	 imesa->Setup[I810_CTXREG_LCS] &= ~LCS_LINEWIDTH_0_5;	 if (state) {	    imesa->Setup[I810_CTXREG_AA] |= AA_ENABLE;	    imesa->Setup[I810_CTXREG_LCS] |= LCS_LINEWIDTH_0_5;	 }      }      break;   case GL_POINT_SMOOTH:      if (imesa->reduced_primitive == GL_POINTS) {	 I810_STATECHANGE(imesa, I810_UPLOAD_CTX);	 imesa->Setup[I810_CTXREG_AA] &= ~AA_ENABLE;	 imesa->Setup[I810_CTXREG_LCS] &= ~LCS_LINEWIDTH_0_5;	 if (state) {	    imesa->Setup[I810_CTXREG_AA] |= AA_ENABLE;	    imesa->Setup[I810_CTXREG_LCS] |= LCS_LINEWIDTH_0_5;	 }      }      break;   case GL_POLYGON_SMOOTH:      if (imesa->reduced_primitive == GL_TRIANGLES) {	 I810_STATECHANGE(imesa, I810_UPLOAD_CTX);	 imesa->Setup[I810_CTXREG_AA] &= ~AA_ENABLE;	 if (state)	    imesa->Setup[I810_CTXREG_AA] |= AA_ENABLE;      }      break;   case GL_FOG:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_B1] &= ~B1_FOG_ENABLE;      if (state)	 imesa->Setup[I810_CTXREG_B1] |= B1_FOG_ENABLE;      break;   case GL_CULL_FACE:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      imesa->Setup[I810_CTXREG_LCS] &= ~LCS_CULL_MASK;      if (state)	 imesa->Setup[I810_CTXREG_LCS] |= imesa->LcsCullMode;      else	 imesa->Setup[I810_CTXREG_LCS] |= LCS_CULL_DISABLE;      break;   case GL_TEXTURE_2D:   case GL_TEXTURE_RECTANGLE_NV:      I810_STATECHANGE(imesa, I810_UPLOAD_CTX);      if (ctx->Texture.CurrentUnit == 0) {	 imesa->Setup[I810_CTXREG_MT] &= ~MT_TEXEL0_ENABLE;	 if (state)	    imesa->Setup[I810_CTXREG_MT] |= MT_TEXEL0_ENABLE;      } else {	 imesa->Setup[I810_CTXREG_MT] &= ~MT_TEXEL1_ENABLE;	 if (state)	    imesa->Setup[I810_CTXREG_MT] |= MT_TEXEL1_ENABLE;      }      break;   case GL_COLOR_LOGIC_OP:      FALLBACK( imesa, I810_FALLBACK_LOGICOP,		(state && ctx->Color.LogicOp != GL_COPY));      break;   case GL_STENCIL_TEST:      FALLBACK( imesa, I810_FALLBACK_STENCIL, state );      break;   default:      ;   }}/* ============================================================= */void i810EmitDrawingRectangle( i810ContextPtr imesa ){   __DRIdrawablePrivate *dPriv = imesa->driDrawable;   i810ScreenPrivate *i810Screen = imesa->i810Screen;   int x0 = imesa->drawX;   int y0 = imesa->drawY;   int x1 = x0 + dPriv->w;   int y1 = y0 + dPriv->h;   GLuint dr2, dr3, dr4;   /* Coordinate origin of the window - may be offscreen.    */   dr4 = imesa->BufferSetup[I810_DESTREG_DR4] = ((y0<<16) |						 (((unsigned)x0)&0xFFFF));   /* Clip to screen.    */   if (x0 < 0) x0 = 0;   if (y0 < 0) y0 = 0;   if (x1 > i810Screen->width-1) x1 = i810Screen->width-1;   if (y1 > i810Screen->height-1) y1 = i810Screen->height-1;   /* Onscreen drawing rectangle.    */   dr2 = imesa->BufferSetup[I810_DESTREG_DR2] = ((y0<<16) | x0);   dr3 = imesa->BufferSetup[I810_DESTREG_DR3] = (((y1+1)<<16) | (x1+1));   imesa->dirty |= I810_UPLOAD_BUFFERS;}static void i810CalcViewport( GLcontext *ctx ){   i810ContextPtr imesa = I810_CONTEXT(ctx);   const GLfloat *v = ctx->Viewport._WindowMap.m;   GLfloat *m = imesa->ViewportMatrix.m;   /* See also i810_translate_vertex.  SUBPIXEL adjustments can be done    * via state vars, too.    */   m[MAT_SX] =   v[MAT_SX];   m[MAT_TX] =   v[MAT_TX] + SUBPIXEL_X;   m[MAT_SY] = - v[MAT_SY];   m[MAT_TY] = - v[MAT_TY] + imesa->driDrawable->h + SUBPIXEL_Y;   m[MAT_SZ] =   v[MAT_SZ] * (1.0 / 0xffff);   m[MAT_TZ] =   v[MAT_TZ] * (1.0 / 0xffff);}static void i810Viewport( GLcontext *ctx,			  GLint x, GLint y,			  GLsizei width, GLsizei height ){   i810CalcViewport( ctx );}static void i810DepthRange( GLcontext *ctx,			    GLclampd nearval, GLclampd farval ){   i810CalcViewport( ctx );}void i810PrintDirty( const char *msg, GLuint state ){   fprintf(stderr, "%s (0x%x): %s%s%s%s\n",	   msg,	   (unsigned int) state,	   (state & I810_UPLOAD_TEX0)  ? "upload-tex0, " : "",	   (state & I810_UPLOAD_TEX1)  ? "upload-tex1, " : "",	   (state & I810_UPLOAD_CTX)        ? "upload-ctx, " : "",	   (state & I810_UPLOAD_BUFFERS)    ? "upload-bufs, " : ""	   );}void i810InitState( GLcontext *ctx ){   i810ContextPtr imesa = I810_CONTEXT(ctx);   i810ScreenPrivate *i810Screen = imesa->i810Screen;   memset(imesa->Setup, 0, sizeof(imesa->Setup));   imesa->Setup[I810_CTXREG_VF] = 0;   imesa->Setup[I810_CTXREG_MT] = (GFX_OP_MAP_TEXELS |				   MT_UPDATE_TEXEL1_STATE |				   MT_TEXEL1_COORD1 |				   MT_TEXEL1_MAP1 |				   MT_TEXEL1_DISABLE |				   MT_UPDATE_TEXEL0_STATE |				   MT_TEXEL0_COORD0 |				   MT_TEXEL0_MAP0 |				   MT_TEXEL0_DISABLE);   imesa->Setup[I810_CTXREG_MC0] = ( GFX_OP_MAP_COLOR_STAGES |				     MC_STAGE_0 |				     MC_UPDATE_DEST |				     MC_DEST_CURRENT |				     MC_UPDATE_ARG1 |				     ((MC_ARG_ITERATED_COLOR |				       MC_ARG_DONT_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG1_SHIFT) |				     MC_UPDATE_ARG2 |				     ((MC_ARG_ONE |				       MC_ARG_DONT_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG2_SHIFT) |				     MC_UPDATE_OP |				     MC_OP_ARG1 );   imesa->Setup[I810_CTXREG_MC1] = ( GFX_OP_MAP_COLOR_STAGES |				     MC_STAGE_1 |				     MC_UPDATE_DEST |				     MC_DEST_CURRENT |				     MC_UPDATE_ARG1 |				     ((MC_ARG_ONE |				       MC_ARG_DONT_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG1_SHIFT) |				     MC_UPDATE_ARG2 |				     ((MC_ARG_ONE |				       MC_ARG_DONT_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG2_SHIFT) |				     MC_UPDATE_OP |				     MC_OP_DISABLE );   imesa->Setup[I810_CTXREG_MC2] = ( GFX_OP_MAP_COLOR_STAGES |				     MC_STAGE_2 |				     MC_UPDATE_DEST |				     MC_DEST_CURRENT |				     MC_UPDATE_ARG1 |				     ((MC_ARG_CURRENT_COLOR |				       MC_ARG_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG1_SHIFT) |				     MC_UPDATE_ARG2 |				     ((MC_ARG_ONE |				       MC_ARG_DONT_REPLICATE_ALPHA |				       MC_ARG_DONT_INVERT) << MC_ARG2_SHIFT) |				     MC_UPDATE_OP |				     MC_OP_DISABLE );   imesa->Setup[I810_CTXREG_MA0] = ( GFX_OP_MAP_ALPHA_STAGES |				     MA_STAGE_0 |				     MA_UPDATE_ARG1 |				     ((MA_ARG_ITERATED_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG1_SHIFT) |				     MA_UPDATE_ARG2 |				     ((MA_ARG_CURRENT_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG2_SHIFT) |				     MA_UPDATE_OP |				     MA_OP_ARG1 );   imesa->Setup[I810_CTXREG_MA1] = ( GFX_OP_MAP_ALPHA_STAGES |				     MA_STAGE_1 |				     MA_UPDATE_ARG1 |				     ((MA_ARG_CURRENT_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG1_SHIFT) |				     MA_UPDATE_ARG2 |				     ((MA_ARG_CURRENT_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG2_SHIFT) |				     MA_UPDATE_OP |				     MA_OP_ARG1 );   imesa->Setup[I810_CTXREG_MA2] = ( GFX_OP_MAP_ALPHA_STAGES |				     MA_STAGE_2 |				     MA_UPDATE_ARG1 |				     ((MA_ARG_CURRENT_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG1_SHIFT) |				     MA_UPDATE_ARG2 |				     ((MA_ARG_CURRENT_ALPHA |				       MA_ARG_DONT_INVERT) << MA_ARG2_SHIFT) |				     MA_UPDATE_OP |				     MA_OP_ARG1 );   imesa->Setup[I810_CTXREG_SDM] = ( GFX_OP_SRC_DEST_MONO |				     SDM_UPDATE_MONO_ENABLE |				     0 |				     SDM_UPDATE_SRC_BLEND |				     SDM_SRC_ONE |				     SDM_UPDATE_DST_BLEND |				     SDM_DST_ZERO );   /* Use for colormask:    */   imesa->Setup[I810_CTXREG_CF0] = GFX_OP_COLOR_FACTOR;   imesa->Setup[I810_CTXREG_CF1] = 0xffffffff;   imesa->Setup[I810_CTXREG_ZA] = (GFX_OP_ZBIAS_ALPHAFUNC |				   ZA_UPDATE_ALPHAFUNC |				   ZA_ALPHA_ALWAYS |				   ZA_UPDATE_ZBIAS |				   0 |				   ZA_UPDATE_ALPHAREF |				   0x0);   imesa->Setup[I810_CTXREG_FOG] = (GFX_OP_FOG_COLOR |				    (0xffffff & ~FOG_RESERVED_MASK));   /* Choose a pipe    */   imesa->Setup[I810_CTXREG_B1] = ( GFX_OP_BOOL_1 |				    B1_UPDATE_SPEC_SETUP_ENABLE |				    0 |				    B1_UPDATE_ALPHA_SETUP_ENABLE |				    B1_ALPHA_SETUP_ENABLE |				    B1_UPDATE_CI_KEY_ENABLE |				    0 |				    B1_UPDATE_CHROMAKEY_ENABLE |				    0 |				    B1_UPDATE_Z_BIAS_ENABLE |				    0 |				    B1_UPDATE_SPEC_ENABLE |				    0 |				    B1_UPDATE_FOG_ENABLE |				    0 |				    B1_UPDATE_ALPHA_TEST_ENABLE |				    0 |				    B1_UPDATE_BLEND_ENABLE |				    0 |				    B1_UPDATE_Z_TEST_ENABLE |				    0 );   imesa->Setup[I810_CTXREG_B2] = ( GFX_OP_BOOL_2 |				    B2_UPDATE_MAP_CACHE_ENABLE |				    B2_MAP_CACHE_ENABLE |				    B2_UPDATE_ALPHA_DITHER_ENABLE |				    0 |				    B2_UPDATE_FOG_DITHER_ENABLE |				    0 |				    B2_UPDATE_SPEC_DITHER_ENABLE |				    0 |				    B2_UPDATE_RGB_DITHER_ENABLE |				    B2_RGB_DITHER_ENABLE |				    B2_UPDATE_FB_WRITE_ENABLE |				    B2_FB_WRITE_ENABLE |				    B2_UPDATE_ZB_WRITE_ENABLE |				    B2_ZB_WRITE_ENABLE );   imesa->Setup[I810_CTXREG_LCS] = ( GFX_OP_LINEWIDTH_CULL_SHADE_MODE |				     LCS_UPDATE_ZMODE |				     LCS_Z_LESS |				     LCS_UPDATE_LINEWIDTH |				     LCS_LINEWIDTH_1_0 |				     LCS_UPDATE_ALPHA_INTERP |				     LCS_ALPHA_INTERP |				     LCS_UPDATE_FOG_INTERP |				     0 |				     LCS_UPDATE_SPEC_INTERP |				     0 |				     LCS_UPDATE_RGB_INTERP |				     LCS_RGB_INTERP |				     LCS_UPDATE_CULL_MODE |				     LCS_CULL_DISABLE);   imesa->LcsCullMode = LCS_CULL_CW;   imesa->LcsLineWidth = LCS_LINEWIDTH_1_0;   imesa->LcsPointSize = LCS_LINEWIDTH_1_0;   imesa->Setup[I810_CTXREG_PV] = ( GFX_OP_PV_RULE |				    PV_UPDATE_PIXRULE |				    PV_PIXRULE_ENABLE |				    PV_UPDATE_LINELIST |				    PV_LINELIST_PV1 |				    PV_UPDATE_TRIFAN |				    PV_TRIFAN_PV2 |				    PV_UPDATE_TRISTRIP |				    PV_TRISTRIP_PV2 );   imesa->Setup[I810_CTXREG_ST0] = GFX_OP_STIPPLE;   imesa->Setup[I810_CTXREG_ST1] = 0;   imesa->Setup[I810_CTXREG_AA] = ( GFX_OP_ANTIALIAS |				    AA_UPDATE_EDGEFLAG |				    0 |				    AA_UPDATE_POLYWIDTH |				    AA_POLYWIDTH_05 |				    AA_UPDATE_LINEWIDTH |				    AA_LINEWIDTH_05 |				    AA_UPDATE_BB_EXPANSION |				    0 |				    AA_UPDATE_AA_ENABLE |				    0 );   memset(imesa->BufferSetup, 0, sizeof(imesa->BufferSetup));   imesa->BufferSetup[I810_DESTREG_DI0] = CMD_OP_DESTBUFFER_INFO;   if (imesa->glCtx->Visual.doubleBufferMode && imesa->sarea->pf_current_page == 0) {      /* use back buffer by default */      imesa->BufferSetup[I810_DESTREG_DI1] = (i810Screen->backOffset |					      i810Screen->backPitchBits);   } else {      /* use front buffer by default */      imesa->BufferSetup[I810_DESTREG_DI1] = (i810Screen->fbOffset |					      i810Screen->backPitchBits);   }   imesa->BufferSetup[I810_DESTREG_DV0] = GFX_OP_DESTBUFFER_VARS;   imesa->BufferSetup[I810_DESTREG_DV1] = (DV_HORG_BIAS_OGL |					   DV_VORG_BIAS_OGL |					   i810Screen->fbFormat);   imesa->BufferSetup[I810_DESTREG_DR0] = GFX_OP_DRAWRECT_INFO;   imesa->BufferSetup[I810_DESTREG_DR1] = DR1_RECT_CLIP_ENABLE;}static void i810InvalidateState( 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 );   I810_CONTEXT(ctx)->new_state |= new_state;}void i810InitStateFuncs(GLcontext *ctx){   /* Callbacks for internal Mesa events.    */   ctx->Driver.UpdateState = i810InvalidateState;   /* API callbacks    */   ctx->Driver.AlphaFunc = i810AlphaFunc;   ctx->Driver.BlendEquationSeparate = i810BlendEquationSeparate;   ctx->Driver.BlendFuncSeparate = i810BlendFuncSeparate;   ctx->Driver.ClearColor = i810ClearColor;   ctx->Driver.ColorMask = i810ColorMask;   ctx->Driver.CullFace = i810CullFaceFrontFace;   ctx->Driver.DepthFunc = i810DepthFunc;   ctx->Driver.DepthMask = i810DepthMask;   ctx->Driver.Enable = i810Enable;   ctx->Driver.Fogfv = i810Fogfv;   ctx->Driver.FrontFace = i810CullFaceFrontFace;   ctx->Driver.LineWidth = i810LineWidth;   ctx->Driver.LogicOpcode = i810LogicOp;   ctx->Driver.PolygonStipple = i810PolygonStipple;   ctx->Driver.RenderMode = i810RenderMode;   ctx->Driver.Scissor = i810Scissor;   ctx->Driver.DrawBuffer = i810DrawBuffer;   ctx->Driver.ReadBuffer = i810ReadBuffer;   ctx->Driver.ShadeModel = i810ShadeModel;   ctx->Driver.DepthRange = i810DepthRange;   ctx->Driver.Viewport = i810Viewport;   ctx->Driver.PointSize = i810PointSize;   if (IS_I815(I810_CONTEXT(ctx))) {      ctx->Driver.LightModelfv = i810LightModelfv_i815;   } else {      ctx->Driver.LightModelfv = i810LightModelfv;   }}

⌨️ 快捷键说明

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