Mesa (main): d3d12: Hold lock when removing resources from residency list

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 22 14:58:06 UTC 2022


Module: Mesa
Branch: main
Commit: 375e8b2f4b32b55621ca84accfb3e942b654f37c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=375e8b2f4b32b55621ca84accfb3e942b654f37c

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Tue Jul 19 15:30:07 2022 -0700

d3d12: Hold lock when removing resources from residency list

Also, remove them from the list before releasing the ID3D12Resource.

Fixes: 671deb54 ("d3d12: Add residency info to d3d12_bo")
Reviewed-by: Bill Kristiansen <billkris at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17688>

---

 src/gallium/drivers/d3d12/d3d12_bufmgr.cpp | 8 ++++++--
 src/gallium/drivers/d3d12/d3d12_bufmgr.h   | 1 +
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
index 80994e0f4a7..993906375b9 100644
--- a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
@@ -106,6 +106,7 @@ d3d12_bo_wrap_res(struct d3d12_screen *screen, ID3D12Resource *res, enum pipe_fo
       return NULL;
 
    pipe_reference_init(&bo->reference, 1);
+   bo->screen = screen;
    bo->res = res;
    bo->trans_state = create_trans_state(res, format);
    bo->unique_id = p_atomic_inc_return(&screen->resource_id_generator);
@@ -177,6 +178,7 @@ d3d12_bo_wrap_buffer(struct d3d12_screen *screen, struct pb_buffer *buf)
       return NULL;
 
    pipe_reference_init(&bo->reference, 1);
+   bo->screen = screen;
    bo->buffer = buf;
    bo->trans_state = NULL; /* State from base BO will be used */
    bo->unique_id = p_atomic_inc_return(&screen->resource_id_generator);
@@ -198,11 +200,13 @@ d3d12_bo_unreference(struct d3d12_bo *bo)
       if (bo->buffer) {
          pb_reference(&bo->buffer, NULL);
       } else {
-         delete bo->trans_state;
-         bo->res->Release();
+         mtx_lock(&bo->screen->submit_mutex);
          if (bo->residency_status != d3d12_evicted) {
             list_del(&bo->residency_list_entry);
          }
+         mtx_unlock(&bo->screen->submit_mutex);
+         delete bo->trans_state;
+         bo->res->Release();
       }
       FREE(bo);
    }
diff --git a/src/gallium/drivers/d3d12/d3d12_bufmgr.h b/src/gallium/drivers/d3d12/d3d12_bufmgr.h
index 12120c2f90c..6b3ba015ffb 100644
--- a/src/gallium/drivers/d3d12/d3d12_bufmgr.h
+++ b/src/gallium/drivers/d3d12/d3d12_bufmgr.h
@@ -43,6 +43,7 @@ enum d3d12_residency_status {
 
 struct d3d12_bo {
    struct pipe_reference reference;
+   struct d3d12_screen *screen;
    ID3D12Resource *res;
    struct pb_buffer *buffer;
    struct TransitionableResourceState *trans_state;



More information about the mesa-commit mailing list