Mesa (master): a5xx: add border color clamping, add packed border color formats

Ilia Mirkin imirkin at kemper.freedesktop.org
Sun Jul 9 01:18:09 UTC 2017


Module: Mesa
Branch: master
Commit: cf173b5dcd0bf26a18965161ec6cbe1b562f87ac
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cf173b5dcd0bf26a18965161ec6cbe1b562f87ac

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Sat Jul  8 10:16:56 2017 -0400

a5xx: add border color clamping, add packed border color formats

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>

---

 src/gallium/drivers/freedreno/a5xx/fd5_emit.c | 70 ++++++++++++++++++++++-----
 1 file changed, 59 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
index 308c28fffc..c138905cef 100644
--- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
+++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c
@@ -166,10 +166,14 @@ struct PACKED bcolor_entry {
 	uint16_t ui16[4];
 	int16_t  si16[4];
 	uint16_t fp16[4];
-	uint8_t  __pad0[8];
+	uint16_t rgb565;
+	uint16_t rgb5a1;
+	uint16_t rgba4;
+	uint8_t __pad0[2];
 	uint8_t  ui8[4];
 	int8_t   si8[4];
-	uint8_t  __pad1[40];
+	uint32_t rgb10a2;
+	uint8_t  __pad1[36];
 };
 
 #define FD5_BORDER_COLOR_SIZE        0x60
@@ -205,6 +209,11 @@ setup_border_colors(struct fd_texture_stateobj *tex, struct bcolor_entry *entrie
 		const struct util_format_description *desc =
 				util_format_description(tex->textures[i]->format);
 
+		e->rgb565 = 0;
+		e->rgb5a1 = 0;
+		e->rgba4 = 0;
+		e->rgb10a2 = 0;
+
 		for (j = 0; j < 4; j++) {
 			int c = desc->swizzle[j];
 
@@ -212,21 +221,60 @@ setup_border_colors(struct fd_texture_stateobj *tex, struct bcolor_entry *entrie
 				continue;
 
 			if (desc->channel[c].pure_integer) {
+				uint16_t clamped;
+				switch (desc->channel[c].size) {
+				case 2:
+					assert(desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED);
+					clamped = CLAMP(bc->ui[j], 0, 0x3);
+					break;
+				case 8:
+					if (desc->channel[c].type == UTIL_FORMAT_TYPE_SIGNED)
+						clamped = CLAMP(bc->i[j], -128, 127);
+					else
+						clamped = CLAMP(bc->ui[j], 0, 255);
+					break;
+				case 10:
+					assert(desc->channel[c].type == UTIL_FORMAT_TYPE_UNSIGNED);
+					clamped = CLAMP(bc->ui[j], 0, 0x3ff);
+					break;
+				case 16:
+					if (desc->channel[c].type == UTIL_FORMAT_TYPE_SIGNED)
+						clamped = CLAMP(bc->i[j], -32768, 32767);
+					else
+						clamped = CLAMP(bc->ui[j], 0, 65535);
+					break;
+				default:
+					assert(!"Unexpected bit size");
+				case 32:
+					clamped = 0;
+					break;
+				}
 				e->fp32[c] = bc->ui[j];
-				e->fp16[c] = bc->ui[j];
-				e->ui16[c] = bc->ui[j];
-				e->si16[c] = bc->i[j];
-				e->ui8[c]  = bc->ui[j];
-				e->si8[c]  = bc->i[j];
+				e->fp16[c] = clamped;
 			} else {
 				float f = bc->f[j];
+				float f_u = CLAMP(f, 0, 1);
+				float f_s = CLAMP(f, -1, 1);
 
 				e->fp32[c] = fui(f);
 				e->fp16[c] = util_float_to_half(f);
-				e->ui16[c] = f * 65535.0;
-				e->si16[c] = f * 32767.5;
-				e->ui8[c]  = f * 255.0;
-				e->si8[c]  = f * 128.0;
+				e->ui16[c] = f_u * 0xffff;
+				e->si16[c] = f_s * 0x7fff;
+				e->ui8[c]  = f_u * 0xff;
+				e->si8[c]  = f_s * 0x7f;
+				if (c == 1)
+					e->rgb565 |= (int)(f_u * 0x3f) << 5;
+				else if (c < 3)
+					e->rgb565 |= (int)(f_u * 0x1f) << (c ? 11 : 0);
+				if (c == 3)
+					e->rgb5a1 |= (f_u > 0.5) ? 0x8000 : 0;
+				else
+					e->rgb5a1 |= (int)(f_u * 0x1f) << (c * 5);
+				if (c == 3)
+					e->rgb10a2 |= (int)(f_u * 0x3) << 30;
+				else
+					e->rgb10a2 |= (int)(f_u * 0x3ff) << (c * 10);
+				e->rgba4 |= (int)(f_u * 0xf) << (c * 4);
 			}
 		}
 




More information about the mesa-commit mailing list