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

📄 i830_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   }}/* ============================================================= */static voidi830Enable(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.ctx.Visual.rgbBits == 16)         FALLBACK(&i830->intel, I830_FALLBACK_LOGICOP, state);      break;   case GL_DITHER:      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_ENABLES_2] &= ~ENABLE_DITHER;      if (state)         i830->state.Ctx[I830_CTXREG_ENABLES_2] |= ENABLE_DITHER;      else         i830->state.Ctx[I830_CTXREG_ENABLES_2] |= DISABLE_DITHER;      break;   case GL_DEPTH_TEST:      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_ENABLES_1] &= ~ENABLE_DIS_DEPTH_TEST_MASK;      if (state)         i830->state.Ctx[I830_CTXREG_ENABLES_1] |= ENABLE_DEPTH_TEST;      else         i830->state.Ctx[I830_CTXREG_ENABLES_1] |= DISABLE_DEPTH_TEST;      /* Also turn off depth writes when GL_DEPTH_TEST is disabled:       */      i830DepthMask(ctx, ctx->Depth.Mask);      break;   case GL_SCISSOR_TEST:      I830_STATECHANGE(i830, I830_UPLOAD_BUFFERS);      if (state)         i830->state.Buffer[I830_DESTREG_SENABLE] =            (_3DSTATE_SCISSOR_ENABLE_CMD | ENABLE_SCISSOR_RECT);      else         i830->state.Buffer[I830_DESTREG_SENABLE] =            (_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);      break;   case GL_LINE_SMOOTH:      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_AA] &= ~AA_LINE_ENABLE;      if (state)         i830->state.Ctx[I830_CTXREG_AA] |= AA_LINE_ENABLE;      else         i830->state.Ctx[I830_CTXREG_AA] |= AA_LINE_DISABLE;      break;   case GL_FOG:      I830_STATECHANGE(i830, I830_UPLOAD_CTX);      i830->state.Ctx[I830_CTXREG_ENABLES_1] &= ~ENABLE_DIS_FOG_MASK;      if (state)         i830->state.Ctx[I830_CTXREG_ENABLES_1] |= ENABLE_FOG;      else         i830->state.Ctx[I830_CTXREG_ENABLES_1] |= DISABLE_FOG;      break;   case GL_CULL_FACE:      i830CullFaceFrontFace(ctx, 0);      break;   case GL_TEXTURE_2D:      break;   case GL_STENCIL_TEST:      {         GLboolean hw_stencil = GL_FALSE;         if (ctx->DrawBuffer) {            struct intel_renderbuffer *irbStencil               = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_STENCIL);            hw_stencil = (irbStencil && irbStencil->region);         }         if (hw_stencil) {            I830_STATECHANGE(i830, I830_UPLOAD_CTX);            if (state) {               i830->state.Ctx[I830_CTXREG_ENABLES_1] |= ENABLE_STENCIL_TEST;               i830->state.Ctx[I830_CTXREG_ENABLES_2] |= ENABLE_STENCIL_WRITE;            }            else {               i830->state.Ctx[I830_CTXREG_ENABLES_1] &= ~ENABLE_STENCIL_TEST;               i830->state.Ctx[I830_CTXREG_ENABLES_2] &=                  ~ENABLE_STENCIL_WRITE;               i830->state.Ctx[I830_CTXREG_ENABLES_1] |= DISABLE_STENCIL_TEST;               i830->state.Ctx[I830_CTXREG_ENABLES_2] |=                  DISABLE_STENCIL_WRITE;            }         }         else {            FALLBACK(&i830->intel, I830_FALLBACK_STENCIL, state);         }      }      break;   case GL_POLYGON_STIPPLE:      /* The stipple command worked on my 855GM box, but not my 845G.       * I'll do more testing later to find out exactly which hardware       * supports it.  Disabled for now.       */      if (i830->intel.hw_stipple &&          i830->intel.reduced_primitive == GL_TRIANGLES) {         I830_STATECHANGE(i830, I830_UPLOAD_STIPPLE);         i830->state.Stipple[I830_STPREG_ST1] &= ~ST1_ENABLE;         if (state)            i830->state.Stipple[I830_STPREG_ST1] |= ST1_ENABLE;      }      break;   default:      ;   }}static voidi830_init_packets(struct i830_context *i830){   /* Zero all state */   memset(&i830->state, 0, sizeof(i830->state));   /* Set default blend state */   i830->state.TexBlend[0][0] = (_3DSTATE_MAP_BLEND_OP_CMD(0) |                                 TEXPIPE_COLOR |                                 ENABLE_TEXOUTPUT_WRT_SEL |                                 TEXOP_OUTPUT_CURRENT |                                 DISABLE_TEX_CNTRL_STAGE |                                 TEXOP_SCALE_1X |                                 TEXOP_MODIFY_PARMS |                                 TEXOP_LAST_STAGE | TEXBLENDOP_ARG1);   i830->state.TexBlend[0][1] = (_3DSTATE_MAP_BLEND_OP_CMD(0) |                                 TEXPIPE_ALPHA |                                 ENABLE_TEXOUTPUT_WRT_SEL |                                 TEXOP_OUTPUT_CURRENT |                                 TEXOP_SCALE_1X |                                 TEXOP_MODIFY_PARMS | TEXBLENDOP_ARG1);   i830->state.TexBlend[0][2] = (_3DSTATE_MAP_BLEND_ARG_CMD(0) |                                 TEXPIPE_COLOR |                                 TEXBLEND_ARG1 |                                 TEXBLENDARG_MODIFY_PARMS |                                 TEXBLENDARG_DIFFUSE);   i830->state.TexBlend[0][3] = (_3DSTATE_MAP_BLEND_ARG_CMD(0) |                                 TEXPIPE_ALPHA |                                 TEXBLEND_ARG1 |                                 TEXBLENDARG_MODIFY_PARMS |                                 TEXBLENDARG_DIFFUSE);   i830->state.TexBlendWordsUsed[0] = 4;   i830->state.Ctx[I830_CTXREG_VF] = 0;   i830->state.Ctx[I830_CTXREG_VF2] = 0;   i830->state.Ctx[I830_CTXREG_AA] = (_3DSTATE_AA_CMD |                                      AA_LINE_ECAAR_WIDTH_ENABLE |                                      AA_LINE_ECAAR_WIDTH_1_0 |                                      AA_LINE_REGION_WIDTH_ENABLE |                                      AA_LINE_REGION_WIDTH_1_0 |                                      AA_LINE_DISABLE);   i830->state.Ctx[I830_CTXREG_ENABLES_1] = (_3DSTATE_ENABLES_1_CMD |                                             DISABLE_LOGIC_OP |                                             DISABLE_STENCIL_TEST |                                             DISABLE_DEPTH_BIAS |                                             DISABLE_SPEC_ADD |                                             DISABLE_FOG |                                             DISABLE_ALPHA_TEST |                                             DISABLE_COLOR_BLEND |                                             DISABLE_DEPTH_TEST);#if 000                         /* XXX all the stencil enable state is set in i830Enable(), right? */   if (i830->intel.hw_stencil) {      i830->state.Ctx[I830_CTXREG_ENABLES_2] = (_3DSTATE_ENABLES_2_CMD |                                                ENABLE_STENCIL_WRITE |                                                ENABLE_TEX_CACHE |                                                ENABLE_DITHER |                                                ENABLE_COLOR_MASK |                                                /* set no color comps disabled */                                                ENABLE_COLOR_WRITE |                                                ENABLE_DEPTH_WRITE);   }   else#endif   {      i830->state.Ctx[I830_CTXREG_ENABLES_2] = (_3DSTATE_ENABLES_2_CMD |                                                DISABLE_STENCIL_WRITE |                                                ENABLE_TEX_CACHE |                                                ENABLE_DITHER |                                                ENABLE_COLOR_MASK |                                                /* set no color comps disabled */                                                ENABLE_COLOR_WRITE |                                                ENABLE_DEPTH_WRITE);   }   i830->state.Ctx[I830_CTXREG_STATE1] = (_3DSTATE_MODES_1_CMD |                                          ENABLE_COLR_BLND_FUNC |                                          BLENDFUNC_ADD |                                          ENABLE_SRC_BLND_FACTOR |                                          SRC_BLND_FACT(BLENDFACT_ONE) |                                          ENABLE_DST_BLND_FACTOR |                                          DST_BLND_FACT(BLENDFACT_ZERO));   i830->state.Ctx[I830_CTXREG_STATE2] = (_3DSTATE_MODES_2_CMD |                                          ENABLE_GLOBAL_DEPTH_BIAS |                                          GLOBAL_DEPTH_BIAS(0) |                                          ENABLE_ALPHA_TEST_FUNC |                                          ALPHA_TEST_FUNC(COMPAREFUNC_ALWAYS)                                          | ALPHA_REF_VALUE(0));   i830->state.Ctx[I830_CTXREG_STATE3] = (_3DSTATE_MODES_3_CMD |                                          ENABLE_DEPTH_TEST_FUNC |                                          DEPTH_TEST_FUNC(COMPAREFUNC_LESS) |                                          ENABLE_ALPHA_SHADE_MODE |                                          ALPHA_SHADE_MODE(SHADE_MODE_LINEAR)                                          | ENABLE_FOG_SHADE_MODE |                                          FOG_SHADE_MODE(SHADE_MODE_LINEAR) |                                          ENABLE_SPEC_SHADE_MODE |                                          SPEC_SHADE_MODE(SHADE_MODE_LINEAR) |                                          ENABLE_COLOR_SHADE_MODE |                                          COLOR_SHADE_MODE(SHADE_MODE_LINEAR)                                          | ENABLE_CULL_MODE | CULLMODE_NONE);   i830->state.Ctx[I830_CTXREG_STATE4] = (_3DSTATE_MODES_4_CMD |                                          ENABLE_LOGIC_OP_FUNC |                                          LOGIC_OP_FUNC(LOGICOP_COPY) |                                          ENABLE_STENCIL_TEST_MASK |                                          STENCIL_TEST_MASK(0xff) |                                          ENABLE_STENCIL_WRITE_MASK |                                          STENCIL_WRITE_MASK(0xff));   i830->state.Ctx[I830_CTXREG_STENCILTST] = (_3DSTATE_STENCIL_TEST_CMD |                                              ENABLE_STENCIL_PARMS |                                              STENCIL_FAIL_OP(STENCILOP_KEEP)                                              |                                              STENCIL_PASS_DEPTH_FAIL_OP                                              (STENCILOP_KEEP) |                                              STENCIL_PASS_DEPTH_PASS_OP                                              (STENCILOP_KEEP) |                                              ENABLE_STENCIL_TEST_FUNC |                                              STENCIL_TEST_FUNC                                              (COMPAREFUNC_ALWAYS) |                                              ENABLE_STENCIL_REF_VALUE |                                              STENCIL_REF_VALUE(0));   i830->state.Ctx[I830_CTXREG_STATE5] = (_3DSTATE_MODES_5_CMD | FLUSH_TEXTURE_CACHE | ENABLE_SPRITE_POINT_TEX | SPRITE_POINT_TEX_OFF | ENABLE_FIXED_LINE_WIDTH | FIXED_LINE_WIDTH(0x2) |       /* 1.0 */                                          ENABLE_FIXED_POINT_WIDTH |                                          FIXED_POINT_WIDTH(1));   i830->state.Ctx[I830_CTXREG_IALPHAB] = (_3DSTATE_INDPT_ALPHA_BLEND_CMD |                                           DISABLE_INDPT_ALPHA_BLEND |                                           ENABLE_ALPHA_BLENDFUNC |                                           ABLENDFUNC_ADD);   i830->state.Ctx[I830_CTXREG_FOGCOLOR] = (_3DSTATE_FOG_COLOR_CMD |                                            FOG_COLOR_RED(0) |                                            FOG_COLOR_GREEN(0) |                                            FOG_COLOR_BLUE(0));   i830->state.Ctx[I830_CTXREG_BLENDCOLOR0] = _3DSTATE_CONST_BLEND_COLOR_CMD;   i830->state.Ctx[I830_CTXREG_BLENDCOLOR1] = 0;   i830->state.Ctx[I830_CTXREG_MCSB0] = _3DSTATE_MAP_COORD_SETBIND_CMD;   i830->state.Ctx[I830_CTXREG_MCSB1] = (TEXBIND_SET3(TEXCOORDSRC_VTXSET_3) |                                         TEXBIND_SET2(TEXCOORDSRC_VTXSET_2) |                                         TEXBIND_SET1(TEXCOORDSRC_VTXSET_1) |                                         TEXBIND_SET0(TEXCOORDSRC_VTXSET_0));   i830->state.Stipple[I830_STPREG_ST0] = _3DSTATE_STIPPLE;   i830->state.Buffer[I830_DESTREG_DV0] = _3DSTATE_DST_BUF_VARS_CMD;   i830->state.Buffer[I830_DESTREG_SENABLE] = (_3DSTATE_SCISSOR_ENABLE_CMD |                                               DISABLE_SCISSOR_RECT);   i830->state.Buffer[I830_DESTREG_SR0] = _3DSTATE_SCISSOR_RECT_0_CMD;   i830->state.Buffer[I830_DESTREG_SR1] = 0;   i830->state.Buffer[I830_DESTREG_SR2] = 0;}voidi830InitStateFuncs(struct dd_function_table *functions){   functions->AlphaFunc = i830AlphaFunc;   functions->BlendColor = i830BlendColor;   functions->BlendEquationSeparate = i830BlendEquationSeparate;   functions->BlendFuncSeparate = i830BlendFuncSeparate;   functions->ColorMask = i830ColorMask;   functions->CullFace = i830CullFaceFrontFace;   functions->DepthFunc = i830DepthFunc;   functions->DepthMask = i830DepthMask;   functions->Enable = i830Enable;   functions->Fogfv = i830Fogfv;   functions->FrontFace = i830CullFaceFrontFace;   functions->LightModelfv = i830LightModelfv;   functions->LineWidth = i830LineWidth;   functions->LogicOpcode = i830LogicOp;   functions->PointSize = i830PointSize;   functions->PolygonStipple = i830PolygonStipple;   functions->Scissor = i830Scissor;   functions->ShadeModel = i830ShadeModel;   functions->StencilFuncSeparate = i830StencilFuncSeparate;   functions->StencilMaskSeparate = i830StencilMaskSeparate;   functions->StencilOpSeparate = i830StencilOpSeparate;}voidi830InitState(struct i830_context *i830){   GLcontext *ctx = &i830->intel.ctx;   i830_init_packets(i830);   _mesa_init_driver_state(ctx);   memcpy(&i830->initial, &i830->state, sizeof(i830->state));   i830->current = &i830->state;   i830->state.emitted = 0;   i830->state.active = (I830_UPLOAD_INVARIENT |                         I830_UPLOAD_TEXBLEND(0) |                         I830_UPLOAD_STIPPLE |                         I830_UPLOAD_CTX | I830_UPLOAD_BUFFERS);}

⌨️ 快捷键说明

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