From 8b901e3011c268d0a093a65b072bb51db0dcd251 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Sat, 17 Jan 2015 13:43:38 +0100 Subject: [PATCH] st/nine: Fix present_buffers allocation 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. Reviewed-by: Tiziano Bacocco Signed-off-by: Axel Davy --- 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 de61dad8e09..af6fe6e63fa 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.30.2