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
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev