[Mesa-dev] [PATCH] gallium/{r600, radeonsi}: Fix segfault with color format (v2)
Marek Olšák
maraeo at gmail.com
Tue Sep 12 22:32:39 UTC 2017
On Wed, Sep 13, 2017 at 12:31 AM, Marek Olšák <maraeo at gmail.com> wrote:
> I think we shouldn't be getting PIPE_FORMAT_COUNT in
> is_format_supported in the first place, and therefore drivers don't
> have to work around it.
Or any other invalid formats, for that matter.
Marek
>
> Marek
>
> On Tue, Sep 12, 2017 at 10:38 PM, Denis Pauk <pauk.denis at gmail.com> wrote:
>> 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 at gmail.com>
>> Cc: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>> 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(-)
>>
>> diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c
>> index 3d281905ce..a6d42a428d 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 c1bce8304b..1515c28091 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 ee070107fd..f7ee24bdc6 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),
>> + 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
>> --
>> 2.14.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list