Mesa (main): d3d12: Add residency info to d3d12_bo

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Feb 10 20:18:08 UTC 2022


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

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Wed Feb  9 07:53:57 2022 -0800

d3d12: Add residency info to d3d12_bo

This is all currently immutable, but will be used to manage the
residency of the underlying D3D objects in a future commit.

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

---

 src/gallium/drivers/d3d12/d3d12_bufmgr.cpp   | 26 ++++++++++++++++++++------
 src/gallium/drivers/d3d12/d3d12_bufmgr.h     | 17 +++++++++++++++--
 src/gallium/drivers/d3d12/d3d12_resource.cpp |  4 ++--
 src/gallium/drivers/d3d12/d3d12_screen.cpp   |  2 ++
 src/gallium/drivers/d3d12/d3d12_screen.h     |  1 +
 5 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
index 91ec2c9eac9..b3ac7672c7a 100644
--- a/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_bufmgr.cpp
@@ -39,7 +39,7 @@
 struct d3d12_bufmgr {
    struct pb_manager base;
 
-   ID3D12Device *dev;
+   struct d3d12_screen *screen;
 };
 
 extern const struct pb_vtbl d3d12_buffer_vtbl;
@@ -72,7 +72,7 @@ create_trans_state(ID3D12Resource *res, enum pipe_format format)
 }
 
 struct d3d12_bo *
-d3d12_bo_wrap_res(ID3D12Resource *res, enum pipe_format format)
+d3d12_bo_wrap_res(struct d3d12_screen *screen, ID3D12Resource *res, enum pipe_format format, enum d3d12_residency_status residency)
 {
    struct d3d12_bo *bo;
 
@@ -84,12 +84,23 @@ d3d12_bo_wrap_res(ID3D12Resource *res, enum pipe_format format)
    bo->res = res;
    bo->trans_state = create_trans_state(res, format);
 
+   bo->residency_status = residency;
+   bo->last_used_timestamp = 0;
+   D3D12_RESOURCE_DESC desc = res->GetDesc();
+   screen->dev->GetCopyableFootprints(&desc, 0, bo->trans_state->NumSubresources(), 0, nullptr, nullptr, nullptr, &bo->estimated_size);
+   if (residency != d3d12_evicted) {
+      mtx_lock(&screen->submit_mutex);
+      list_add(&bo->residency_list_entry, &screen->residency_list);
+      mtx_unlock(&screen->submit_mutex);
+   }
+
    return bo;
 }
 
 struct d3d12_bo *
-d3d12_bo_new(ID3D12Device *dev, uint64_t size, const pb_desc *pb_desc)
+d3d12_bo_new(struct d3d12_screen *screen, uint64_t size, const pb_desc *pb_desc)
 {
+   ID3D12Device *dev = screen->dev;
    ID3D12Resource *res;
 
    D3D12_RESOURCE_DESC res_desc;
@@ -122,7 +133,7 @@ d3d12_bo_new(ID3D12Device *dev, uint64_t size, const pb_desc *pb_desc)
    if (FAILED(hres))
       return NULL;
 
-   return d3d12_bo_wrap_res(res, PIPE_FORMAT_NONE);
+   return d3d12_bo_wrap_res(screen, res, PIPE_FORMAT_NONE, d3d12_resident);
 }
 
 struct d3d12_bo *
@@ -155,6 +166,9 @@ d3d12_bo_unreference(struct d3d12_bo *bo)
       } else {
          delete bo->trans_state;
          bo->res->Release();
+         if (bo->residency_status != d3d12_evicted) {
+            list_del(&bo->residency_list_entry);
+         }
       }
       FREE(bo);
    }
