基于UMD的DirectX 11纹理共享失败:OpenSharedResource返回E_INVALIDARG
从用户模式驱动(UMD)向常规用户态进程共享D3D11纹理失败问题
我基于Microsoft Indirect Display Driver Sample开发用户模式驱动(UMD),希望与实时用户态进程共享D3D11纹理。但客户端进程尝试打开共享资源时,OpenSharedResource调用失败并返回E_INVALIDARG。
我已尝试以下操作:
- 确保UMD与客户端使用同一GPU适配器
- 确认句柄有效且有值
- 对比
CreateSharedHandle+OpenSharedResource1与GetSharedHandle+OpenSharedResource的使用差异 - 设置
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_NTHANDLE - 将句柄转换为UINT64以适配64位架构
- 相同代码在两个常规进程间可正常运行
UMD端共享纹理代码
HANDLE hPipe = CreateNamedPipeW( L"\\\\.\\pipe\\MyD3DSharedHandlePipe", PIPE_ACCESS_OUTBOUND, PIPE_TYPE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 512, 512, 0, nullptr ); D3D11_TEXTURE2D_DESC desc = {}; //... desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.SampleDesc.Count = 1; desc.Usage = D3D11_USAGE_DEFAULT; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; ComPtr<ID3D11Texture2D> _SharedTexture; HRESULT hr = _Device->CreateTexture2D(&desc, nullptr, &_SharedTexture); ComPtr<IDXGIResource> sharedResource; _SharedTexture.As(&sharedResource); HANDLE sharedHandle = nullptr; hr = sharedResource->GetSharedHandle(&sharedHandle); //Tried UINT64 as well. BOOL written = WriteFile(hPipe, &sharedHandle, sizeof(sharedHandle), &bytesWritten, nullptr);
客户端代码
ComPtr<ID3D11Texture2D> sharedTex; HRESULT hr = device->OpenSharedResource( sharedHandle, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(sharedTex.GetAddressOf()) );
请问是否可以从UMD向常规用户态进程共享D3D11纹理?
内容的提问来源于stack exchange,提问作者Yudi Kahn
相关产品推荐
相关产品推荐

