summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/d3d12
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2020-05-11 23:09:42 -0400
committerErik Faye-Lund <erik.faye-lund@collabora.com>2020-11-18 11:18:53 +0100
commit8bbc31aba2f3e048c335422e041267ff47a87a90 (patch)
tree93daf5876b3e1df68c8b15b286a6fd5d45a0210a /src/gallium/winsys/d3d12
parentbe4475c4a73dc71c8868f5508064feb6bdec0a22 (diff)
d3d12: Release swapchain buffers before resizing them
Reviewed-by: Charmaine Lee <charmainel@vmware.com> Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7535>
Diffstat (limited to 'src/gallium/winsys/d3d12')
-rw-r--r--src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
index b625e6dd7e4..1d283d536d0 100644
--- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
+++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
@@ -38,6 +38,7 @@
#include "stw_winsys.h"
#include "d3d12/d3d12_format.h"
+#include "d3d12/d3d12_resource.h"
#include "d3d12/d3d12_screen.h"
using Microsoft::WRL::ComPtr;
@@ -49,6 +50,7 @@ struct d3d12_wgl_framebuffer {
enum pipe_format pformat;
HWND window;
ComPtr<IDXGISwapChain3> swapchain;
+ struct pipe_resource *buffers[2];
};
static struct d3d12_wgl_framebuffer *
@@ -108,6 +110,12 @@ d3d12_wgl_framebuffer_resize(stw_winsys_framebuffer *fb,
ctx->screen->fence_reference(ctx->screen, &fence, NULL);
}
+ for (int i = 0; i < 2; ++i) {
+ if (framebuffer->buffers[i]) {
+ d3d12_resource_release(d3d12_resource(framebuffer->buffers[i]));
+ pipe_resource_reference(&framebuffer->buffers[i], NULL);
+ }
+ }
if (FAILED(framebuffer->swapchain->ResizeBuffers(2, desc.Width, desc.Height, desc.Format, desc.Flags))) {
debug_printf("D3D12: failed to resize swapchain");
}
@@ -143,6 +151,11 @@ d3d12_wgl_framebuffer_get_resource(struct stw_winsys_framebuffer *pframebuffer,
if (statt == ST_ATTACHMENT_FRONT_LEFT)
index = !index;
+ if (framebuffer->buffers[index]) {
+ pipe_reference(NULL, &framebuffer->buffers[index]->reference);
+ return framebuffer->buffers[index];
+ }
+
ID3D12Resource *res;
framebuffer->swapchain->GetBuffer(index, IID_PPV_ARGS(&res));
if (!res)
@@ -169,8 +182,10 @@ d3d12_wgl_framebuffer_get_resource(struct stw_winsys_framebuffer *pframebuffer,
templ.usage = PIPE_USAGE_DEFAULT;
templ.flags = 0;
- return pscreen->resource_from_handle(pscreen, &templ, &handle,
- PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE);
+ pipe_resource_reference(&framebuffer->buffers[index],
+ pscreen->resource_from_handle(pscreen, &templ, &handle,
+ PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE));
+ return framebuffer->buffers[index];
}
struct stw_winsys_framebuffer *