Directx 12:在两个进程之间共享图形内存
Directx 12 : Sharing graphic memory between two processes
我正在尝试创建两个应用程序。一个应用程序将在屏幕外渲染纹理,第二个应用程序将从图形内存中读取它并 render/present 在 window 上读取它。
我怀疑是否可以在 directx 12 中共享图形内存。
我的命名共享内存方法导致 comptr addref 错误...
我正在为纹理数据使用 ID3D12Resource
的 comptr...
那么我们如何才能继续这种方法...
当然可以渲染到屏幕外纹理并在另一个进程中显示它。要显示,您可以调用CopyResource
或CopyTextureRegion
将共享资源复制到Swapchain
的后台缓冲区中,然后显示它。
我不确定你的 named shared memory approach
是什么意思,但要使进程间内存共享正常工作,你必须:
进程A中:
- 在 shared 堆中创建资源,例如通过 ID3D12Device::CreateCommittedResource
- 在资源上调用 ID3D12Device::CreateSharedHandle
进程B中:
- 调用ID3D12Device::OpenSharedHandleByName获取共享句柄(调用NT句柄)
- 调用 ID3D12Device::OpenSharedHandle 从句柄创建资源
快速绘制的示例(创建缓冲区,但对于纹理来说应该没有任何不同):
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 的 Name
值发生冲突。
如需进一步参考,请参阅 MSDN。
我正在尝试创建两个应用程序。一个应用程序将在屏幕外渲染纹理,第二个应用程序将从图形内存中读取它并 render/present 在 window 上读取它。
我怀疑是否可以在 directx 12 中共享图形内存。
我的命名共享内存方法导致 comptr addref 错误...
我正在为纹理数据使用 ID3D12Resource
的 comptr...
那么我们如何才能继续这种方法...
当然可以渲染到屏幕外纹理并在另一个进程中显示它。要显示,您可以调用CopyResource
或CopyTextureRegion
将共享资源复制到Swapchain
的后台缓冲区中,然后显示它。
我不确定你的 named shared memory approach
是什么意思,但要使进程间内存共享正常工作,你必须:
进程A中:
- 在 shared 堆中创建资源,例如通过 ID3D12Device::CreateCommittedResource
- 在资源上调用 ID3D12Device::CreateSharedHandle
进程B中:
- 调用ID3D12Device::OpenSharedHandleByName获取共享句柄(调用NT句柄)
- 调用 ID3D12Device::OpenSharedHandle 从句柄创建资源
快速绘制的示例(创建缓冲区,但对于纹理来说应该没有任何不同):
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 的 Name
值发生冲突。
如需进一步参考,请参阅 MSDN。