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@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14959>
This commit is contained in:
Jesse Natalie 2022-02-09 07:53:57 -08:00 committed by Marge Bot
parent f4c74f74f8
commit 671deb541e
5 changed files with 40 additions and 10 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;