Mesa (master): d3d12: Clean up swapchains on framebuffer destruction

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 1 16:34:41 UTC 2021


Module: Mesa
Branch: master
Commit: 1517fb25a43ca5246ed05dba4f900d864e391bc3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1517fb25a43ca5246ed05dba4f900d864e391bc3

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Wed Mar 31 14:12:50 2021 -0700

d3d12: Clean up swapchains on framebuffer destruction

Reviewed-By: Bill Kristiansen <billkris at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9959>

---

 .../winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp     | 23 +++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
index ec4d6f05246..b96dc52517f 100644
--- a/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
+++ b/src/gallium/winsys/d3d12/wgl/d3d12_wgl_framebuffer.cpp
@@ -64,7 +64,26 @@ static void
 d3d12_wgl_framebuffer_destroy(struct stw_winsys_framebuffer *fb,
                               pipe_context *ctx)
 {
-   FREE(fb);
+   struct d3d12_wgl_framebuffer *framebuffer = d3d12_wgl_framebuffer(fb);
+   struct pipe_fence_handle *fence = NULL;
+
+   if (ctx) {
+      /* Ensure all resources are flushed */
+      ctx->flush(ctx, &fence, PIPE_FLUSH_HINT_FINISH);
+      if (fence) {
+         ctx->screen->fence_finish(ctx->screen, ctx, fence, PIPE_TIMEOUT_INFINITE);
+         ctx->screen->fence_reference(ctx->screen, &fence, NULL);
+      }
+   }
+
+   for (int i = 0; i < num_buffers; ++i) {
+      if (framebuffer->buffers[i]) {
+         d3d12_resource_release(d3d12_resource(framebuffer->buffers[i]));
+         pipe_resource_reference(&framebuffer->buffers[i], NULL);
+      }
+   }
+
+   delete framebuffer;
 }
 
 static void
@@ -208,6 +227,8 @@ d3d12_wgl_create_framebuffer(struct pipe_screen *screen,
    if (!fb)
       return NULL;
 
+   new (fb) struct d3d12_wgl_framebuffer();
+
    fb->window = WindowFromDC(hDC);
    fb->screen = d3d12_screen(screen);
    fb->base.destroy = d3d12_wgl_framebuffer_destroy;



More information about the mesa-commit mailing list