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@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17688>
This commit is contained in:
parent
b72ec453bd
commit
375e8b2f4b
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue