From fc94b2c2a0600e3e84412d3a01491f2d069119a3 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Tue, 2 Dec 2014 23:27:03 -0500 Subject: [PATCH] freedreno/a3xx: fix border color swizzle to match texture format desc This is a hack since it uses the texture information together with the sampler, but I don't see a better way to do it. In OpenGL, there is a 1:1 correspondence. Signed-off-by: Ilia Mirkin Reviewed-by: Rob Clark --- src/gallium/drivers/freedreno/a3xx/fd3_emit.c | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c index f721303cefe..f9dada79073 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c @@ -202,10 +202,24 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring, (BORDERCOLOR_SIZE * tex_off[sb]) + (BORDERCOLOR_SIZE * i)); - bcolor[0] = util_float_to_half(sampler->base.border_color.f[2]); - bcolor[1] = util_float_to_half(sampler->base.border_color.f[1]); - bcolor[2] = util_float_to_half(sampler->base.border_color.f[0]); - bcolor[3] = util_float_to_half(sampler->base.border_color.f[3]); + /* + * XXX HACK ALERT XXX + * + * The border colors need to be swizzled in a particular + * format-dependent order. Even though samplers don't know about + * formats, we can assume that with a GL state tracker, there's a + * 1:1 correspondence between sampler and texture. Take advantage + * of that knowledge. + */ + if (i < tex->num_textures && tex->textures[i]) { + const struct util_format_description *desc = + util_format_description(tex->textures[i]->format); + for (j = 0; j < 4; j++) { + if (desc->swizzle[j] < 4) + bcolor[desc->swizzle[j]] = + util_float_to_half(sampler->base.border_color.f[j]); + } + } OUT_RING(ring, sampler->texsamp0); OUT_RING(ring, sampler->texsamp1);