Mesa (master): nv50: use formats table in nv50_surface.c

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Sat Sep 25 17:37:24 UTC 2010


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

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Fri Sep 24 20:33:10 2010 +0200

nv50: use formats table in nv50_surface.c

---

 src/gallium/drivers/nv50/nv50_formats.c |   20 +++++----
 src/gallium/drivers/nv50/nv50_surface.c |   63 ++++++++++---------------------
 2 files changed, 31 insertions(+), 52 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_formats.c b/src/gallium/drivers/nv50/nv50_formats.c
index 3be39d5..4282809 100644
--- a/src/gallium/drivers/nv50/nv50_formats.c
+++ b/src/gallium/drivers/nv50/nv50_formats.c
@@ -53,6 +53,8 @@
 #define NV50TIC_0_0_FMT_16_16_16 NV50TIC_0_0_FMT_16_16_16_16
 #define NV50TIC_0_0_FMT_32_32_32 NV50TIC_0_0_FMT_32_32_32_32
 
+/* NOTE: using NV50_2D_DST_FORMAT for substitute formats used with 2D engine */
+
 const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
 {
    /* COMMON FORMATS */
@@ -81,7 +83,7 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
     B_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 1_5_5_5, 1),
     SAMPLER_VIEW | RENDER_TARGET | SCANOUT },
 
-   [PIPE_FORMAT_B4G4R4A4_UNORM] = { 0,
+   [PIPE_FORMAT_B4G4R4A4_UNORM] = { NV50_2D_DST_FORMAT_R16_UNORM,
     B_(C2, C1, C0, C3, UNORM, UNORM, UNORM, UNORM, 4_4_4_4, 1),
     SAMPLER_VIEW },
 
@@ -122,15 +124,15 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
 
    /* LUMINANCE, ALPHA, INTENSITY */
 
-   [PIPE_FORMAT_L8_UNORM] = { 0,
+   [PIPE_FORMAT_L8_UNORM] = { NV50_2D_DST_FORMAT_R8_UNORM,
     A_(C0, C0, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8, 0),
     SAMPLER_VIEW },
 
-   [PIPE_FORMAT_L8_SRGB] = { 0,
+   [PIPE_FORMAT_L8_SRGB] = { NV50_2D_DST_FORMAT_R8_UNORM,
     A_(C0, C0, C0, ONE, UNORM, UNORM, UNORM, UNORM, 8, 0),
     SAMPLER_VIEW },
 
-   [PIPE_FORMAT_I8_UNORM] = { 0,
+   [PIPE_FORMAT_I8_UNORM] = { NV50_2D_DST_FORMAT_R8_UNORM,
     A_(C0, C0, C0, C0, UNORM, UNORM, UNORM, UNORM, 8, 0),
     SAMPLER_VIEW },
 
@@ -138,7 +140,7 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
     A_(ZERO, ZERO, ZERO, C0, UNORM, UNORM, UNORM, UNORM, 8, 0),
     SAMPLER_VIEW | RENDER_TARGET },
 
-   [PIPE_FORMAT_L8A8_UNORM] = { 0,
+   [PIPE_FORMAT_L8A8_UNORM] = { NV50_2D_DST_FORMAT_R16_UNORM,
     A_(C0, C0, C0, C1, UNORM, UNORM, UNORM, UNORM, 8_8, 0),
     SAMPLER_VIEW },
 
@@ -276,9 +278,9 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
     A_(C0, C1, C2, C3, SNORM, SNORM, SNORM, SNORM, 16_16, 0),
     VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET },
 
-   [PIPE_FORMAT_R16_SNORM] = { 0,
+   [PIPE_FORMAT_R16_SNORM] = { NV50TCL_RT_FORMAT_R16_SNORM,
     A_(C0, ZERO, ZERO, ONE, SNORM, SNORM, SNORM, SNORM, 16, 0),
-    VERTEX_BUFFER | SAMPLER_VIEW },
+    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET },
 
    /* UNORM 16 */
 
@@ -294,9 +296,9 @@ const struct nv50_format nv50_format_table[PIPE_FORMAT_COUNT] =
     A_(C0, C1, C2, C3, UNORM, UNORM, UNORM, UNORM, 16_16, 0),
     VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET },
 
-   [PIPE_FORMAT_R16_UNORM] = { 0,
+   [PIPE_FORMAT_R16_UNORM] = { NV50TCL_RT_FORMAT_R16_UNORM,
     A_(C0, ZERO, ZERO, ONE, UNORM, UNORM, UNORM, UNORM, 16, 0),
-    VERTEX_BUFFER | SAMPLER_VIEW },
+    VERTEX_BUFFER | SAMPLER_VIEW | RENDER_TARGET },
 
    /* SNORM 8 */
 
diff --git a/src/gallium/drivers/nv50/nv50_surface.c b/src/gallium/drivers/nv50/nv50_surface.c
index 3e61203..623024c 100644
--- a/src/gallium/drivers/nv50/nv50_surface.c
+++ b/src/gallium/drivers/nv50/nv50_surface.c
@@ -52,48 +52,26 @@ nv50_2d_format_faithful(enum pipe_format format)
 	}
 }
 
