freedreno/a3xx: fix integer and 32-bit float border colors
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 6 Apr 2015 05:15:09 +0000 (01:15 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 18 Apr 2015 21:35:23 +0000 (17:35 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c

index f961fc07585efe4e450297a2dcefa1884d0be2d4..ee473e6d56455592222f36e69573ffb792972652 100644 (file)
@@ -217,6 +217,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
                        uint16_t *bcolor = (uint16_t *)((uint8_t *)ptr +
                                        (BORDERCOLOR_SIZE * tex_off[sb]) +
                                        (BORDERCOLOR_SIZE * i));
+                       uint32_t *bcolor32 = (uint32_t *)&bcolor[16];
 
                        /*
                         * XXX HACK ALERT XXX
@@ -231,7 +232,35 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
                                const struct util_format_description *desc =
                                        util_format_description(tex->textures[i]->format);
                                for (j = 0; j < 4; j++) {
-                                       if (desc->swizzle[j] < 4)
+                                       if (desc->swizzle[j] >= 4)
+                                               continue;
+
+                                       const struct util_format_channel_description *chan =
+                                               &desc->channel[desc->swizzle[j]];
+                                       int size = chan->size;
+
+                                       /* The Z16 texture format we use seems to look in the
+                                        * 32-bit border color slots
+                                        */
+                                       if (desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS)
+                                               size = 32;
+
+                                       /* Formats like R11G11B10 or RGB9_E5 don't specify
+                                        * per-channel sizes properly.
+                                        */
+                                       if (desc->layout == UTIL_FORMAT_LAYOUT_OTHER)
+                                               size = 16;
+
+                                       if (chan->pure_integer && size > 16)
+                                               bcolor32[desc->swizzle[j] + 4] =
+                                                       sampler->base.border_color.i[j];
+                                       else if (size > 16)
+                                               bcolor32[desc->swizzle[j]] =
+                                                       fui(sampler->base.border_color.f[j]);
+                                       else if (chan->pure_integer)
+                                               bcolor[desc->swizzle[j] + 8] =
+                                                       sampler->base.border_color.i[j];
+                                       else
                                                bcolor[desc->swizzle[j]] =
                                                        util_float_to_half(sampler->base.border_color.f[j]);
                                }