Directx 12 : Sharing graphic memory between two processes
我正在尝试创建两个应用程序。 一个应用程序将在屏幕外渲染纹理,第二个应用程序将从图形内存中读取纹理并将其渲染/呈现在窗口上。
我怀疑是否可以在DirectX 12中共享图形内存。
我命名的共享内存方法导致comptr addref错误...
我正在对
那么我们该如何继续下去...
当然可以渲染到屏幕外的纹理并在另一个过程中显示它。要显示,可以调用
我不确定您的
在过程A中:
- 在共享堆中创建资源,例如通过ID3D12Device :: CreateCommittedResource
- 在资源上调用ID3D12Device :: CreateSharedHandle
在过程B中:
- 调用ID3D12Device :: OpenSharedHandleByName获取共享句柄(称为NT句柄)
- 调用ID3D12Device :: OpenSharedHandle从句柄创建资源
快速草绘示例(创建缓冲区,但纹理应该没有任何不同):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Microsoft::WRL::ComPtr<ID3D12Resource> ptr{}; if (isProcessA) { HANDLE handle{}; throwIfFailed(device->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES{D3D12_HEAP_TYPE_DEFAULT}, D3D12_HEAP_FLAG_SHARED, &CD3DX12_RESOURCE_DESC::Buffer(1024), D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(&ptr))); throwIfFailed(device->CreateSharedHandle(ptr.Get(), nullptr, GENERIC_ALL, L"Name", &handle)); } else { HANDLE handle{}; throwIfFailed(device->OpenSharedHandleByName(L"Name", GENERIC_ALL, &handle)); throwIfFailed(device->OpenSharedHandle(handle, IID_PPV_ARGS(&ptr))); } |
请注意,您必须避免传递给ID3D12Device :: CreateCommittedResource的
有关更多参考,请参见MSDN。