繁体   English   中英

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

[英]Directx 12 : Sharing graphic memory between two processes

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

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

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

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

那么我们如何继续这种方法......

当然可以渲染到离屏纹理并在另一个进程中显示它。 要显示,您可以调用CopyResourceCopyTextureRegion将共享资源复制到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)));
}

请注意,您必须避免传递给ID3D12Device::CreateCommittedResourceName值发生冲突。

如需进一步参考,请参阅MSDN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM