Framework for supporting z24_s8 and z32 depth textures on r300.
authorIan Romanick <idr@us.ibm.com>
Wed, 17 Oct 2007 20:11:01 +0000 (13:11 -0700)
committerIan Romanick <idr@us.ibm.com>
Wed, 17 Oct 2007 23:25:39 +0000 (16:25 -0700)
src/mesa/drivers/dri/r300/r300_reg.h
src/mesa/drivers/dri/r300/r300_texstate.c

index 1baa74c5269e6d929d2381aa03db653cdc8c1533..ee556d347e04dfcd267840a24ba3439c46bc15cc 100644 (file)
@@ -886,6 +886,14 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #      define R300_TX_FORMAT_A8R8G8B8              0x13     /* no swizzle */
 #      define R300_TX_FORMAT_B8G8_B8G8             0x14     /* no swizzle */
 #      define R300_TX_FORMAT_G8R8_G8B8             0x15     /* no swizzle */
+
+       /* These two values are wrong, but they're the only values that
+        * produce any even vaguely correct results.  Can r300 only do 16-bit
+        * depth textures?
+        */
+#      define R300_TX_FORMAT_X24_Y8                0x1e
+#      define R300_TX_FORMAT_X32                   0x1e
+
        /* 0x16 - some 16 bit green format.. ?? */
 #      define R300_TX_FORMAT_UNK25                (1 << 25) /* no swizzle */
 #      define R300_TX_FORMAT_CUBIC_MAP            (1 << 26)
index 1c9851afb2a529839e3f93e28528fce8279aaf78..efa201a52d5241266214189dc94195665c668719 100644 (file)
@@ -116,10 +116,8 @@ static const struct tx_table {
        _ASSIGN(INTENSITY_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, X, FL_I32)),
        _ASSIGN(INTENSITY_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
        _ASSIGN(Z16, R300_EASY_TX_FORMAT(X, X, X, X, X16)),
-#if 0
        _ASSIGN(Z24_S8, R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8)),
        _ASSIGN(Z32, R300_EASY_TX_FORMAT(X, X, X, X, X32)),
-#endif
        /* *INDENT-ON* */
 };
 
@@ -127,6 +125,24 @@ static const struct tx_table {
 
 void r300SetDepthTexMode(struct gl_texture_object *tObj)
 {
+       static const GLuint formats[3][3] = {
+               {
+                       R300_EASY_TX_FORMAT(X, X, X, X, X16),
+                       R300_EASY_TX_FORMAT(X, X, X, ONE, X16),
+                       R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16),
+               },
+               {
+                       R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8),
+                       R300_EASY_TX_FORMAT(X, X, X, ONE, X24_Y8),
+                       R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X24_Y8),
+               },
+               {
+                       R300_EASY_TX_FORMAT(X, X, X, X, X32),
+                       R300_EASY_TX_FORMAT(X, X, X, ONE, X32),
+                       R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X32),
+               },
+       };
+       const GLuint *format;
        r300TexObjPtr t;
 
        if (!tObj)
@@ -134,22 +150,41 @@ void r300SetDepthTexMode(struct gl_texture_object *tObj)
 
        t = (r300TexObjPtr) tObj->DriverData;
 
+
+       switch (tObj->Image[0][tObj->BaseLevel]->TexFormat->MesaFormat) {
+       case MESA_FORMAT_Z16:
+               format = formats[0];
+               break;
+       case MESA_FORMAT_Z24_S8:
+               format = formats[1];
+               break;
+       case MESA_FORMAT_Z32:
+               format = formats[2];
+               break;
+       default:
+               /* Error...which should have already been caught by higher
+                * levels of Mesa.
+                */
+               ASSERT(0);
+               return;
+       }
+
        switch (tObj->DepthMode) {
        case GL_LUMINANCE:
-               t->format = R300_EASY_TX_FORMAT(X, X, X, X, X16);
+               t->format = format[0];
                break;
        case GL_INTENSITY:
-               t->format = R300_EASY_TX_FORMAT(X, X, X, ONE, X16);
+               t->format = format[1];
                break;
        case GL_ALPHA:
-               t->format = R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16);
+               t->format = format[2];
                break;
        default:
                /* Error...which should have already been caught by higher
                 * levels of Mesa.
                 */
                ASSERT(0);
-               break;
+               return;
        }
 }