@@ -289,7 +303,7 @@ d3d12_bufmgr_create_buffer(struct pb_manager *pmgr,
    buf->range.Begin = 0;
    buf->range.End = size;
 
-   buf->bo = d3d12_bo_new(mgr->dev, size, pb_desc);
+   buf->bo = d3d12_bo_new(mgr->screen, size, pb_desc);
    if (!buf->bo) {
       FREE(buf);
       return NULL;
@@ -341,7 +355,7 @@ d3d12_bufmgr_create(struct d3d12_screen *screen)
    mgr->base.flush = d3d12_bufmgr_flush;
    mgr->base.is_buffer_busy = d3d12_bufmgr_is_buffer_busy;
 
-   mgr->dev = screen->dev;
+   mgr->screen = screen;
 
    return &mgr->base;
 }
diff --git a/src/gallium/drivers/d3d12/d3d12_bufmgr.h b/src/gallium/drivers/d3d12/d3d12_bufmgr.h
index 338731a1bfc..cdbc1a3970a 100644
--- a/src/gallium/drivers/d3d12/d3d12_bufmgr.h
+++ b/src/gallium/drivers/d3d12/d3d12_bufmgr.h
@@ -26,6 +26,7 @@
 
 #include "pipebuffer/pb_buffer.h"
 #include "util/u_atomic.h"
+#include "util/list.h"
 
 #ifndef _WIN32
 #include <wsl/winadapter.h>
@@ -38,11 +39,23 @@ struct d3d12_screen;
 struct pb_manager;
 struct TransitionableResourceState;
 
+enum d3d12_residency_status {
+   d3d12_evicted,
+   d3d12_resident,
+   d3d12_permanently_resident,
+};
+
 struct d3d12_bo {
    int refcount;
    ID3D12Resource *res;
    struct pb_buffer *buffer;
    struct TransitionableResourceState *trans_state;
+
+   struct list_head residency_list_entry;
+   uint64_t estimated_size;
+   uint64_t last_used_timestamp;
+   uint64_t last_used_fence;
+   enum d3d12_residency_status residency_status;
 };
 
 struct d3d12_buffer {
@@ -96,10 +109,10 @@ d3d12_bo_is_suballocated(struct d3d12_bo *bo)
 }
 
 struct d3d12_bo *
-d3d12_bo_new(ID3D12Device *dev, uint64_t size, uint64_t alignment);
+d3d12_bo_new(struct d3d12_screen *screen, uint64_t size, uint64_t alignment);
 
 struct d3d12_bo *
-d3d12_bo_wrap_res(ID3D12Resource *res, enum pipe_format format);
+d3d12_bo_wrap_res(struct d3d12_screen *screen, ID3D12Resource *res, enum pipe_format format, enum d3d12_residency_status residency);
 
 struct d3d12_bo *
 d3d12_bo_wrap_buffer(struct pb_buffer *buf);
diff --git a/src/gallium/drivers/d3d12/d3d12_resource.cpp b/src/gallium/drivers/d3d12/d3d12_resource.cpp
index 26ab62feae5..919f980fc94 100644
--- a/src/gallium/drivers/d3d12/d3d12_resource.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_resource.cpp
@@ -269,7 +269,7 @@ init_texture(struct d3d12_screen *screen,
                                              &res->dt_stride);
    }
 
-   res->bo = d3d12_bo_wrap_res(d3d12_res, templ->format);
+   res->bo = d3d12_bo_wrap_res(screen, d3d12_res, templ->format, d3d12_resident);
 
    return true;
 }
@@ -547,7 +547,7 @@ d3d12_resource_from_handle(struct pipe_screen *pscreen,
    res->dxgi_format = d3d12_get_format(res->overall_format);
 
    if (!res->bo) {
-      res->bo = d3d12_bo_wrap_res(d3d12_res, res->overall_format);
+      res->bo = d3d12_bo_wrap_res(screen, d3d12_res, res->overall_format, d3d12_permanently_resident);
    }
    init_valid_range(res);
 
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp
index d5a7816dbae..1a476121350 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp
@@ -1188,6 +1188,8 @@ d3d12_init_screen(struct d3d12_screen *screen, struct sw_winsys *winsys, IUnknow
    if (FAILED(screen->dev->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&screen->fence))))
       goto failed;
 
+   list_inithead(&screen->residency_list);
+
    UINT64 timestamp_freq;
    if (FAILED(screen->cmdqueue->GetTimestampFrequency(&timestamp_freq)))
        timestamp_freq = 10000000;
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h
index 36ab354ffad..07e6fa85286 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.h
+++ b/src/gallium/drivers/d3d12/d3d12_screen.h
@@ -66,6 +66,7 @@ struct d3d12_screen {
    mtx_t submit_mutex;
    ID3D12Fence *fence;
    uint64_t fence_value;
+   struct list_head residency_list;
 
    struct slab_parent_pool transfer_pool;
    struct pb_manager *bufmgr;



More information about the mesa-commit mailing list