From 74d2456491fbd96eb3fb99cf8dd3595b223c2065 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 12 Sep 2017 23:38:45 +0300 Subject: gallium/{r600, radeonsi}: Fix segfault with color format (v2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102552 v2: Patch cleanup proposed by Nicolai Hähnle. * deleted changes in si_translate_texformat. Cc: Nicolai Hähnle Cc: Ilia Mirkin Signed-off-by: Marek Olšák --- src/gallium/auxiliary/util/u_format.c | 4 ++++ src/gallium/drivers/r600/r600_state_common.c | 4 ++++ src/gallium/drivers/radeonsi/si_state.c | 10 +++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src/gallium') diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c index 3d281905ce7..a6d42a428dc 100644 --- a/src/gallium/auxiliary/util/u_format.c +++ b/src/gallium/auxiliary/util/u_format.c @@ -238,6 +238,10 @@ util_format_is_subsampled_422(enum pipe_format format) boolean util_format_is_supported(enum pipe_format format, unsigned bind) { + if (format >= PIPE_FORMAT_COUNT) { + return FALSE; + } + if (util_format_is_s3tc(format) && !util_format_s3tc_enabled) { return FALSE; } diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index c1bce8304b2..1515c28091c 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -2284,6 +2284,8 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen, format = PIPE_FORMAT_A4R4_UNORM; desc = util_format_description(format); + if (!desc) + goto out_unknown; /* Depth and stencil swizzling is handled separately. */ if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { @@ -2650,6 +2652,8 @@ uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format forma const struct util_format_description *desc = util_format_description(format); int channel = util_format_get_first_non_void_channel(format); bool is_float; + if (!desc) + return ~0U; #define HAS_SIZE(x,y,z,w) \ (desc->channel[0].size == (x) && desc->channel[1].size == (y) && \ diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index da3c7debd57..1602406000e 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -1292,6 +1292,8 @@ static void si_emit_db_render_state(struct si_context *sctx, struct r600_atom *s static uint32_t si_translate_colorformat(enum pipe_format format) { const struct util_format_description *desc = util_format_description(format); + if (!desc) + return V_028C70_COLOR_INVALID; #define HAS_SIZE(x,y,z,w) \ (desc->channel[0].size == (x) && desc->channel[1].size == (y) && \ @@ -1796,7 +1798,11 @@ static unsigned si_tex_dim(struct si_screen *sscreen, struct r600_texture *rtex, static bool si_is_sampler_format_supported(struct pipe_screen *screen, enum pipe_format format) { - return si_translate_texformat(screen, format, util_format_description(format), + const struct util_format_description *desc = util_format_description(format); + if (!desc) + return false; + + return si_translate_texformat(screen, format, desc, util_format_get_first_non_void_channel(format)) != ~0U; } @@ -1925,6 +1931,8 @@ static unsigned si_is_vertex_format_supported(struct pipe_screen *screen, PIPE_BIND_VERTEX_BUFFER)) == 0); desc = util_format_description(format); + if (!desc) + return 0; /* 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 -- cgit v1.2.3