If has_present_buffers was false at first, but after a device reset, it turns true (for example if we begin to render to a multisampled back buffer), there was a crash due to present_buffers being uninitialised. This patch fixes it.
Signed-off-by: Axel Davy <axel.d...@ens.fr> --- src/gallium/state_trackers/nine/swapchain9.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c index fb692da..a6e9c57 100644 --- a/src/gallium/state_trackers/nine/swapchain9.c +++ b/src/gallium/state_trackers/nine/swapchain9.c @@ -271,12 +271,6 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This, if (!bufs) return E_OUTOFMEMORY; This->buffers = bufs; - if (has_present_buffers) { - This->present_buffers = REALLOC(This->present_buffers, - This->present_buffers == NULL ? 0 : oldBufferCount * sizeof(struct pipe_resource *), - newBufferCount * sizeof(struct pipe_resource *)); - memset(This->present_buffers, 0, newBufferCount * sizeof(struct pipe_resource *)); - } This->present_handles = REALLOC(This->present_handles, oldBufferCount * sizeof(D3DWindowBuffer *), newBufferCount * sizeof(D3DWindowBuffer *)); @@ -286,6 +280,15 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This, } } + if (has_present_buffers && + (newBufferCount != oldBufferCount || !This->present_buffers)) { + This->present_buffers = REALLOC(This->present_buffers, + This->present_buffers == NULL ? 0 : + oldBufferCount * sizeof(struct pipe_resource *), + newBufferCount * sizeof(struct pipe_resource *)); + memset(This->present_buffers, 0, newBufferCount * sizeof(struct pipe_resource *)); + } + for (i = 0; i < newBufferCount; ++i) { tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_TRANSFER_READ | PIPE_BIND_TRANSFER_WRITE | PIPE_BIND_RENDER_TARGET; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev