From cc017057eb2cb920f1452a37f74d59db09030188 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 25 Aug 2025 13:52:22 -0700 Subject: [PATCH] d3d12: Flush command queue when destroying or resizing Part-of: --- .../winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp index 79a4da866c0..31917eb359b 100644 --- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp +++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp @@ -73,6 +73,17 @@ d3d12_wgl_framebuffer(struct stw_winsys_framebuffer *fb) return (struct d3d12_wgl_framebuffer *)fb; } +static void +d3d12_wgl_framebuffer_drain_queue(struct d3d12_wgl_framebuffer *framebuffer) +{ + /* Fully drain */ + mtx_lock(&framebuffer->screen->submit_mutex); + UINT64 value = ++framebuffer->screen->fence_value; + framebuffer->screen->cmdqueue->Signal(framebuffer->screen->fence, value); + mtx_unlock(&framebuffer->screen->submit_mutex); + framebuffer->screen->fence->SetEventOnCompletion(value, nullptr); +} + static void d3d12_wgl_framebuffer_destroy(struct stw_winsys_framebuffer *fb, pipe_context *ctx) @@ -89,6 +100,8 @@ d3d12_wgl_framebuffer_destroy(struct stw_winsys_framebuffer *fb, } } + d3d12_wgl_framebuffer_drain_queue(framebuffer); + for (uint32_t i = 0; i < num_buffers; ++i) { if (framebuffer->buffers[i]) { d3d12_resource_release(d3d12_resource(framebuffer->buffers[i])); @@ -209,6 +222,8 @@ d3d12_wgl_framebuffer_resize(stw_winsys_framebuffer *fb, ctx->screen->fence_reference(ctx->screen, &fence, NULL); } + d3d12_wgl_framebuffer_drain_queue(framebuffer); + for (uint32_t i = 0; i < num_buffers; ++i) { if (framebuffer->buffers[i]) { d3d12_resource_release(d3d12_resource(framebuffer->buffers[i]));