我正在尝试创建两个应用程序。一个应用程序将在屏幕外渲染纹理,第二个应用程序将从图形内存中读取它并在窗口上渲染/呈现它。
我的疑问是是否可以在 directx 12 中共享图形内存。
我的命名共享内存方法导致 comptr addref 错误...
我正在使用 comptr 来ID3D12Resource获取纹理数据......
那么我们如何继续这种方法......
当然可以渲染到屏幕外纹理并在另一个进程中显示它。要显示,您可以调用CopyResource或CopyTextureRegion复制共享资源到 的Swapchain后台缓冲区中,然后呈现它。
我不确定你的意思是什么named shared memory approach,但要让进程间内存共享工作,你必须:
流程A中:
流程B中:
快速绘制草图示例(创建一个缓冲区,但这对于纹理来说应该没有什么不同):
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)));
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须避免Name传递给ID3D12Device::CreateCommissedResource的值发生冲突。
如需进一步参考,请参阅MSDN。