d3d12: Fix importing external resources

Fixes: 97061dd7 ("d3d12: Add support for Xbox GDK.")
(cherry picked from commit 9e277ed2b6)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40359>
This commit is contained in:
Jesse Natalie 2026-02-27 14:25:57 -08:00 committed by Eric Engestrom
parent f1f583b3bc
commit 5bf2bcd81e
2 changed files with 15 additions and 1 deletions

View file

@ -4164,7 +4164,7 @@
"description": "d3d12: Fix importing external resources",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "97061dd7ee40d3ab82caff5485065a5e25016147",
"notes": null

View file

@ -604,11 +604,18 @@ d3d12_resource_from_handle(struct pipe_screen *pscreen,
if (res->bo) {
d3d12_res = res->bo->res;
} else if (handle->type == WINSYS_HANDLE_TYPE_D3D12_RES) {
#ifdef _GAMING_XBOX
if (handle->modifier == 1) {
d3d12_heap = (ID3D12Heap *) handle->com_obj;
} else {
d3d12_res = (ID3D12Resource *) handle->com_obj;
}
#else
IUnknown *obj = (IUnknown *) handle->com_obj;
(void)obj->QueryInterface(&d3d12_res);
(void)obj->QueryInterface(&d3d12_heap);
obj->Release();
#endif
} else {
screen->dev->OpenSharedHandle(d3d_handle, IID_PPV_ARGS(&d3d12_res));
}
@ -1070,12 +1077,17 @@ d3d12_memobj_create_from_handle(struct pipe_screen *pscreen, struct winsys_handl
}
memobj->base.dedicated = dedicated;
#ifdef _GAMING_XBOX
obj->AddRef();
if (handle->modifier == 1) {
memobj->heap = (ID3D12Heap *) obj;
} else {
memobj->res = (ID3D12Resource *) obj;
}
#else
(void)obj->QueryInterface(&memobj->heap);
(void)obj->QueryInterface(&memobj->res);
#endif
obj->Release();
if (!memobj->res && !memobj->heap) {
@ -1123,7 +1135,9 @@ d3d12_resource_from_memobj(struct pipe_screen *pscreen,
whandle.offset = static_cast<unsigned int>(offset);
whandle.format = templ->format;
#ifdef _GAMING_XBOX
whandle.modifier = memobj->res ? 0 : 1;
#endif
// WINSYS_HANDLE_TYPE_D3D12_RES implies taking ownership of the reference
((IUnknown *)whandle.com_obj)->AddRef();