[Mesa-dev] [PATCH 8/9] radeonsi: reject some 3-component formats as buffer textures

Nicolai Hähnle nhaehnle at gmail.com
Wed Nov 9 15:01:56 UTC 2016


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

Fixes parts of GL45-CTS.gtf32.GL3Tests.packed_pixels.packed_pixels_pbo.
---
 src/gallium/drivers/radeonsi/si_state.c | 43 +++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 24c7b10..3430734 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1760,30 +1760,57 @@ static uint32_t si_translate_buffer_numformat(struct pipe_screen *screen,
 			return V_008F0C_BUF_NUM_FORMAT_UINT;
 		else
 			return V_008F0C_BUF_NUM_FORMAT_USCALED;
 		break;
 	case UTIL_FORMAT_TYPE_FLOAT:
 	default:
 		return V_008F0C_BUF_NUM_FORMAT_FLOAT;
 	}
 }
 
-static bool si_is_vertex_format_supported(struct pipe_screen *screen, enum pipe_format format)
+static unsigned si_is_vertex_format_supported(struct pipe_screen *screen,
+					      enum pipe_format format,
+					      unsigned usage)
 {
 	const struct util_format_description *desc;
 	int first_non_void;
 	unsigned data_format;
 
+	assert((usage & ~(PIPE_BIND_SHADER_IMAGE |
+			  PIPE_BIND_SAMPLER_VIEW |
+			  PIPE_BIND_VERTEX_BUFFER)) == 0);
+
 	desc = util_format_description(format);
+
+	/* There are no native 8_8_8 or 16_16_16 data formats, and we currently
+	 * select 8_8_8_8 and 16_16_16_16 instead. This works reasonably well
+	 * for read-only access (with caveats surrounding bounds checks), but
+	 * obviously fails for write access which we have to implement for
+	 * shader images. Luckily, OpenGL doesn't expect this to be supported
+	 * anyway, and so the only impact is on PBO uploads / downloads, which
+	 * shouldn't be expected to be fast for GL_RGB anyway.
+	 */
+	if (desc->block.bits == 3 * 8 ||
+	    desc->block.bits == 3 * 16) {
+		if (usage & (PIPE_BIND_SHADER_IMAGE | PIPE_BIND_SAMPLER_VIEW)) {
+		    usage &= ~(PIPE_BIND_SHADER_IMAGE | PIPE_BIND_SAMPLER_VIEW);
+			if (!usage)
+				return 0;
+		}
+	}
+
 	first_non_void = util_format_get_first_non_void_channel(format);
 	data_format = si_translate_buffer_dataformat(screen, desc, first_non_void);
-	return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID;
+	if (data_format == V_008F0C_BUF_DATA_FORMAT_INVALID)
+		return 0;
+
+	return usage;
 }
 
 static bool si_is_colorbuffer_format_supported(enum pipe_format format)
 {
 	return si_translate_colorformat(format) != V_028C70_COLOR_INVALID &&
 		r600_translate_colorswap(format, false) != ~0U;
 }
 
 static bool si_is_zs_format_supported(enum pipe_format format)
 {
@@ -1824,23 +1851,23 @@ static boolean si_is_format_supported(struct pipe_screen *screen,
 			else
 				return false;
 		default:
 			return false;
 		}
 	}
 
 	if (usage & (PIPE_BIND_SAMPLER_VIEW |
 		     PIPE_BIND_SHADER_IMAGE)) {
 		if (target == PIPE_BUFFER) {
-			if (si_is_vertex_format_supported(screen, format))
-				retval |= usage & (PIPE_BIND_SAMPLER_VIEW |
-						   PIPE_BIND_SHADER_IMAGE);
+			retval |= si_is_vertex_format_supported(
+				screen, format, usage & (PIPE_BIND_SAMPLER_VIEW |
+						         PIPE_BIND_SHADER_IMAGE));
 		} else {
 			if (si_is_sampler_format_supported(screen, format))
 				retval |= usage & (PIPE_BIND_SAMPLER_VIEW |
 						   PIPE_BIND_SHADER_IMAGE);
 		}
 	}
 
 	if ((usage & (PIPE_BIND_RENDER_TARGET |
 		      PIPE_BIND_DISPLAY_TARGET |
 		      PIPE_BIND_SCANOUT |
@@ -1855,23 +1882,23 @@ static boolean si_is_format_supported(struct pipe_screen *screen,
 		if (!util_format_is_pure_integer(format) &&
 		    !util_format_is_depth_or_stencil(format))
 			retval |= usage & PIPE_BIND_BLENDABLE;
 	}
 
 	if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
 	    si_is_zs_format_supported(format)) {
 		retval |= PIPE_BIND_DEPTH_STENCIL;
 	}
 
-	if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
-	    si_is_vertex_format_supported(screen, format)) {
-		retval |= PIPE_BIND_VERTEX_BUFFER;
+	if (usage & PIPE_BIND_VERTEX_BUFFER) {
+		retval |= si_is_vertex_format_supported(screen, format,
+							PIPE_BIND_VERTEX_BUFFER);
 	}
 
 	if ((usage & PIPE_BIND_LINEAR) &&
 	    !util_format_is_compressed(format) &&
 	    !(usage & PIPE_BIND_DEPTH_STENCIL))
 		retval |= PIPE_BIND_LINEAR;
 
 	return retval == usage;
 }
 
-- 
2.7.4



More information about the mesa-dev mailing list