关于c ++:Directx 12:在两个进程之间共享图形内存

Directx 12 : Sharing graphic memory between two processes

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

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

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

我正在对ID3D12Resource使用comptr来获取纹理数据...

那么我们该如何继续下去...


当然可以渲染到屏幕外的纹理并在另一个过程中显示它。要显示,可以调用CopyResourceCopyTextureRegion将共享资源复制到Swapchain的后缓冲区中,然后显示它。

我不确定您的named shared memory approach是什么意思,但是要使进程间内存共享正常工作,您必须:

在过程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的Name值冲突。

有关更多参考,请参见MSDN。