summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2016-11-18 19:11:29 +0100
committerAxel Davy <[email protected]>2016-12-20 23:44:21 +0100
commit35ea402a24545770353713434e35bd791687841c (patch)
tree1971b643e6c207f7c136ac2a9cf0cd92b6e9d971 /src/gallium
parentf78cbbdfaaf2e83708da93fe62b1b73c27cd3ef5 (diff)
st/nine: Fix a leak in Swapchain dtor
Count properly the number of backbuffers, and use the new info to release the correct number of buffers Signed-off-by: Axel Davy <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/nine/swapchain9.c31
-rw-r--r--src/gallium/state_trackers/nine/swapchain9.h1
2 files changed, 16 insertions, 16 deletions
diff --git a/src/gallium/state_trackers/nine/swapchain9.c b/src/gallium/state_trackers/nine/swapchain9.c
index f571416ec74..431966d6543 100644
--- a/src/gallium/state_trackers/nine/swapchain9.c
+++ b/src/gallium/state_trackers/nine/swapchain9.c
@@ -206,9 +206,7 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This,
/* When we have flip behaviour, d3d9 expects we get back the screen buffer when we flip.
* Here we don't get back the initial content of the screen. To emulate the behaviour
* we allocate an additional buffer */
- oldBufferCount = This->params.BackBufferCount ?
- (This->params.BackBufferCount +
- (This->params.SwapEffect != D3DSWAPEFFECT_COPY)) : 0;
+ oldBufferCount = This->num_back_buffers;
newBufferCount = pParams->BackBufferCount +
(pParams->SwapEffect != D3DSWAPEFFECT_COPY);
@@ -295,6 +293,7 @@ NineSwapChain9_Resize( struct NineSwapChain9 *This,
This->present_handles[i] = NULL;
}
}
+ This->num_back_buffers = newBufferCount;
for (i = 0; i < newBufferCount; ++i) {
tmplt.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
@@ -498,13 +497,13 @@ NineSwapChain9_dtor( struct NineSwapChain9 *This )
if (This->pool)
_mesa_threadpool_destroy(This, This->pool);
- if (This->buffers[0]) {
- for (i = 0; i < This->params.BackBufferCount; i++) {
+ for (i = 0; i < This->num_back_buffers; i++) {
+ if (This->buffers[i])
NineUnknown_Release(NineUnknown(This->buffers[i]));
+ if (This->present_handles[i])
ID3DPresent_DestroyD3DWindowBuffer(This->present, This->present_handles[i]);
- if (This->present_buffers[i])
- pipe_resource_reference(&(This->present_buffers[i]), NULL);
- }
+ if (This->present_buffers[i])
+ pipe_resource_reference(&(This->present_buffers[i]), NULL);
}
if (This->zsbuf)
NineUnknown_Unbind(NineUnknown(This->zsbuf));
@@ -806,32 +805,32 @@ NineSwapChain9_Present( struct NineSwapChain9 *This,
case D3DSWAPEFFECT_DISCARD:
/* rotate the queue */
pipe_resource_reference(&res, This->buffers[0]->base.resource);
- for (i = 1; i <= This->params.BackBufferCount; i++) {
+ for (i = 1; i < This->num_back_buffers; i++) {
NineSurface9_SetResourceResize(This->buffers[i - 1],
This->buffers[i]->base.resource);
}
NineSurface9_SetResourceResize(
- This->buffers[This->params.BackBufferCount], res);
+ This->buffers[This->num_back_buffers - 1], res);
pipe_resource_reference(&res, NULL);
if (This->present_buffers[0]) {
pipe_resource_reference(&res, This->present_buffers[0]);
- for (i = 1; i <= This->params.BackBufferCount; i++)
+ for (i = 1; i < This->num_back_buffers; i++)
pipe_resource_reference(&(This->present_buffers[i-1]), This->present_buffers[i]);
- pipe_resource_reference(&(This->present_buffers[This->params.BackBufferCount]), res);
+ pipe_resource_reference(&(This->present_buffers[This->num_back_buffers - 1]), res);
pipe_resource_reference(&res, NULL);
}
handle_temp = This->present_handles[0];
- for (i = 1; i <= This->params.BackBufferCount; i++) {
+ for (i = 1; i < This->num_back_buffers; i++) {
This->present_handles[i-1] = This->present_handles[i];
}
- This->present_handles[This->params.BackBufferCount] = handle_temp;
+ This->present_handles[This->num_back_buffers - 1] = handle_temp;
task_temp = This->tasks[0];
- for (i = 1; i <= This->params.BackBufferCount; i++) {
+ for (i = 1; i < This->num_back_buffers; i++) {
This->tasks[i-1] = This->tasks[i];
}
- This->tasks[This->params.BackBufferCount] = task_temp;
+ This->tasks[This->num_back_buffers - 1] = task_temp;
break;
case D3DSWAPEFFECT_COPY:
diff --git a/src/gallium/state_trackers/nine/swapchain9.h b/src/gallium/state_trackers/nine/swapchain9.h
index 551c74486e3..9f33d17b47d 100644
--- a/src/gallium/state_trackers/nine/swapchain9.h
+++ b/src/gallium/state_trackers/nine/swapchain9.h
@@ -53,6 +53,7 @@ struct NineSwapChain9
D3DDISPLAYMODEEX *mode;
struct d3dadapter9_context *actx;
BOOL implicit;
+ unsigned num_back_buffers;
/* buffer handles */
struct NineSurface9 *buffers[D3DPRESENT_BACK_BUFFERS_MAX_EX + 1]; /* 0 to BackBufferCount-1 : the back buffers. BackBufferCount : additional buffer */