Mesa (master): freedreno/a3xx: output RGBA16_FLOAT from fs for certain outputs

Ilia Mirkin imirkin at kemper.freedesktop.org
Sat Dec 6 23:26:37 UTC 2014


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

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Tue Dec  2 01:00:47 2014 -0500

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 <imirkin at alum.mit.edu>
Reviewed-by: Rob Clark <robclark at freedesktop.org>

---

 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 adfe323..ec7fdef 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 043454e..6a47fda 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 8edfb8b..6826409 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))));
 	}
 }
 




More information about the mesa-commit mailing list