Merge remote branch 'origin/mesa_7_6_branch'
[mesa.git] / src / mesa / drivers / dri / r600 / r600_tex.c
index 43d9f641af47390acb783d96d78d53f3f0094070..d105b90cd18562bdb2b46ea77556dec3b80c8eb6 100644 (file)
@@ -62,12 +62,12 @@ static unsigned int translate_wrap_mode(GLenum wrapmode)
        case GL_CLAMP: return SQ_TEX_CLAMP_HALF_BORDER;
        case GL_CLAMP_TO_EDGE: return SQ_TEX_CLAMP_LAST_TEXEL;
        case GL_CLAMP_TO_BORDER: return SQ_TEX_CLAMP_BORDER;
-       case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
-       case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR;
-       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
-       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR;
+       case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
+       case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
+       case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
        default:
-               _mesa_problem(NULL, "bad wrap mode in %s", __FUNCTION__);
+               radeon_error("bad wrap mode in %s", __FUNCTION__);
                return 0;
        }
 }
@@ -127,10 +127,18 @@ static void r600SetTexDefaultState(radeonTexObjPtr t)
         SETfield(t->SQ_TEX_RESOURCE4, SQ_ENDIAN_NONE,
                  SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask);
         SETfield(t->SQ_TEX_RESOURCE4, 1, REQUEST_SIZE_shift, REQUEST_SIZE_mask);
-        t->SQ_TEX_RESOURCE4 |= SQ_SEL_X << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
-                             |SQ_SEL_Y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
-                             |SQ_SEL_Z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
-                             |SQ_SEL_W << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift;
+        SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
+       SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift,
+                SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
         SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask); /* mip-maps */
 
         t->SQ_TEX_RESOURCE5 = 0;
@@ -141,26 +149,27 @@ static void r600SetTexDefaultState(radeonTexObjPtr t)
 
         /* Initialize sampler registers */
         t->SQ_TEX_SAMPLER0                           = 0;
-        t->SQ_TEX_SAMPLER0 |=
-                         SQ_TEX_WRAP << SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
-                        |SQ_TEX_WRAP << CLAMP_Y_shift
-                        |SQ_TEX_WRAP << CLAMP_Z_shift
-                        |SQ_TEX_XY_FILTER_POINT << XY_MAG_FILTER_shift
-                        |SQ_TEX_XY_FILTER_POINT << XY_MIN_FILTER_shift
-                        |SQ_TEX_Z_FILTER_NONE << Z_FILTER_shift
-                        |SQ_TEX_Z_FILTER_NONE << MIP_FILTER_shift
-                        |SQ_TEX_BORDER_COLOR_TRANS_BLACK << BORDER_COLOR_TYPE_shift;
-
-        t->SQ_TEX_SAMPLER1 = 0x7FF << MAX_LOD_shift;
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift,
+                SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Y_shift, CLAMP_Y_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, CLAMP_Z_shift, CLAMP_Z_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MAG_FILTER_shift, XY_MAG_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, XY_MIN_FILTER_shift, XY_MIN_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, Z_FILTER_shift, Z_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, MIP_FILTER_shift, MIP_FILTER_mask);
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_TRANS_BLACK, BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
+
+        t->SQ_TEX_SAMPLER1                           = 0;
+        SETfield(t->SQ_TEX_SAMPLER1, 0x3ff, MAX_LOD_shift, MAX_LOD_mask);
 
         t->SQ_TEX_SAMPLER2                          = 0;
         SETbit(t->SQ_TEX_SAMPLER2, SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
 }
 
 
+#if 0
 static GLuint aniso_filter(GLfloat anisotropy)
 {
-#if 0
        if (anisotropy >= 16.0) {
                return R300_TX_MAX_ANISO_16_TO_1;
        } else if (anisotropy >= 8.0) {
@@ -172,9 +181,9 @@ static GLuint aniso_filter(GLfloat anisotropy)
        } else {
                return R300_TX_MAX_ANISO_1_TO_1;
        }
-#endif
        return 0;
 }
+#endif
 
 /**
  * Set the texture magnification and minification modes.
@@ -199,8 +208,7 @@ static void r600SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
                        | R300_TX_MIN_FILTER_ANISO
                        | R300_TX_MIN_FILTER_MIP_LINEAR
                        | aniso_filter(anisotropy);*/
-               if (RADEON_DEBUG & DEBUG_TEXTURE)
-                       fprintf(stderr, "Using maximum anisotropy of %f\n", anisotropy);
+               radeon_print(RADEON_TEXTURE, RADEON_NORMAL, "Using maximum anisotropy of %f\n", anisotropy);
                return;
        }
 
@@ -260,14 +268,12 @@ static void r600SetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloa
 
 static void r600SetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
 {
-#if 0
-       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->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
-#endif
+       t->TD_PS_SAMPLER0_BORDER_ALPHA = *((uint32_t*)&(color[3]));
+       t->TD_PS_SAMPLER0_BORDER_RED = *((uint32_t*)&(color[2]));
+       t->TD_PS_SAMPLER0_BORDER_GREEN = *((uint32_t*)&(color[1]));
+       t->TD_PS_SAMPLER0_BORDER_BLUE = *((uint32_t*)&(color[0]));
+        SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_REGISTER,
+                BORDER_COLOR_TYPE_shift, BORDER_COLOR_TYPE_mask);
 }
 
 /**
@@ -281,10 +287,9 @@ static void r600TexParameter(GLcontext * ctx, GLenum target,
 {
        radeonTexObj* t = radeon_tex_obj(texObj);
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %s )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_VERBOSE,
+                       "%s( %s )\n", __FUNCTION__,
                        _mesa_lookup_enum_by_nr(pname));
-       }
 
        switch (pname) {
        case GL_TEXTURE_MIN_FILTER:
@@ -344,11 +349,10 @@ static void r600DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
        context_t* rmesa = R700_CONTEXT(ctx);
        radeonTexObj* t = radeon_tex_obj(texObj);
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
+               "%s( %p (target = %s) )\n", __FUNCTION__,
                        (void *)texObj,
                        _mesa_lookup_enum_by_nr(texObj->Target));
-       }
 
        if (rmesa) {
                int i;
@@ -386,10 +390,9 @@ static struct gl_texture_object *r600NewTextureObject(GLcontext * ctx,
        radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
 
 
-       if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
-               fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
+       radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
+               "%s( %p (target = %s) )\n", __FUNCTION__,
                        t, _mesa_lookup_enum_by_nr(target));
-       }
 
        _mesa_initialize_texture_object(&t->base, name, target);
        t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;