我正在尝试创建两个应用程序。一个应用程序将在屏幕外呈现纹理,第二个应用程序将从图形内存中读取并在窗口上呈现/显示它。
我的疑问是是否可以在DirectX 12中共享图形内存。
我的命名共享内存方法导致了“comptr addref”错误...
我正在使用ID3D12Resource
的comptr来处理纹理数据...
那么,我们如何继续使用这种方法呢...
我正在尝试创建两个应用程序。一个应用程序将在屏幕外呈现纹理,第二个应用程序将从图形内存中读取并在窗口上呈现/显示它。
我的疑问是是否可以在DirectX 12中共享图形内存。
我的命名共享内存方法导致了“comptr addref”错误...
我正在使用ID3D12Resource
的comptr来处理纹理数据...
那么,我们如何继续使用这种方法呢...
CopyResource 或 CopyTextureRegion 将共享资源复制到 Swapchain 的后台缓冲区中,然后进行呈现。
我不确定您所说的命名共享内存方法是什么意思,但要使进程间内存共享工作,您必须:
在进程A中:
- 在共享堆中创建资源,例如通过 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。