[Mesa-dev] [PATCH 2/4] st/dri2: Notify on texture allocation failure

Marek Olšák maraeo at gmail.com
Tue Nov 21 19:01:16 UTC 2017


Where is patch 1?

Marek

On Tue, Nov 21, 2017 at 12:16 PM, George Barrett <bob at bob131.so> wrote:
> Callers of dri_drawable->allocate_textures are unaware of failures
> occurring in the provided allocation function, happily chugging along
> with potentially invalid state. Update the interface and
> {dri2,drisw}_allocate_textures to return a boolean indicating success.
> ---
>  src/gallium/state_trackers/dri/dri2.c         | 20 ++++++++++++--------
>  src/gallium/state_trackers/dri/dri_drawable.c |  3 ++-
>  src/gallium/state_trackers/dri/dri_drawable.h |  8 ++++----
>  src/gallium/state_trackers/dri/drisw.c        |  4 +++-
>  4 files changed, 21 insertions(+), 14 deletions(-)
>
> diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
> index a70f37fe09..60d6ab28ee 100644
> --- a/src/gallium/state_trackers/dri/dri2.c
> +++ b/src/gallium/state_trackers/dri/dri2.c
> @@ -565,7 +565,7 @@ dri2_release_buffer(__DRIscreen *sPriv, __DRIbuffer *bPriv)
>   * Backend functions for st_framebuffer interface.
>   */
>
> -static void
> +static boolean
>  dri2_allocate_textures(struct dri_context *ctx,
>                         struct dri_drawable *drawable,
>                         const enum st_attachment_type *statts,
> @@ -589,16 +589,18 @@ dri2_allocate_textures(struct dri_context *ctx,
>     if (image) {
>        if (!dri_image_drawable_get_buffers(drawable, &images,
>                                            statts, statts_count))
> -         return;
> +         return FALSE;
>     }
>     else {
>        buffers = dri2_drawable_get_buffers(drawable, statts, &num_buffers);
> -      if (!buffers || (drawable->old_num == num_buffers &&
> -                       drawable->old_w == dri_drawable->w &&
> -                       drawable->old_h == dri_drawable->h &&
> -                       memcmp(drawable->old, buffers,
> -                              sizeof(__DRIbuffer) * num_buffers) == 0))
> -         return;
> +      if (!buffers)
> +         return FALSE;
> +      else if (drawable->old_num == num_buffers &&
> +               drawable->old_w == dri_drawable->w &&
> +               drawable->old_h == dri_drawable->h &&
> +               memcmp(drawable->old, buffers,
> +                      sizeof(__DRIbuffer) * num_buffers) == 0)
> +         return TRUE;
>     }
>
>     /* Second clean useless resources*/
> @@ -837,6 +839,8 @@ dri2_allocate_textures(struct dri_context *ctx,
>        drawable->old_h = dri_drawable->h;
>        memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * num_buffers);
>     }
> +
> +   return TRUE;
>  }
>
>  static void
> diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c
> index d586b7564e..8a59c34c7e 100644
> --- a/src/gallium/state_trackers/dri/dri_drawable.c
> +++ b/src/gallium/state_trackers/dri/dri_drawable.c
> @@ -82,7 +82,8 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx,
>           if (new_stamp && drawable->update_drawable_info)
>              drawable->update_drawable_info(drawable);
>
> -         drawable->allocate_textures(ctx, drawable, statts, count);
> +         if (!drawable->allocate_textures(ctx, drawable, statts, count))
> +            return FALSE;
>
>           /* add existing textures */
>           for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
> diff --git a/src/gallium/state_trackers/dri/dri_drawable.h b/src/gallium/state_trackers/dri/dri_drawable.h
> index 7c45004ba6..9f344fd3dc 100644
> --- a/src/gallium/state_trackers/dri/dri_drawable.h
> +++ b/src/gallium/state_trackers/dri/dri_drawable.h
> @@ -71,10 +71,10 @@ struct dri_drawable
>     struct pipe_surface *drisw_surface;
>
>     /* hooks filled in by dri2 & drisw */
> -   void (*allocate_textures)(struct dri_context *ctx,
> -                             struct dri_drawable *drawable,
> -                             const enum st_attachment_type *statts,
> -                             unsigned count);
> +   boolean (*allocate_textures)(struct dri_context *ctx,
> +                                struct dri_drawable *drawable,
> +                                const enum st_attachment_type *statts,
> +                                unsigned count);
>
>     void (*update_drawable_info)(struct dri_drawable *drawable);
>
> diff --git a/src/gallium/state_trackers/dri/drisw.c b/src/gallium/state_trackers/dri/drisw.c
> index eb5752386d..9f4a1197b8 100644
> --- a/src/gallium/state_trackers/dri/drisw.c
> +++ b/src/gallium/state_trackers/dri/drisw.c
> @@ -258,7 +258,7 @@ drisw_flush_frontbuffer(struct dri_context *ctx,
>   * as they are requested. Unused attachments are not removed, not until the
>   * framebuffer is resized or destroyed.
>   */
> -static void
> +static boolean
>  drisw_allocate_textures(struct dri_context *stctx,
>                          struct dri_drawable *drawable,
>                          const enum st_attachment_type *statts,
> @@ -323,6 +323,8 @@ drisw_allocate_textures(struct dri_context *stctx,
>
>     drawable->old_w = width;
>     drawable->old_h = height;
> +
> +   return TRUE;
>  }
>
>  static void
> --
> 2.14.3
>
>
> _______________________________________________
> 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