From 39a7c049d36bf5d18653e0a8b360dc8317f4b8ec Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Tue, 2 Dec 2014 01:00:47 -0500 Subject: [PATCH] freedreno/a3xx: output RGBA16_FLOAT from fs for certain outputs Fixes R11G11B10F rendering, and is required for SRGB format support. Signed-off-by: Ilia Mirkin Reviewed-by: Rob Clark --- src/gallium/drivers/freedreno/a3xx/fd3_format.c | 13 +++++++++++++ src/gallium/drivers/freedreno/a3xx/fd3_format.h | 1 + src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_format.c b/src/gallium/drivers/freedreno/a3xx/fd3_format.c index adfe323dda6..ec7fdefa76d 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_format.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_format.c @@ -316,6 +316,19 @@ fd3_gmem_restore_format(enum pipe_format format) } } +enum a3xx_color_fmt +fd3_fs_output_format(enum pipe_format format) +{ + if (util_format_is_srgb(format)) + return RB_R16G16B16A16_FLOAT; + switch (format) { + case PIPE_FORMAT_R11G11B10_FLOAT: + return RB_R16G16B16A16_FLOAT; + default: + return fd3_pipe2color(format); + } +} + static inline enum a3xx_tex_swiz tex_swiz(unsigned swiz) { diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_format.h b/src/gallium/drivers/freedreno/a3xx/fd3_format.h index 043454e2733..6a47fda1029 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_format.h +++ b/src/gallium/drivers/freedreno/a3xx/fd3_format.h @@ -35,6 +35,7 @@ enum a3xx_tex_fmt fd3_pipe2tex(enum pipe_format format); enum a3xx_tex_fetchsize fd3_pipe2fetchsize(enum pipe_format format); enum a3xx_color_fmt fd3_pipe2color(enum pipe_format format); enum pipe_format fd3_gmem_restore_format(enum pipe_format format); +enum a3xx_color_fmt fd3_fs_output_format(enum pipe_format format); enum a3xx_color_swap fd3_pipe2swap(enum pipe_format format); uint32_t fd3_tex_swiz(enum pipe_format format, unsigned swizzle_r, diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c index 8edfb8b46d1..68264096866 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c @@ -101,7 +101,9 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, } OUT_PKT0(ring, REG_A3XX_SP_FS_IMAGE_OUTPUT_REG(i), 1); - OUT_RING(ring, A3XX_SP_FS_IMAGE_OUTPUT_REG_MRTFORMAT(format)); + OUT_RING(ring, COND((i < nr_bufs) && bufs[i], + A3XX_SP_FS_IMAGE_OUTPUT_REG_MRTFORMAT( + fd3_fs_output_format(bufs[i]->format)))); } } -- 2.30.2