[Mesa-dev] [PATCH] gallium/{r600, radeonsi}: Fix segfault with color format (v2)

Denis Pauk pauk.denis at gmail.com
Wed Sep 13 06:26:46 UTC 2017


Little additional note:

This checks related to possible issue with such kind of supported format
check in external code:

----
for(int i=0; i<PIPE_FORMAT_COUNT + 10; i++) {
   pscreen->is_format_supported(pscreen, i, PIPE_TEXTURE_2D, 0,
PIPE_BIND_SAMPLER_VIEW);
   }
-----

When we have segfault with: 73, 78, 79, 80, 81,

86 (holes in enum pipe_format) and format value

bigger than PIPE_FORMAT_COUNT.



Best regards,
                  Denis.

On Sep 13, 2017 7:54 AM, "Денис Паук" <pauk.denis at gmail.com> wrote:

> Do you mean delete check in u_format.c:: util_format_is_supported? Could
> you please explain more?
>
> On Wed, Sep 13, 2017 at 1:32 AM, Marek Olšák <maraeo at gmail.com> wrote:
>
>> 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
>>
>
>
>
> --
> Best regards,
>                   Denis.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170913/2a821862/attachment.html>


More information about the mesa-dev mailing list