From 63576016284e15e881fcd8bd6d3939b5d8b53572 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Mon, 6 Apr 2015 01:15:09 -0400 Subject: [PATCH] freedreno/a3xx: fix integer and 32-bit float border colors Signed-off-by: Ilia Mirkin --- src/gallium/drivers/freedreno/a3xx/fd3_emit.c | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c index f961fc07585..ee473e6d564 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c @@ -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]); } -- 2.30.2