-static INLINE int
-nv50_format(enum pipe_format format)
+static INLINE uint8_t
+nv50_2d_format(enum pipe_format format)
 {
-	switch (format) {
-	case PIPE_FORMAT_B8G8R8A8_UNORM:
-		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
-	case PIPE_FORMAT_B8G8R8X8_UNORM:
-		return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM;
-	case PIPE_FORMAT_B8G8R8A8_SRGB:
-		return NV50_2D_DST_FORMAT_A8R8G8B8_SRGB;
-	case PIPE_FORMAT_B8G8R8X8_SRGB:
-		return NV50_2D_DST_FORMAT_X8R8G8B8_SRGB;
-	case PIPE_FORMAT_B5G6R5_UNORM:
-		return NV50_2D_DST_FORMAT_R5G6B5_UNORM;
-	case PIPE_FORMAT_B5G5R5A1_UNORM:
-		return NV50_2D_DST_FORMAT_A1R5G5B5_UNORM;
-	case PIPE_FORMAT_B10G10R10A2_UNORM:
-		return NV50_2D_DST_FORMAT_A2R10G10B10_UNORM;
-	case PIPE_FORMAT_A8_UNORM:
-	case PIPE_FORMAT_I8_UNORM:
-	case PIPE_FORMAT_L8_UNORM:
-	case PIPE_FORMAT_R8_UNORM:
-		return NV50_2D_DST_FORMAT_R8_UNORM;
-	case PIPE_FORMAT_R32G32B32A32_FLOAT:
-		return NV50_2D_DST_FORMAT_R32G32B32A32_FLOAT;
-	case PIPE_FORMAT_R32G32B32_FLOAT:
-		return NV50_2D_DST_FORMAT_R32G32B32X32_FLOAT;
-	case PIPE_FORMAT_Z32_FLOAT:
-		return NV50_2D_DST_FORMAT_R32_FLOAT;
+	uint8_t id = nv50_format_table[format].rt;
 
-	/* only because we require src format == dst format: */
-	case PIPE_FORMAT_R16G16_SNORM:
-	case PIPE_FORMAT_R16G16_UNORM:
-	case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-	case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
-		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
-	case PIPE_FORMAT_L8A8_UNORM:
-	case PIPE_FORMAT_B4G4R4A4_UNORM:
-		return NV50_2D_DST_FORMAT_R16_UNORM;
+	/* Hardware values for color formats range from 0xc0 to 0xff,
+	 * but the 2D engine doesn't support all of them.
+	 */
+	if ((id >= 0xc0) && (0xff0843e080608409ULL & (1ULL << (id - 0xc0))))
+		return id;
 
+	switch (util_format_get_blocksize(format)) {
+	case 1:
+		return NV50_2D_DST_FORMAT_R8_UNORM;
+	case 2:
+		return NV50_2D_DST_FORMAT_R16_UNORM;
+	case 4:
+		return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM;
 	default:
-		return -1;
+		return 0;
 	}
 }
 
@@ -107,8 +85,8 @@ nv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst)
  	int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT;
  	int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD);
 
- 	format = nv50_format(ps->format);
-	if (format < 0) {
+	format = nv50_2d_format(ps->format);
+	if (!format) {
 		NOUVEAU_ERR("invalid/unsupported surface format: %s\n",
 			    util_format_name(ps->format));
  		return 1;
@@ -237,8 +215,8 @@ nv50_clear_render_target(struct pipe_context *pipe,
 	union util_color uc;
 	util_pack_color(rgba, dst->format, &uc);
 
-	format = nv50_format(dst->format);
-	if (format < 0)
+	format = nv50_2d_format(dst->format);
+	if (!format)
 		return;
 
 	ret = MARK_RING (chan, 16 + 32, 2);
@@ -258,7 +236,6 @@ nv50_clear_render_target(struct pipe_context *pipe,
 	OUT_RING  (chan, dsty);
 	OUT_RING  (chan, width);
 	OUT_RING  (chan, height);
-
 }
 
 void




More information about the mesa-commit mailing list