DirectX 12:在两个进程之间共享图形内存

5

我正在尝试创建两个应用程序。一个应用程序将在屏幕外呈现纹理,第二个应用程序将从图形内存中读取并在窗口上呈现/显示它。

我的疑问是是否可以在DirectX 12中共享图形内存。

我的命名共享内存方法导致了“comptr addref”错误...

我正在使用ID3D12Resource的comptr来处理纹理数据...

那么,我们如何继续使用这种方法呢...

1个回答

6
肯定可以将内容渲染到离屏纹理,并在另一个进程中显示。要进行显示,您可以调用 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


是的,你说得对...虽然我找到了相应的MSDN文档...谢谢... - JackCarver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接