summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/freedreno
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2015-04-06 01:15:09 -0400
committerIlia Mirkin <[email protected]>2015-04-18 17:35:23 -0400
commit63576016284e15e881fcd8bd6d3939b5d8b53572 (patch)
treefa9e3a2b99017c080e8d4c61f4e0088d788792a1 /src/gallium/drivers/freedreno
parent6895c3554eadaf187642a513bb95fef1a7e07f57 (diff)
freedreno/a3xx: fix integer and 32-bit float border colors
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r--src/gallium/drivers/freedreno/a3xx/fd3_emit.c31
1 files changed, 30 insertions, 1 deletions
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]);
}