freedreno/a3xx: fix border color swizzle to match texture format desc
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 3 Dec 2014 04:27:03 +0000 (23:27 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 6 Dec 2014 23:18:33 +0000 (18:18 -0500)
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 <imirkin@alum.mit.edu>
Reviewed-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/fd3_emit.c

index f721303cefe4d15e75983a7c455c7bfbd662ebfd..f9dada79073693bb4aa0a4d0cbeb0cab515ef1f1 100644 (file)
@@ -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);