r300: Cleanup TX_MIN_FILTER defines
authorNicolai Haehnle <nhaehnle@gmail.com>
Fri, 6 Jun 2008 19:28:08 +0000 (21:28 +0200)
committerNicolai Haehnle <nhaehnle@gmail.com>
Fri, 6 Jun 2008 19:34:34 +0000 (21:34 +0200)
This commit should not affect the functionality at all, just cleanup
some of the original texture filter guesswork using information from
the register documentation.

src/mesa/drivers/dri/r300/r300_reg.h
src/mesa/drivers/dri/r300/r300_state.c
src/mesa/drivers/dri/r300/r300_tex.c

index 21e1dc29de784ac2fe9ec4dbd1150f6b09a9749e..999e8bc1b483c1b6f01e534d3b2d0012fb5beb3e 100644 (file)
@@ -1374,20 +1374,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #       define R300_TX_MAG_FILTER_MASK           (3 << 9)
 #       define R300_TX_MIN_FILTER_NEAREST        (1 << 11)
 #       define R300_TX_MIN_FILTER_LINEAR         (2 << 11)
-#      define R300_TX_MIN_FILTER_NEAREST_MIP_NEAREST       (5  <<  11) /* TODO: use spec */
-#      define R300_TX_MIN_FILTER_NEAREST_MIP_LINEAR        (9  <<  11) /* TODO: use spec */
-#      define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST        (6  <<  11) /* TODO: use spec */
-#      define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR         (10 <<  11) /* TODO: use spec */
-
-/* NOTE: NEAREST doesnt seem to exist.
- * Im not seting MAG_FILTER_MASK and (3 << 11) on for all
- * anisotropy modes because that would void selected mag filter
- */
-#      define R300_TX_MIN_FILTER_ANISO_NEAREST             (0 << 13)
-#      define R300_TX_MIN_FILTER_ANISO_LINEAR              (0 << 13)
-#      define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST (1 << 13)
-#      define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR  (2 << 13)
-#       define R300_TX_MIN_FILTER_MASK   ( (15 << 11) | (3 << 13) )
+#      define R300_TX_MIN_FILTER_MASK           (3 << 11)
+#      define R300_TX_MIN_FILTER_MIP_NONE       (0 << 13)
+#      define R300_TX_MIN_FILTER_MIP_NEAREST    (1 << 13)
+#      define R300_TX_MIN_FILTER_MIP_LINEAR     (2 << 13)
+#      define R300_TX_MIN_FILTER_MIP_MASK       (3 << 13)
 #      define R300_TX_MAX_ANISO_1_TO_1  (0 << 21)
 #      define R300_TX_MAX_ANISO_2_TO_1  (2 << 21)
 #      define R300_TX_MAX_ANISO_4_TO_1  (4 << 21)
@@ -1432,9 +1423,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
           They are given meanings as R, G, B and Alpha by the swizzle
           specification */
 #      define R300_TX_FORMAT_X8                    0x0
-#      define R500_TX_FORMAT_X1                    0x0 // bit set in format 2 
+#      define R500_TX_FORMAT_X1                    0x0 // bit set in format 2
 #      define R300_TX_FORMAT_X16                   0x1
-#      define R500_TX_FORMAT_X1_REV                0x0 // bit set in format 2 
+#      define R500_TX_FORMAT_X1_REV                0x0 // bit set in format 2
 #      define R300_TX_FORMAT_Y4X4                  0x2
 #      define R300_TX_FORMAT_Y8X8                  0x3
 #      define R300_TX_FORMAT_Y16X16                0x4
@@ -2238,7 +2229,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #      define R300_RB3D_AARESOLVE_CTL_AARESOLVE_GAMMA_22      (1 << 1)
 #      define R300_RB3D_AARESOLVE_CTL_AARESOLVE_ALPHA_SAMPLE0 (0 << 2)
 #      define R300_RB3D_AARESOLVE_CTL_AARESOLVE_ALPHA_AVERAGE (1 << 2)
-  
+
 
 /* Discard src pixels less than or equal to threshold. */
 #define R500_RB3D_DISCARD_SRC_PIXEL_LTE_THRESHOLD 0x4ea0
