Module: Mesa Branch: master Commit: 7561da367baeb49c848dc49b65e252deb6428422 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7561da367baeb49c848dc49b65e252deb6428422
Author: Michel Dänzer <michel.daen...@amd.com> Date: Mon Oct 16 16:35:18 2017 +0200 st/mesa: Initialize textures array in st_framebuffer_validate And just reference pipe_resources to it in the validate callbacks. Avoids pipe_resource leaks when st_framebuffer_validate ends up calling the validate callback multiple times, e.g. when a window is resized. v2: * Use generic stable tag instead of Fixes: tag, since the problem could already happen before the commit referenced in v1 (Thomas Hellstrom) * Use memset to initialize the array on the stack instead of allocating the array with os_calloc. Cc: mesa-sta...@lists.freedesktop.org Reviewed-by: Thomas Hellstrom <thellst...@vmware.com> --- src/gallium/state_trackers/dri/dri_drawable.c | 4 +--- src/gallium/state_trackers/glx/xlib/xm_st.c | 4 +--- src/gallium/state_trackers/hgl/hgl.c | 4 +--- src/gallium/state_trackers/osmesa/osmesa.c | 1 + src/gallium/state_trackers/wgl/stw_st.c | 4 +--- src/mesa/state_tracker/st_manager.c | 2 ++ 6 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/gallium/state_trackers/dri/dri_drawable.c b/src/gallium/state_trackers/dri/dri_drawable.c index 75a8197d33..d586b7564e 100644 --- a/src/gallium/state_trackers/dri/dri_drawable.c +++ b/src/gallium/state_trackers/dri/dri_drawable.c @@ -99,10 +99,8 @@ dri_st_framebuffer_validate(struct st_context_iface *stctx, return TRUE; /* Set the window-system buffers for the state tracker. */ - for (i = 0; i < count; i++) { - out[i] = NULL; + for (i = 0; i < count; i++) pipe_resource_reference(&out[i], textures[statts[i]]); - } return TRUE; } diff --git a/src/gallium/state_trackers/glx/xlib/xm_st.c b/src/gallium/state_trackers/glx/xlib/xm_st.c index 0c42e653c7..946b5dcff2 100644 --- a/src/gallium/state_trackers/glx/xlib/xm_st.c +++ b/src/gallium/state_trackers/glx/xlib/xm_st.c @@ -245,10 +245,8 @@ xmesa_st_framebuffer_validate(struct st_context_iface *stctx, } } - for (i = 0; i < count; i++) { - out[i] = NULL; + for (i = 0; i < count; i++) pipe_resource_reference(&out[i], xstfb->textures[statts[i]]); - } return TRUE; } diff --git a/src/gallium/state_trackers/hgl/hgl.c b/src/gallium/state_trackers/hgl/hgl.c index 1b702815a3..bbc477a978 100644 --- a/src/gallium/state_trackers/hgl/hgl.c +++ b/src/gallium/state_trackers/hgl/hgl.c @@ -193,10 +193,8 @@ hgl_st_framebuffer_validate(struct st_context_iface *stctxi, //} } - for (i = 0; i < count; i++) { - out[i] = NULL; + for (i = 0; i < count; i++) pipe_resource_reference(&out[i], buffer->textures[statts[i]]); - } return TRUE; } diff --git a/src/gallium/state_trackers/osmesa/osmesa.c b/src/gallium/state_trackers/osmesa/osmesa.c index 2f9558db31..44a0cc4381 100644 --- a/src/gallium/state_trackers/osmesa/osmesa.c +++ b/src/gallium/state_trackers/osmesa/osmesa.c @@ -432,6 +432,7 @@ osmesa_st_framebuffer_validate(struct st_context_iface *stctx, templat.format = format; templat.bind = bind; + pipe_resource_reference(&out[i], NULL); out[i] = osbuffer->textures[statts[i]] = screen->resource_create(screen, &templat); } diff --git a/src/gallium/state_trackers/wgl/stw_st.c b/src/gallium/state_trackers/wgl/stw_st.c index 5e165c89f5..7cf18f0a8b 100644 --- a/src/gallium/state_trackers/wgl/stw_st.c +++ b/src/gallium/state_trackers/wgl/stw_st.c @@ -161,10 +161,8 @@ stw_st_framebuffer_validate(struct st_context_iface *stctx, stwfb->fb->must_resize = FALSE; } - for (i = 0; i < count; i++) { - out[i] = NULL; + for (i = 0; i < count; i++) pipe_resource_reference(&out[i], stwfb->textures[statts[i]]); - } stw_framebuffer_unlock(stwfb->fb); diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index aef87ea8b7..eebde62183 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -190,6 +190,8 @@ st_framebuffer_validate(struct st_framebuffer *stfb, if (stfb->iface_stamp == new_stamp) return; + memset(textures, 0, stfb->num_statts * sizeof(textures[0])); + /* validate the fb */ do { if (!stfb->iface->validate(&st->iface, stfb->iface, stfb->statts, _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit