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

📄 mgastate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   0x5a5a,   0xa0a0,   0x5050,   0x0a0a,   0x0505,   0x8020,   0x0401,   0x1040,   0x0208,   0x0802,   0x4010,   0x0104,   0x2080,   0x0000};/** * The MGA supports a subset of possible 4x4 stipples natively, GL * wants 32x32.  Fortunately stipple is usually a repeating pattern. * * \param ctx GL rendering context to be affected * \param mask Pointer to the 32x32 stipple mask */static void mgaDDPolygonStipple( GLcontext *ctx, const GLubyte *mask ){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   const GLubyte *m = mask;   GLubyte p[4];   int i,j,k;   int active = (ctx->Polygon.StippleFlag && 		 mmesa->raster_primitive == GL_TRIANGLES);   GLuint stipple;   FLUSH_BATCH(mmesa);   mmesa->haveHwStipple = 0;   if (active) {      mmesa->dirty |= MGA_UPLOAD_CONTEXT;      mmesa->setup.dwgctl &= ~(0xf<<20);   }   p[0] = mask[0] & 0xf; p[0] |= p[0] << 4;   p[1] = mask[4] & 0xf; p[1] |= p[1] << 4;   p[2] = mask[8] & 0xf; p[2] |= p[2] << 4;   p[3] = mask[12] & 0xf; p[3] |= p[3] << 4;   for (k = 0 ; k < 8 ; k++)      for (j = 0 ; j < 4; j++)	 for (i = 0 ; i < 4 ; i++)	    if (*m++ != p[j]) {	       return;	    }   stipple = ( ((p[0] & 0xf) << 0) |	       ((p[1] & 0xf) << 4) |	       ((p[2] & 0xf) << 8) |	       ((p[3] & 0xf) << 12) );   for (i = 0 ; i < 16 ; i++)      if (mgaStipples[i] == stipple) {	 mmesa->poly_stipple = i<<20;	 mmesa->haveHwStipple = 1;	 break;      }      if (active) {      mmesa->setup.dwgctl &= ~(0xf<<20);      mmesa->setup.dwgctl |= mmesa->poly_stipple;   }}/* ============================================================= * Rendering attributes * * We really don't want to recalculate all this every time we bind a * texture.  These things shouldn't change all that often, so it makes * sense to break them out of the core texture state update routines. */static void updateSpecularLighting( GLcontext *ctx ){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   unsigned int specen;   specen = NEED_SECONDARY_COLOR(ctx) ? TMC_specen_enable : 0;   if ( specen != mmesa->hw.specen ) {      mmesa->hw.specen = specen;      mmesa->dirty |= MGA_UPLOAD_TEX0 | MGA_UPLOAD_TEX1;   }}/* ============================================================= * Materials */static void mgaDDLightModelfv(GLcontext *ctx, GLenum pname,			      const GLfloat *param){   if (pname == GL_LIGHT_MODEL_COLOR_CONTROL) {      FLUSH_BATCH( MGA_CONTEXT(ctx) );      updateSpecularLighting( ctx );   }}/* ============================================================= * Stencil */static voidmgaDDStencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func, GLint ref,                         GLuint mask){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   GLuint  stencil;   GLuint  stencilctl;   stencil = MGA_FIELD( S_sref, ref ) | MGA_FIELD( S_smsk, mask );   switch (func)   {   case GL_NEVER:      stencilctl = SC_smode_snever;      break;   case GL_LESS:      stencilctl = SC_smode_slt;      break;   case GL_LEQUAL:      stencilctl = SC_smode_slte;      break;   case GL_GREATER:      stencilctl = SC_smode_sgt;      break;   case GL_GEQUAL:      stencilctl = SC_smode_sgte;      break;   case GL_NOTEQUAL:      stencilctl = SC_smode_sne;      break;   case GL_EQUAL:      stencilctl = SC_smode_se;      break;   case GL_ALWAYS:   default:      stencilctl = SC_smode_salways;      break;   }   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );   mmesa->hw.stencil &= (S_sref_MASK & S_smsk_MASK);   mmesa->hw.stencil |= stencil;   mmesa->hw.stencilctl &= SC_smode_MASK;   mmesa->hw.stencilctl |= stencilctl;}static voidmgaDDStencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );   mmesa->hw.stencil &= S_swtmsk_MASK;   mmesa->hw.stencil |= MGA_FIELD( S_swtmsk, mask );}static voidmgaDDStencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail, GLenum zfail,                       GLenum zpass){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   GLuint  stencilctl;   stencilctl = 0;   switch (ctx->Stencil.FailFunc[0])   {   case GL_KEEP:      stencilctl |= SC_sfailop_keep;      break;   case GL_ZERO:      stencilctl |= SC_sfailop_zero;      break;   case GL_REPLACE:      stencilctl |= SC_sfailop_replace;      break;   case GL_INCR:      stencilctl |= SC_sfailop_incrsat;      break;   case GL_DECR:      stencilctl |= SC_sfailop_decrsat;      break;   case GL_INCR_WRAP:      stencilctl |= SC_sfailop_incr;      break;   case GL_DECR_WRAP:      stencilctl |= SC_sfailop_decr;      break;   case GL_INVERT:      stencilctl |= SC_sfailop_invert;      break;   default:      break;   }   switch (ctx->Stencil.ZFailFunc[0])   {   case GL_KEEP:      stencilctl |= SC_szfailop_keep;      break;   case GL_ZERO:      stencilctl |= SC_szfailop_zero;      break;   case GL_REPLACE:      stencilctl |= SC_szfailop_replace;      break;   case GL_INCR:      stencilctl |= SC_szfailop_incrsat;      break;   case GL_DECR:      stencilctl |= SC_szfailop_decrsat;      break;   case GL_INCR_WRAP:      stencilctl |= SC_szfailop_incr;      break;   case GL_DECR_WRAP:      stencilctl |= SC_szfailop_decr;      break;   case GL_INVERT:      stencilctl |= SC_szfailop_invert;      break;   default:      break;   }   switch (ctx->Stencil.ZPassFunc[0])   {   case GL_KEEP:      stencilctl |= SC_szpassop_keep;      break;   case GL_ZERO:      stencilctl |= SC_szpassop_zero;      break;   case GL_REPLACE:      stencilctl |= SC_szpassop_replace;      break;   case GL_INCR:      stencilctl |= SC_szpassop_incrsat;      break;   case GL_DECR:      stencilctl |= SC_szpassop_decrsat;      break;   case GL_INCR_WRAP:      stencilctl |= SC_szpassop_incr;      break;   case GL_DECR_WRAP:      stencilctl |= SC_szpassop_decr;      break;   case GL_INVERT:      stencilctl |= SC_szpassop_invert;      break;   default:      break;   }   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );   mmesa->hw.stencilctl &= (SC_sfailop_MASK & SC_szfailop_MASK 			    & SC_szpassop_MASK);   mmesa->hw.stencilctl |= stencilctl;}/* ============================================================= * Window position and viewport transformation */void mgaCalcViewport( GLcontext *ctx ){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   const GLfloat *v = ctx->Viewport._WindowMap.m;   GLfloat *m = mmesa->hw_viewport;   /* See also mga_translate_vertex.    */   m[MAT_SX] =   v[MAT_SX];   m[MAT_TX] =   v[MAT_TX] + mmesa->drawX + SUBPIXEL_X;   m[MAT_SY] = - v[MAT_SY];   m[MAT_TY] = - v[MAT_TY] + mmesa->driDrawable->h + mmesa->drawY + SUBPIXEL_Y;   m[MAT_SZ] =   v[MAT_SZ] * mmesa->depth_scale;   m[MAT_TZ] =   v[MAT_TZ] * mmesa->depth_scale;   mmesa->SetupNewInputs = ~0;}static void mgaViewport( GLcontext *ctx, 			  GLint x, GLint y, 			  GLsizei width, GLsizei height ){   mgaCalcViewport( ctx );}static void mgaDepthRange( GLcontext *ctx, 			    GLclampd nearval, GLclampd farval ){   mgaCalcViewport( ctx );}/* ============================================================= * Miscellaneous */static void mgaDDClearColor(GLcontext *ctx, 			    const GLfloat color[4] ){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   GLubyte c[4];   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);   mmesa->ClearColor = mgaPackColor( mmesa->mgaScreen->cpp,				     c[0], c[1], c[2], c[3]);}/* Fallback to swrast for select and feedback. */static void mgaRenderMode( GLcontext *ctx, GLenum mode ){   FALLBACK( ctx, MGA_FALLBACK_RENDERMODE, (mode != GL_RENDER) );}static void mgaDDLogicOp( GLcontext *ctx, GLenum opcode ){   mgaContextPtr mmesa = MGA_CONTEXT( ctx );   MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT );   mmesa->hw.rop = mgarop_NoBLK[ opcode & 0x0f ];}static void mga_set_cliprects(mgaContextPtr mmesa){   __DRIdrawablePrivate *driDrawable = mmesa->driDrawable;   if ((mmesa->draw_buffer != MGA_FRONT)       || (driDrawable->numBackClipRects == 0)) {      if (driDrawable->numClipRects == 0) {	  static drm_clip_rect_t zeroareacliprect = {0,0,0,0};	  mmesa->numClipRects = 1;	  mmesa->pClipRects = &zeroareacliprect;      } else {	  mmesa->numClipRects = driDrawable->numClipRects;	  mmesa->pClipRects = driDrawable->pClipRects;      }      mmesa->drawX = driDrawable->x;      mmesa->drawY = driDrawable->y;   } else {      mmesa->numClipRects = driDrawable->numBackClipRects;      mmesa->pClipRects = driDrawable->pBackClipRects;      mmesa->drawX = driDrawable->backX;      mmesa->drawY = driDrawable->backY;   }   mmesa->setup.dstorg = mmesa->drawOffset;   mmesa->dirty |= MGA_UPLOAD_CONTEXT | MGA_UPLOAD_CLIPRECTS;}void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers ){   __DRIdrawablePrivate *const driDrawable = mmesa->driDrawable;   __DRIdrawablePrivate *const driReadable = mmesa->driReadable;   mmesa->dirty_cliprects = 0;	   driUpdateFramebufferSize(mmesa->glCtx, driDrawable);   if (driDrawable != driReadable) {      driUpdateFramebufferSize(mmesa->glCtx, driReadable);   }   mga_set_cliprects(mmesa);   mgaUpdateClipping( mmesa->glCtx );   mgaCalcViewport( mmesa->glCtx );}static void mgaDDDrawBuffer(GLcontext *ctx, GLenum mode ){   mgaContextPtr mmesa = MGA_CONTEXT(ctx);   FLUSH_BATCH( mmesa );   if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {

⌨️ 快捷键说明

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