@@ -3179,7 +3170,7 @@ enum {
  * 2 to end: Up to 16380 dwords of vertex data.
  */
 #define R300_PACKET3_3D_DRAW_INDX           0x00002A00
+
 
 /* Specify the full set of vertex arrays as (address, stride).
  * The first parameter is the number of vertex arrays specified.
@@ -3209,7 +3200,7 @@ enum {
 /* Same as R300_PACKET3_3D_DRAW_INDX but without VAP_VTX_FMT */
 #define R300_PACKET3_3D_DRAW_INDX_2         0x00003600
 
-/* Clears a portion of hierachical Z RAM 
+/* Clears a portion of hierachical Z RAM
  * 3 dword parameters
  * 0. START
  * 1. COUNT: 13:0 (max is 0x3FFF)
index 550f71085423df6bcd58eeb069c4b34983881253..7602f12d814768c0aae0569694cf02ae10243c62 100644 (file)
@@ -1284,7 +1284,7 @@ static unsigned long gen_fixed_filter(unsigned long f)
                return f;
 
        mag = f & R300_TX_MAG_FILTER_MASK;
-       min = f & R300_TX_MIN_FILTER_MASK;
+       min = f & (R300_TX_MIN_FILTER_MASK|R300_TX_MIN_FILTER_MIP_MASK);
 
        /* TODO: Check for anisto filters too */
        if ((mag != R300_TX_MAG_FILTER_NEAREST)
index 606c3f8a90a347bfd24085899fb4d50ca54c7290..2ea65f8260e692fcf1bc472d872683ceaea6224f 100644 (file)
@@ -185,53 +185,38 @@ static void r300SetTexMaxAnisotropy(r300TexObjPtr t, GLfloat max)
  * \param minf Texture minification mode
  * \param magf Texture magnification mode
  */
-
 static void r300SetTexFilter(r300TexObjPtr t, GLenum minf, GLenum magf)
 {
-       GLuint anisotropy = (t->filter & R300_TX_MAX_ANISO_MASK);
+       t->filter &= ~(R300_TX_MIN_FILTER_MASK | R300_TX_MIN_FILTER_MIP_MASK | R300_TX_MAG_FILTER_MASK);
 
-       t->filter &= ~(R300_TX_MIN_FILTER_MASK | R300_TX_MAG_FILTER_MASK);
+       switch (minf) {
+       case GL_NEAREST:
+               t->filter |= R300_TX_MIN_FILTER_NEAREST;
+               break;
+       case GL_LINEAR:
+               t->filter |= R300_TX_MIN_FILTER_LINEAR;
+               break;
+       case GL_NEAREST_MIPMAP_NEAREST:
+               t->filter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_NEAREST;
+               break;
+       case GL_NEAREST_MIPMAP_LINEAR:
+               t->filter |= R300_TX_MIN_FILTER_NEAREST|R300_TX_MIN_FILTER_MIP_LINEAR;
+               break;
+       case GL_LINEAR_MIPMAP_NEAREST:
+               t->filter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_NEAREST;
+               break;
+       case GL_LINEAR_MIPMAP_LINEAR:
+               t->filter |= R300_TX_MIN_FILTER_LINEAR|R300_TX_MIN_FILTER_MIP_LINEAR;
+               break;
+       }
 
-       if (anisotropy == R300_TX_MAX_ANISO_1_TO_1) {
-               switch (minf) {
-               case GL_NEAREST:
-                       t->filter |= R300_TX_MIN_FILTER_NEAREST;
-                       break;
-               case GL_LINEAR:
-                       t->filter |= R300_TX_MIN_FILTER_LINEAR;
-                       break;
-               case GL_NEAREST_MIPMAP_NEAREST:
-                       t->filter |= R300_TX_MIN_FILTER_NEAREST_MIP_NEAREST;
-                       break;
-               case GL_NEAREST_MIPMAP_LINEAR:
-                       t->filter |= R300_TX_MIN_FILTER_NEAREST_MIP_LINEAR;
-                       break;
-               case GL_LINEAR_MIPMAP_NEAREST:
-                       t->filter |= R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST;
-                       break;
-               case GL_LINEAR_MIPMAP_LINEAR:
-                       t->filter |= R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR;
-                       break;
-               }
-       } else {
-               switch (minf) {
-               case GL_NEAREST:
-                       t->filter |= R300_TX_MIN_FILTER_ANISO_NEAREST;
-                       break;
-               case GL_LINEAR:
-                       t->filter |= R300_TX_MIN_FILTER_ANISO_LINEAR;
-                       break;
-               case GL_NEAREST_MIPMAP_NEAREST:
-               case GL_LINEAR_MIPMAP_NEAREST:
-                       t->filter |=
-                           R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST;
-                       break;
-               case GL_NEAREST_MIPMAP_LINEAR:
-               case GL_LINEAR_MIPMAP_LINEAR:
-                       t->filter |=
-                           R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR;
-                       break;
-               }
+       /* Note that EXT_texture_filter_anisotropic is extremely vague about
+        * how anisotropic filtering interacts with the "normal" filter modes.
+        * When anisotropic filtering is enabled, we zero the filter setting
+        * inside a mip level.
+        */
+       if (t->filter & R300_TX_MAX_ANISO_MASK) {
+               t->filter &= ~R300_TX_MIN_FILTER_MASK;
        }
 
        /* Note we don't have 3D mipmaps so only use the mag filter setting