Mesa (master): nv50: relax restriction on surface_copy format equality a bit

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Fri Apr 30 21:03:38 UTC 2010


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

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Thu Apr 29 23:15:05 2010 +0200

nv50: relax restriction on surface_copy format equality a bit

---

 src/gallium/drivers/nv50/nv50_surface.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_surface.c b/src/gallium/drivers/nv50/nv50_surface.c
index c2d9e83..d905d95 100644
--- a/src/gallium/drivers/nv50/nv50_surface.c
+++ b/src/gallium/drivers/nv50/nv50_surface.c
@@ -31,6 +31,27 @@
 #include "util/u_tile.h"
 #include "util/u_format.h"
 
+/* return TRUE for formats that can be converted among each other by NV50_2D */
+static INLINE boolean
+nv50_2d_format_faithful(enum pipe_format format)
+{
+	switch (format) {
+	case PIPE_FORMAT_B8G8R8A8_UNORM:
+	case PIPE_FORMAT_B8G8R8X8_UNORM:
+	case PIPE_FORMAT_B8G8R8A8_SRGB:
+	case PIPE_FORMAT_B8G8R8X8_SRGB:
+	case PIPE_FORMAT_B5G6R5_UNORM:
+	case PIPE_FORMAT_B5G5R5A1_UNORM:
+	case PIPE_FORMAT_B10G10R10A2_UNORM:
+	case PIPE_FORMAT_R8_UNORM:
+	case PIPE_FORMAT_R32G32B32A32_FLOAT:
+	case PIPE_FORMAT_R32G32B32_FLOAT:
+		return TRUE;
+	default:
+		return FALSE;
+	}
+}
+
 static INLINE int
 nv50_format(enum pipe_format format)
 {
@@ -47,9 +68,12 @@ nv50_format(enum pipe_format format)
 		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;
@@ -178,7 +202,9 @@ nv50_surface_copy(struct pipe_context *pipe,
 	struct nv50_context *nv50 = nv50_context(pipe);
 	struct nv50_screen *screen = nv50->screen;
 
-	assert(src->format == dest->format);
+	assert((src->format == dest->format) ||
+	       (nv50_2d_format_faithful(src->format) &&
+		nv50_2d_format_faithful(dest->format)));
 
 	nv50_surface_do_copy(screen, dest, destx, desty, src, srcx,
 				     srcy, width, height);




More information about the mesa-commit mailing list