static void r128SetTexBorderColor( r128TexObjPtr t, const GLfloat color[4] ) { 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]); t->setup.tex_border_color = r128PackColor( 4, c[0], c[1], c[2], c[3] ); }
static void r128TexEnv( GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param ) { r128ContextPtr rmesa = R128_CONTEXT(ctx); struct gl_texture_unit *texUnit; GLubyte c[4]; if ( R128_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s( %s )\n", __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) ); } switch ( pname ) { case GL_TEXTURE_ENV_MODE: FLUSH_BATCH( rmesa ); rmesa->new_state |= R128_NEW_ALPHA; break; case GL_TEXTURE_ENV_COLOR: texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; CLAMPED_FLOAT_TO_UBYTE( c[0], texUnit->EnvColor[0] ); CLAMPED_FLOAT_TO_UBYTE( c[1], texUnit->EnvColor[1] ); CLAMPED_FLOAT_TO_UBYTE( c[2], texUnit->EnvColor[2] ); CLAMPED_FLOAT_TO_UBYTE( c[3], texUnit->EnvColor[3] ); rmesa->env_color = r128PackColor( 4, c[0], c[1], c[2], c[3] ); if ( rmesa->setup.constant_color_c != rmesa->env_color ) { FLUSH_BATCH( rmesa ); rmesa->setup.constant_color_c = rmesa->env_color; /* More complex multitexture/multipass fallbacks for GL_BLEND * can be done later, but this allows a single pass GL_BLEND * in some cases (ie. Performer town demo). This is only * applicable to the regular Rage 128, as the Pro and M3 can * handle true single-pass GL_BLEND texturing. */ rmesa->blend_flags &= ~R128_BLEND_ENV_COLOR; if ( R128_IS_PLAIN( rmesa ) && rmesa->env_color != 0x00000000 && rmesa->env_color != 0xff000000 && rmesa->env_color != 0x00ffffff && rmesa->env_color != 0xffffffff ) { rmesa->blend_flags |= R128_BLEND_ENV_COLOR; } } break; case GL_TEXTURE_LOD_BIAS: { uint32_t t = rmesa->setup.tex_cntl_c; GLint bias; uint32_t b; /* GTH: This isn't exactly correct, but gives good results up to a * certain point. It is better than completely ignoring the LOD * bias. Unfortunately there isn't much range in the bias, the * spec mentions strides that vary between 0.5 and 2.0 but these * numbers don't seem to relate to the GL LOD bias value at all. */ if ( param[0] >= 1.0 ) { bias = -128; } else if ( param[0] >= 0.5 ) { bias = -64; } else if ( param[0] >= 0.25 ) { bias = 0; } else if ( param[0] >= 0.0 ) { bias = 63; } else { bias = 127; } b = (uint32_t)bias & 0xff; t &= ~R128_LOD_BIAS_MASK; t |= (b << R128_LOD_BIAS_SHIFT); if ( rmesa->setup.tex_cntl_c != t ) { FLUSH_BATCH( rmesa ); rmesa->setup.tex_cntl_c = t; rmesa->dirty |= R128_UPLOAD_CONTEXT; } } break; default: return; } }
static void r128SetTexBorderColor( r128TexObjPtr t, GLubyte c[4] ) { t->setup.tex_border_color = r128PackColor( 4, c[0], c[1], c[2], c[3] ); }