*/
static void r300SetTexFilter(r300TexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
{
- fprintf(stderr, "Here I am!\n");
t->filter &= ~(R300_TX_MIN_FILTER_MASK | R300_TX_MIN_FILTER_MIP_MASK | R300_TX_MAG_FILTER_MASK | R300_TX_MAX_ANISO_MASK);
t->filter_1 &= ~R300_EDGE_ANISO_EDGE_ONLY;
t->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
}
+static void r300SetTexLodBias(r300TexObjPtr t, GLfloat bias)
+{
+ GLuint b;
+ b = (unsigned int)fabsf(ceilf(bias*31));
+ if (signbit(bias)) {
+ b ^= 0x3ff; /* 10 bits */
+ }
+ b <<= 3;
+ b &= R300_LOD_BIAS_MASK;
+
+ t->filter_1 |= b;
+}
+
/**
* Allocate space for and load the mesa images into the texture memory block.
* This will happen before drawing with a new texture, or drawing with a
r300SetTexWrap(t, texObj->WrapS, texObj->WrapT, texObj->WrapR);
r300SetTexFilter(t, texObj->MinFilter, texObj->MagFilter, texObj->MaxAnisotropy);
r300SetTexBorderColor(t, texObj->_BorderChan);
+ r300SetTexLodBias(t, texObj->LodBias);
}
return t;
t->dirty_images[0] |= (1 << level);
}
+/* This feels like a prime target for code reuse, so I'm putting it here
+ * instead of inlining it in TexEnv. */
+static GLenum r300TexUnitTarget(struct gl_texture_unit *unit) {
+ if (unit->_ReallyEnabled & (TEXTURE_RECT_BIT)) {
+ return GL_TEXTURE_RECTANGLE_NV;
+ } else if (unit->_ReallyEnabled & (TEXTURE_1D_BIT)) {
+ return GL_TEXTURE_1D;
+ } else if (unit->_ReallyEnabled & (TEXTURE_2D_BIT)) {
+ return GL_TEXTURE_2D;
+ } else if (unit->_ReallyEnabled & (TEXTURE_3D_BIT)) {
+ return GL_TEXTURE_3D;
+ } else if (unit->_ReallyEnabled & (TEXTURE_CUBE_BIT)) {
+ return GL_TEXTURE_CUBE_MAP;
+ }
+ if (unit->Enabled & (TEXTURE_RECT_BIT)) {
+ return GL_TEXTURE_RECTANGLE_NV;
+ } else if (unit->Enabled & (TEXTURE_1D_BIT)) {
+ return GL_TEXTURE_1D;
+ } else if (unit->Enabled & (TEXTURE_2D_BIT)) {
+ return GL_TEXTURE_2D;
+ } else if (unit->Enabled & (TEXTURE_3D_BIT)) {
+ return GL_TEXTURE_3D;
+ } else if (unit->Enabled & (TEXTURE_CUBE_BIT)) {
+ return GL_TEXTURE_CUBE_MAP;
+ }
+}
+
static void r300TexEnv(GLcontext * ctx, GLenum target,
GLenum pname, const GLfloat * param)
{
*/
switch (pname) {
case GL_TEXTURE_LOD_BIAS_EXT: {
- fprintf(stderr, "LOD Bias: %f\n", *param);
/* Needs to be relocated in order to make sure we got the right tmu */
GLfloat bias, min;
- GLuint b;
/* The R300's LOD bias is a signed 2's complement value with a
* range of -16.0 <= bias < 16.0.
"no_neg_lod_bias") ? 0.0 : -16.0;
bias = CLAMP(bias, min, 16.0);
- b = (unsigned int)fabsf(ceilf(bias*31));
- if (signbit(bias)) {
- b ^= 0x3ff; /* 10 bits */
- }
- fprintf(stderr, "LOD Bias (hex): 0x%x\n", b);
- b <<= 3;
- b &= R300_LOD_BIAS_MASK;
+ /* This next part feels quite hackish;
+ * is there a cleaner way? */
+ struct gl_texture_object *texObj;
+ GLenum target = r300TexUnitTarget(&ctx->Texture.Unit[ctx->Texture.CurrentUnit]);
+ texObj = _mesa_select_tex_object(ctx, &ctx->Texture.Unit[ctx->Texture.CurrentUnit], target);
+ r300TexObjPtr t = (r300TexObjPtr) texObj->DriverData;
+ texObj->LodBias = bias;
- int unit = 1;
+ r300SetTexLodBias(t, texObj->LodBias);
- if (b != (rmesa->hw.tex.filter_1.cmd[R300_TEX_CMD_0 + unit] & R300_LOD_BIAS_MASK)) {
- rmesa->hw.tex.filter_1.cmd[R300_TEX_CMD_0 + unit] &= ~R300_LOD_BIAS_MASK;
- rmesa->hw.tex.filter_1.cmd[R300_TEX_CMD_0 + unit] |= b;
- R300_STATECHANGE(rmesa, tex.filter_1);
- }
break;
}