summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Pauk <pauk.denis@gmail.com>2017-09-12 23:38:45 +0300
committerEmil Velikov <emil.l.velikov@gmail.com>2017-12-08 18:27:01 +0000
commit3f1c8733d2fd1a215a0c641fdcc193cdfdbf89bd (patch)
treef0f059a3dd323a882004180b2983d6236c6131af
parentac78f7c76a7d21de280592d539aafdea6eecd5bb (diff)
gallium/{r600, radeonsi}: Fix segfault with color format (v2)
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 <nhaehnle@gmail.com> Cc: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Marek Olšák <marek.olsak@amd.com> (cherry picked from commit 74d2456491fbd96eb3fb99cf8dd3595b223c2065)
-rw-r--r--src/gallium/auxiliary/util/u_format.c4
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c4
-rw-r--r--src/gallium/drivers/radeonsi/si_state.c10
3 files changed, 17 insertions, 1 deletions
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 4c97efa73b2..e9818e4bd53 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 ec43a05d3f6..a7a7a26d896 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1253,6 +1253,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) && \
@@ -1757,7 +1759,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;
}
@@ -1886,6 +1892,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