Mesa (7.9): r300g: fix texture border color once again

Marek Olšák mareko at kemper.freedesktop.org
Thu Dec 2 00:58:19 UTC 2010


Module: Mesa
Branch: 7.9
Commit: 4e7548aafc77a0e862ff1ffd52445b201e3f74af
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4e7548aafc77a0e862ff1ffd52445b201e3f74af

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Nov 29 03:40:04 2010 +0100

r300g: fix texture border color once again

I made the texwrap test be more thorough and realized that this driver code
had not been quite right. This commit fixes the border color for depth
textures, compressed textures, and 16-bits-per-channel textures
with up to 2 channels (R16, RG16).

NOTE: This is a candidate for the 7.9 branch.
(cherry picked from commit 1f1375d4d876c2c85156e02a177254684446040b)

---

 src/gallium/drivers/r300/r300_state_derived.c |   39 +++++++++++++++++++++++-
 1 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c
index afd154f..f9b3a59 100644
--- a/src/gallium/drivers/r300/r300_state_derived.c
+++ b/src/gallium/drivers/r300/r300_state_derived.c
@@ -569,7 +569,8 @@ static void r300_update_rs_block(struct r300_context *r300)
 }
 
 static uint32_t r300_get_border_color(enum pipe_format format,
-                                      const float border[4])
+                                      const float border[4],
+                                      boolean is_r500)
 {
     const struct util_format_description *desc;
     float border_swizzled[4] = {0};
@@ -578,6 +579,24 @@ static uint32_t r300_get_border_color(enum pipe_format format,
 
     desc = util_format_description(format);
 
+    /* Do depth formats first. */
+    if (util_format_is_depth_or_stencil(format)) {
+        switch (format) {
+        case PIPE_FORMAT_Z16_UNORM:
+            return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]);
+        case PIPE_FORMAT_X8Z24_UNORM:
+        case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
+            if (is_r500) {
+                return util_pack_z(PIPE_FORMAT_X8Z24_UNORM, border[0]);
+            } else {
+                return util_pack_z(PIPE_FORMAT_Z16_UNORM, border[0]) << 16;
+            }
+        default:
+            assert(0);
+            return 0;
+        }
+    }
+
     /* Apply inverse swizzle of the format. */
     for (i = 0; i < 4; i++) {
         switch (desc->swizzle[i]) {
@@ -596,6 +615,12 @@ static uint32_t r300_get_border_color(enum pipe_format format,
         }
     }
 
+    /* Compressed formats. */
+    if (util_format_is_compressed(format)) {
+        util_pack_color(border_swizzled, PIPE_FORMAT_R8G8B8A8_UNORM, &uc);
+        return uc.ui;
+    }
+
     switch (desc->channel[0].size) {
         case 4:
             util_pack_color(border_swizzled, PIPE_FORMAT_B4G4R4A4_UNORM, &uc);
@@ -619,6 +644,15 @@ static uint32_t r300_get_border_color(enum pipe_format format,
         case 10:
             util_pack_color(border_swizzled, PIPE_FORMAT_B10G10R10A2_UNORM, &uc);
             break;
+
+        case 16:
+            if (desc->nr_channels <= 2) {
+                border_swizzled[0] = border_swizzled[2];
+                util_pack_color(border_swizzled, PIPE_FORMAT_R16G16_UNORM, &uc);
+            } else {
+                util_pack_color(border_swizzled, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
+            }
+            break;
     }
 
     return uc.ui;
@@ -660,7 +694,8 @@ static void r300_merge_textures_and_samplers(struct r300_context* r300)
             /* Set the border color. */
             texstate->border_color =
                 r300_get_border_color(view->base.format,
-                                      sampler->state.border_color);
+                                      sampler->state.border_color,
+                                      r300->screen->caps.is_r500);
 
             /* determine min/max levels */
             max_level = MIN3(sampler->max_lod + view->base.first_level,




More information about the mesa-commit mailing list