i965: Accelerate depth textures with border color.
authorEric Anholt <eric@anholt.net>
Thu, 9 Oct 2008 18:45:58 +0000 (11:45 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 9 Oct 2008 18:45:58 +0000 (11:45 -0700)
The fallback was introduced to fix bug #16697, but made the test it was
fixing run excessively long.

src/mesa/drivers/dri/i965/brw_fallback.c
src/mesa/drivers/dri/i965/brw_wm_sampler_state.c

index 2f6b7febbdec0c4ca9c5531f5f017890488e6ab6..4ea660a51a37a5ab8e17da8d64b0f4fab9d93572 100644 (file)
@@ -74,10 +74,7 @@ static GLboolean do_check_fallback(struct brw_context *brw)
       if (texUnit->_ReallyEnabled) {
         struct intel_texture_object *intelObj = intel_texture_object(texUnit->_Current);
         struct gl_texture_image *texImage = intelObj->base.Image[0][intelObj->firstLevel];
-        if (texImage->Border ||
-         ((texImage->_BaseFormat == GL_DEPTH_COMPONENT) &&
-          ((texImage->TexObject->WrapS == GL_CLAMP_TO_BORDER) || 
-           (texImage->TexObject->WrapT == GL_CLAMP_TO_BORDER)))) {
+        if (texImage->Border) {
            DBG("FALLBACK: texture border\n");
            return GL_TRUE;
         }
index 977b90ad43e867344f4eb6b66c4811331eabdedb..f12ef47a7d70ebdcee75ebe2d95a58a095e84f45 100644 (file)
@@ -229,6 +229,9 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
         struct wm_sampler_entry *entry = &key->sampler[unit];
         struct gl_texture_unit *texUnit = &brw->attribs.Texture->Unit[unit];
         struct gl_texture_object *texObj = texUnit->_Current;
+        struct intel_texture_object *intelObj = intel_texture_object(texObj);
+        struct gl_texture_image *firstImage =
+           texObj->Image[0][intelObj->firstLevel];
 
         entry->wrap_r = texObj->WrapR;
         entry->wrap_s = texObj->WrapS;
@@ -244,8 +247,22 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
     entry->comparefunc = texObj->CompareFunc;
 
         dri_bo_unreference(brw->wm.sdc_bo[unit]);
-        brw->wm.sdc_bo[unit] = upload_default_color(brw, texObj->BorderColor);
-
+        if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
+           float bordercolor[4] = {
+              texObj->BorderColor[0],
+              texObj->BorderColor[0],
+              texObj->BorderColor[0],
+              texObj->BorderColor[0]
+           };
+           /* GL specs that border color for depth textures is taken from the
+            * R channel, while the hardware uses A.  Spam R into all the
+            * channels for safety.
+            */
+           brw->wm.sdc_bo[unit] = upload_default_color(brw, bordercolor);
+        } else {
+           brw->wm.sdc_bo[unit] = upload_default_color(brw,
+                                                       texObj->BorderColor);
+        }
         key->sampler_count = unit + 1;
       }
    }