From 5bf2bcd81ec2cb0e5c3662c203c55c9f2d6386b4 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Fri, 27 Feb 2026 14:25:57 -0800 Subject: [PATCH] d3d12: Fix importing external resources Fixes: 97061dd7 ("d3d12: Add support for Xbox GDK.") (cherry picked from commit 9e277ed2b6dfa79eb2c171f3887bed08ff5dd32a) Part-of: --- .pick_status.json | 2 +- src/gallium/drivers/d3d12/d3d12_resource.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 414557989a9..35c552a934c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 diff --git a/src/gallium/drivers/d3d12/d3d12_resource.cpp b/src/gallium/drivers/d3d12/d3d12_resource.cpp index 2b5e995901d..9b0a4e9d973 100644 --- a/src/gallium/drivers/d3d12/d3d12_resource.cpp +++ b/src/gallium/drivers/d3d12/d3d12_resource.cpp @@ -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(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();