d3d12: Flush command queue when destroying or resizing
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36994>
This commit is contained in:
@@ -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]));
|
||||
|
||||
Reference in New Issue
Block a user