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

📄 i830_state.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	      (ctx->Color.BlendEnabled) ? "en" : "dis");   }}static void i830BlendEquationSeparate(GLcontext *ctx, GLenum modeRGB,				      GLenum modeA) {   if (INTEL_DEBUG&DEBUG_DRI)     fprintf(stderr, "%s -> %s, %s\n", __FUNCTION__,	     _mesa_lookup_enum_by_nr(modeRGB),	     _mesa_lookup_enum_by_nr(modeA));   (void) modeRGB;   (void) modeA;   i830_set_blend_state( ctx );}static void i830BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, 				  GLenum dfactorRGB, GLenum sfactorA,				  GLenum dfactorA ){   if (INTEL_DEBUG&DEBUG_DRI)     fprintf(stderr, "%s -> RGB(%s, %s) A(%s, %s)\n", __FUNCTION__,	     _mesa_lookup_enum_by_nr(sfactorRGB),	     _mesa_lookup_enum_by_nr(dfactorRGB),	     _mesa_lookup_enum_by_nr(sfactorA),	     _mesa_lookup_enum_by_nr(dfactorA));   (void) sfactorRGB;   (void) dfactorRGB;   (void) sfactorA;   (void) dfactorA;   i830_set_blend_state( ctx );}static void i830DepthFunc(GLcontext *ctx, GLenum func){   struct i830_context *i830 = i830_context(ctx);   int test = intel_translate_compare_func(func);   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_STATE3] &= ~DEPTH_TEST_FUNC_MASK;   i830->state.Ctx[I830_CTXREG_STATE3] |= (ENABLE_DEPTH_TEST_FUNC |				       DEPTH_TEST_FUNC(test));}static void i830DepthMask(GLcontext *ctx, GLboolean flag){   struct i830_context *i830 = i830_context(ctx);   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s flag (%d)\n", __FUNCTION__, flag);   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_ENABLES_2] &= ~ENABLE_DIS_DEPTH_WRITE_MASK;   if (flag && ctx->Depth.Test)      i830->state.Ctx[I830_CTXREG_ENABLES_2] |= ENABLE_DEPTH_WRITE;   else      i830->state.Ctx[I830_CTXREG_ENABLES_2] |= DISABLE_DEPTH_WRITE;}/* ============================================================= * Polygon stipple * * The i830 supports a 4x4 stipple natively, GL wants 32x32. * Fortunately stipple is usually a repeating pattern. */static void i830PolygonStipple( GLcontext *ctx, const GLubyte *mask ){   struct i830_context *i830 = i830_context(ctx);   const GLubyte *m = mask;   GLubyte p[4];   int i,j,k;   int active = (ctx->Polygon.StippleFlag &&		 i830->intel.reduced_primitive == GL_TRIANGLES);   GLuint newMask;   if (active) {      I830_STATECHANGE(i830, I830_UPLOAD_STIPPLE);      i830->state.Stipple[I830_STPREG_ST1] &= ~ST1_ENABLE;   }   p[0] = mask[12] & 0xf; p[0] |= p[0] << 4;   p[1] = mask[8] & 0xf; p[1] |= p[1] << 4;   p[2] = mask[4] & 0xf; p[2] |= p[2] << 4;   p[3] = mask[0] & 0xf; p[3] |= p[3] << 4;   for (k = 0 ; k < 8 ; k++)      for (j = 3 ; j >= 0; j--)	 for (i = 0 ; i < 4 ; i++, m++)	    if (*m != p[j]) {	       i830->intel.hw_stipple = 0;	       return;	    }   newMask = (((p[0] & 0xf) << 0) |	      ((p[1] & 0xf) << 4) |	      ((p[2] & 0xf) << 8) |	      ((p[3] & 0xf) << 12));   if (newMask == 0xffff || newMask == 0x0) {      /* this is needed to make conform pass */      i830->intel.hw_stipple = 0;      return;   }   i830->state.Stipple[I830_STPREG_ST1] &= ~0xffff;   i830->state.Stipple[I830_STPREG_ST1] |= newMask;   i830->intel.hw_stipple = 1;   if (active)      i830->state.Stipple[I830_STPREG_ST1] |= ST1_ENABLE;}/* ============================================================= * Hardware clipping */static void i830Scissor(GLcontext *ctx, GLint x, GLint y, 			GLsizei w, GLsizei h){   struct i830_context *i830 = i830_context(ctx);   int x1, y1, x2, y2;   if (!ctx->DrawBuffer)      return;   x1 = x;   y1 = ctx->DrawBuffer->Height - (y + h);   x2 = x + w - 1;   y2 = y1 + h - 1;   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "[%s] x(%d) y(%d) w(%d) h(%d)\n", __FUNCTION__,	      x, y, w, h);   x1 = CLAMP(x1, 0, ctx->DrawBuffer->Width - 1);   y1 = CLAMP(y1, 0, ctx->DrawBuffer->Height - 1);   x2 = CLAMP(x2, 0, ctx->DrawBuffer->Width - 1);   y2 = CLAMP(y2, 0, ctx->DrawBuffer->Height - 1);   I830_STATECHANGE(i830, I830_UPLOAD_BUFFERS);   i830->state.Buffer[I830_DESTREG_SR1] = (y1 << 16) | (x1 & 0xffff);   i830->state.Buffer[I830_DESTREG_SR2] = (y2 << 16) | (x2 & 0xffff);}static void i830LogicOp(GLcontext *ctx, GLenum opcode){   struct i830_context *i830 = i830_context(ctx);   int tmp = intel_translate_logic_op( opcode );   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_STATE4] &= ~LOGICOP_MASK;   i830->state.Ctx[I830_CTXREG_STATE4] |= LOGIC_OP_FUNC(tmp);}static void i830CullFaceFrontFace(GLcontext *ctx, GLenum unused){   struct i830_context *i830 = i830_context(ctx);   GLuint mode;   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   if (!ctx->Polygon.CullFlag) {      mode = CULLMODE_NONE;   }   else if (ctx->Polygon.CullFaceMode != GL_FRONT_AND_BACK) {      mode = CULLMODE_CW;      if (ctx->Polygon.CullFaceMode == GL_FRONT)	 mode ^= (CULLMODE_CW ^ CULLMODE_CCW);      if (ctx->Polygon.FrontFace != GL_CCW)	 mode ^= (CULLMODE_CW ^ CULLMODE_CCW);   }   else {      mode = CULLMODE_BOTH;   }   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_STATE3] &= ~CULLMODE_MASK;   i830->state.Ctx[I830_CTXREG_STATE3] |= ENABLE_CULL_MODE | mode;}static void i830LineWidth( GLcontext *ctx, GLfloat widthf ){   struct i830_context *i830 = i830_context( ctx );   int width;   int state5;   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   width = (int)(widthf * 2);   CLAMP_SELF(width, 1, 15);      state5 = i830->state.Ctx[I830_CTXREG_STATE5] & ~FIXED_LINE_WIDTH_MASK;   state5 |= (ENABLE_FIXED_LINE_WIDTH | FIXED_LINE_WIDTH(width));   if (state5 != i830->state.Ctx[I830_CTXREG_STATE5]) {      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_STATE5] = state5;   }}static void i830PointSize(GLcontext *ctx, GLfloat size){   struct i830_context *i830 = i830_context(ctx);   GLint point_size = (int)size;   if (INTEL_DEBUG&DEBUG_DRI)     fprintf(stderr, "%s\n", __FUNCTION__);   CLAMP_SELF(point_size, 1, 256);   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_STATE5] &= ~FIXED_POINT_WIDTH_MASK;   i830->state.Ctx[I830_CTXREG_STATE5] |= (ENABLE_FIXED_POINT_WIDTH |				       FIXED_POINT_WIDTH(point_size));}/* ============================================================= * Color masks */static void i830ColorMask(GLcontext *ctx,			  GLboolean r, GLboolean g,			  GLboolean b, GLboolean a){   struct i830_context *i830 = i830_context( ctx );   GLuint tmp = 0;   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__, r, g, b, a);   tmp = ((i830->state.Ctx[I830_CTXREG_ENABLES_2] & ~WRITEMASK_MASK) |	  ENABLE_COLOR_MASK |	  ENABLE_COLOR_WRITE |	  ((!r) << WRITEMASK_RED_SHIFT) |	  ((!g) << WRITEMASK_GREEN_SHIFT) |	  ((!b) << WRITEMASK_BLUE_SHIFT) |	  ((!a) << WRITEMASK_ALPHA_SHIFT));   if (tmp != i830->state.Ctx[I830_CTXREG_ENABLES_2]) {      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_ENABLES_2] = tmp;   }}static void update_specular( GLcontext *ctx ){   struct i830_context *i830 = i830_context( ctx );   I830_STATECHANGE(i830, I830_UPLOAD_CTX);   i830->state.Ctx[I830_CTXREG_ENABLES_1] &= ~ENABLE_SPEC_ADD_MASK;   if (NEED_SECONDARY_COLOR(ctx))      i830->state.Ctx[I830_CTXREG_ENABLES_1] |= ENABLE_SPEC_ADD;   else      i830->state.Ctx[I830_CTXREG_ENABLES_1] |= DISABLE_SPEC_ADD;}static void i830LightModelfv(GLcontext *ctx, GLenum pname, 			     const GLfloat *param){   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   if (pname == GL_LIGHT_MODEL_COLOR_CONTROL) {      update_specular( ctx );   }}/* In Mesa 3.5 we can reliably do native flatshading. */static void i830ShadeModel(GLcontext *ctx, GLenum mode){   struct i830_context *i830 = i830_context(ctx);   I830_STATECHANGE(i830, I830_UPLOAD_CTX);#define SHADE_MODE_MASK ((1<<10)|(1<<8)|(1<<6)|(1<<4))   i830->state.Ctx[I830_CTXREG_STATE3] &= ~SHADE_MODE_MASK;   if (mode == GL_FLAT) {     i830->state.Ctx[I830_CTXREG_STATE3] |= (ALPHA_SHADE_MODE(SHADE_MODE_FLAT) |					  FOG_SHADE_MODE(SHADE_MODE_FLAT) |					  SPEC_SHADE_MODE(SHADE_MODE_FLAT) |					  COLOR_SHADE_MODE(SHADE_MODE_FLAT));   } else {     i830->state.Ctx[I830_CTXREG_STATE3] |= (ALPHA_SHADE_MODE(SHADE_MODE_LINEAR) |					  FOG_SHADE_MODE(SHADE_MODE_LINEAR) |					  SPEC_SHADE_MODE(SHADE_MODE_LINEAR) |					  COLOR_SHADE_MODE(SHADE_MODE_LINEAR));   }}/* ============================================================= * Fog */static void i830Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *param){   struct i830_context *i830 = i830_context(ctx);   if (INTEL_DEBUG&DEBUG_DRI)      fprintf(stderr, "%s\n", __FUNCTION__);   if (pname == GL_FOG_COLOR) {            GLuint color = (((GLubyte)(ctx->Fog.Color[0]*255.0F) << 16) |		      ((GLubyte)(ctx->Fog.Color[1]*255.0F) << 8) |		      ((GLubyte)(ctx->Fog.Color[2]*255.0F) << 0));      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_FOGCOLOR] = (_3DSTATE_FOG_COLOR_CMD | color);   }}/* ============================================================= */static void i830Enable(GLcontext *ctx, GLenum cap, GLboolean state){   struct i830_context *i830 = i830_context(ctx);   switch(cap) {   case GL_LIGHTING:   case GL_COLOR_SUM:      update_specular( ctx );      break;   case GL_ALPHA_TEST:      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_ENABLES_1] &= ~ENABLE_DIS_ALPHA_TEST_MASK;      if (state)	 i830->state.Ctx[I830_CTXREG_ENABLES_1] |= ENABLE_ALPHA_TEST;      else	 i830->state.Ctx[I830_CTXREG_ENABLES_1] |= DISABLE_ALPHA_TEST;      break;   case GL_BLEND:      i830EvalLogicOpBlendState(ctx);      break;   case GL_COLOR_LOGIC_OP:      i830EvalLogicOpBlendState(ctx);      /* Logicop doesn't seem to work at 16bpp:       */      if (i830->intel.intelScreen->cpp == 2)	 FALLBACK( &i830->intel, I830_FALLBACK_LOGICOP, state );      break;

⌨️ 快捷键说明

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