From d11f0ac77bcb00716dc2d218c7ba5ef14ae3eb41 Mon Sep 17 00:00:00 2001 From: Derek Lesho Date: Mon, 28 Mar 2022 11:46:47 -0400 Subject: [PATCH] [d3d11] Always export correct shared handle type from ::GetSharedHandle and ::CreateSharedHandle Before we just assumed that the calls here would match the corresponding flag value (D3D11_RESOURCE_MISC_SHARED -> ::GetSharedHandle, D3D11_RESOURCE_MISC_SHARED_NTHANDLE -> ::CreateSharedHandle), but it turns out that its possible to set both flags and use both methods. Now we always tell Vulkan to export a KMT handle if D3D11_RESOURCE_MISC_SHARED is present, and use openKmtHandle to get an NT handle when needed. --- src/d3d11/d3d11_resource.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/d3d11/d3d11_resource.cpp b/src/d3d11/d3d11_resource.cpp index d05f003a4..ab8aabe40 100644 --- a/src/d3d11/d3d11_resource.cpp +++ b/src/d3d11/d3d11_resource.cpp @@ -2,6 +2,8 @@ #include "d3d11_texture.h" #include "d3d11_resource.h" +#include "../util/util_shared_res.h" + namespace dxvk { D3D11DXGIResource::D3D11DXGIResource( @@ -82,7 +84,7 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DXGIResource::GetSharedHandle( HANDLE* pSharedHandle) { auto texture = GetCommonTexture(m_resource); - if (texture == nullptr || pSharedHandle == nullptr) + if (texture == nullptr || pSharedHandle == nullptr || !(texture->Desc()->MiscFlags & D3D11_RESOURCE_MISC_SHARED)) return E_INVALIDARG; HANDLE kmtHandle = texture->GetImage()->sharedHandle(); @@ -141,7 +143,8 @@ namespace dxvk { LPCWSTR lpName, HANDLE* pHandle) { auto texture = GetCommonTexture(m_resource); - if (texture == nullptr || pHandle == nullptr) + if (texture == nullptr || pHandle == nullptr || + !(texture->Desc()->MiscFlags & (D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX | D3D11_RESOURCE_MISC_SHARED_NTHANDLE))) return E_INVALIDARG; if (lpName) @@ -152,6 +155,9 @@ namespace dxvk { if (handle == INVALID_HANDLE_VALUE) return E_INVALIDARG; + if (texture->Desc()->MiscFlags & D3D11_RESOURCE_MISC_SHARED) + handle = openKmtHandle( handle ); + *pHandle = handle; return S_OK; }