static void mgaDDStencilMask(GLcontext *ctx, 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 void mgaDDStencilFuncSeparate(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 void mgaSetTexFilter( mgaTextureObjectPtr t, GLenum minf, GLenum magf ) { GLuint val = 0; switch (minf) { case GL_NEAREST: val = TF_minfilter_nrst; break; case GL_LINEAR: val = TF_minfilter_bilin; break; case GL_NEAREST_MIPMAP_NEAREST: val = TF_minfilter_mm1s; break; case GL_LINEAR_MIPMAP_NEAREST: val = TF_minfilter_mm4s; break; case GL_NEAREST_MIPMAP_LINEAR: val = TF_minfilter_mm2s; break; case GL_LINEAR_MIPMAP_LINEAR: val = TF_minfilter_mm8s; break; default: val = TF_minfilter_nrst; break; } switch (magf) { case GL_NEAREST: val |= TF_magfilter_nrst; break; case GL_LINEAR: val |= TF_magfilter_bilin; break; default: val |= TF_magfilter_nrst; break; } /* See OpenGL 1.2 specification */ if (magf == GL_LINEAR && (minf == GL_NEAREST_MIPMAP_NEAREST || minf == GL_NEAREST_MIPMAP_LINEAR)) { val |= MGA_FIELD( TF_fthres, 0x20 ); /* c = 0.5 */ } else { val |= MGA_FIELD( TF_fthres, 0x10 ); /* c = 0 */ } /* Mask off the bits for the fields we are setting. Remember, the MGA mask * defines have 0s for the bits in the named fields. This is the opposite * of most of the other drivers. */ t->setup.texfilter &= (TF_minfilter_MASK & TF_magfilter_MASK & TF_fthres_MASK); t->setup.texfilter |= val; }
static void mgaDDAlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref) { mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLubyte refByte; GLuint a; CLAMPED_FLOAT_TO_UBYTE(refByte, ref); switch ( func ) { case GL_NEVER: a = AC_atmode_alt; refByte = 0; break; case GL_LESS: a = AC_atmode_alt; break; case GL_GEQUAL: a = AC_atmode_agte; break; case GL_LEQUAL: a = AC_atmode_alte; break; case GL_GREATER: a = AC_atmode_agt; break; case GL_NOTEQUAL: a = AC_atmode_ane; break; case GL_EQUAL: a = AC_atmode_ae; break; case GL_ALWAYS: a = AC_atmode_noacmp; break; default: a = 0; break; } MGA_STATECHANGE( mmesa, MGA_UPLOAD_CONTEXT ); mmesa->hw.alpha_func = a | MGA_FIELD( AC_atref, refByte ); }
void mgaInitState( mgaContextPtr mmesa ) { mgaScreenPrivate *mgaScreen = mmesa->mgaScreen; GLcontext *ctx = mmesa->glCtx; if (ctx->Visual.doubleBufferMode) { /* use back buffer by default */ mmesa->draw_buffer = MGA_BACK; mmesa->drawOffset = mmesa->mgaScreen->backOffset; mmesa->readOffset = mmesa->mgaScreen->backOffset; mmesa->setup.dstorg = mgaScreen->backOffset; } else { /* use front buffer by default */ mmesa->draw_buffer = MGA_FRONT; mmesa->drawOffset = mmesa->mgaScreen->frontOffset; mmesa->readOffset = mmesa->mgaScreen->frontOffset; mmesa->setup.dstorg = mgaScreen->frontOffset; } mmesa->setup.maccess = (MA_memreset_disable | MA_fogen_disable | MA_tlutload_disable | MA_nodither_disable | MA_dit555_disable); if (driQueryOptioni (&mmesa->optionCache, "color_reduction") != DRI_CONF_COLOR_REDUCTION_DITHER) mmesa->setup.maccess |= MA_nodither_enable; switch (mmesa->mgaScreen->cpp) { case 2: mmesa->setup.maccess |= MA_pwidth_16; break; case 4: mmesa->setup.maccess |= MA_pwidth_32; break; default: fprintf( stderr, "Error: unknown cpp %d, exiting...\n", mmesa->mgaScreen->cpp ); exit( 1 ); } switch (mmesa->glCtx->Visual.depthBits) { case 16: mmesa->setup.maccess |= MA_zwidth_16; break; case 24: mmesa->setup.maccess |= MA_zwidth_24; break; case 32: mmesa->setup.maccess |= MA_zwidth_32; break; } mmesa->hw.blend_func = AC_src_one | AC_dst_zero; mmesa->hw.blend_func_enable = 0; mmesa->hw.alpha_func = AC_atmode_noacmp | MGA_FIELD( AC_atref, 0x00 ); mmesa->hw.alpha_func_enable = 0; mmesa->hw.rop = mgarop_NoBLK[ GL_COPY & 0x0f ]; mmesa->hw.zmode = DC_zmode_zlt | DC_atype_zi; mmesa->hw.stencil = MGA_FIELD( S_sref, 0x00) | MGA_FIELD( S_smsk, 0xff ) | MGA_FIELD( S_swtmsk, 0xff ); mmesa->hw.stencilctl = SC_smode_salways | SC_sfailop_keep | SC_szfailop_keep | SC_szpassop_keep; mmesa->hw.stencil_enable = 0; mmesa->hw.cull = _CULL_DISABLE; mmesa->hw.cull_dualtex = _CULL_DISABLE; mmesa->hw.specen = 0; mmesa->hw.alpha_sel = AC_alphasel_diffused; mmesa->setup.dwgctl = (DC_opcod_trap | DC_linear_xy | DC_solid_disable | DC_arzero_disable | DC_sgnzero_disable | DC_shftzero_enable | MGA_FIELD( DC_bop, 0xC ) | MGA_FIELD( DC_trans, 0x0 ) | DC_bltmod_bmonolef | DC_pattern_disable | DC_transc_disable | DC_clipdis_disable); mmesa->setup.plnwt = ~0; mmesa->setup.alphactrl = (AC_amode_alpha_channel | AC_astipple_disable | AC_aten_disable); mmesa->setup.fogcolor = PACK_COLOR_888((GLubyte)(ctx->Fog.Color[0]*255.0F), (GLubyte)(ctx->Fog.Color[1]*255.0F), (GLubyte)(ctx->Fog.Color[2]*255.0F)); mmesa->setup.wflag = 0; mmesa->setup.tdualstage0 = 0; mmesa->setup.tdualstage1 = 0; mmesa->setup.fcol = 0; mmesa->dirty |= MGA_UPLOAD_CONTEXT; mmesa->envcolor[0] = 0; mmesa->envcolor[1] = 0; }