diff options
author | Rob Clark <robdclark@gmail.com> | 2017-01-14 07:59:42 -0500 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2017-01-24 01:59:17 +0000 |
commit | cfe14ab39c4277e89c5d38ae11f82d86852b5473 (patch) | |
tree | a6f1e45bdf71002543807377627da1e99bde287c | |
parent | 250b1cad3bd233a3d74753eb5a42df24ed1efa09 (diff) |
freedreno/a5xx: fix clear for uint/sint formats
Signed-off-by: Rob Clark <robdclark@gmail.com>
Cc: "17.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 16671e970444f154ffa60d2aaadee4d065eb6103)
-rw-r--r-- | src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index ffd3e3b765d..7a2fafcf913 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -214,35 +214,44 @@ fd5_clear(struct fd_context *ctx, unsigned buffers, if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; + enum pipe_format pfmt = pfb->cbufs[i]->format; + // XXX I think RB_CLEAR_COLOR_DWn wants to take into account SWAP?? - float f[4]; - switch (fd5_pipe2swap(pfb->cbufs[i]->format)) { + union pipe_color_union swapped; + switch (fd5_pipe2swap(pfmt)) { case WZYX: - f[0] = color->f[0]; - f[1] = color->f[1]; - f[2] = color->f[2]; - f[3] = color->f[3]; + swapped.ui[0] = color->ui[0]; + swapped.ui[1] = color->ui[1]; + swapped.ui[2] = color->ui[2]; + swapped.ui[3] = color->ui[3]; break; case WXYZ: - f[2] = color->f[0]; - f[1] = color->f[1]; - f[0] = color->f[2]; - f[3] = color->f[3]; + swapped.ui[2] = color->ui[0]; + swapped.ui[1] = color->ui[1]; + swapped.ui[0] = color->ui[2]; + swapped.ui[3] = color->ui[3]; break; case ZYXW: - f[3] = color->f[0]; - f[0] = color->f[1]; - f[1] = color->f[2]; - f[2] = color->f[3]; + swapped.ui[3] = color->ui[0]; + swapped.ui[0] = color->ui[1]; + swapped.ui[1] = color->ui[2]; + swapped.ui[2] = color->ui[3]; break; case XYZW: - f[3] = color->f[0]; - f[2] = color->f[1]; - f[1] = color->f[2]; - f[0] = color->f[3]; + swapped.ui[3] = color->ui[0]; + swapped.ui[2] = color->ui[1]; + swapped.ui[1] = color->ui[2]; + swapped.ui[0] = color->ui[3]; break; } - util_pack_color(f, pfb->cbufs[i]->format, &uc); + + if (util_format_is_pure_uint(pfmt)) { + util_format_write_4ui(pfmt, swapped.ui, 0, &uc, 0, 0, 0, 1, 1); + } else if (util_format_is_pure_sint(pfmt)) { + util_format_write_4i(pfmt, swapped.i, 0, &uc, 0, 0, 0, 1, 1); + } else { + util_pack_color(swapped.f, pfmt, &uc); + } OUT_PKT4(ring, REG_A5XX_RB_BLIT_CNTL, 1); OUT_RING(ring, A5XX_RB_BLIT_CNTL_BUF(BLIT_MRT0 + i)); |