DX12 一台进程2台设备可以使用其中一台设备创建的相同纹理吗?

问题描述 投票:0回答:2

win32 应用程序创建 2 个设备,device1 和 device2(同一适配器)。 device1创建一个纹理为“ComPtr<::ID3D12Resource>纹理”,那么device2是否可以使用device1创建的纹理? 因为device1和device2在同一个进程中,所以device2有办法访问“ComPtr<::ID3D12Resource>纹理”。 (“ComPtr<::ID3D12Resource>纹理”不是共享纹理) 谢谢

我按照上面的方式编码,我发现它有效。 但我不知道它是否可以通过使用任何其他 GPU 来工作。

c++ windows winapi textures directx-12
2个回答
2
投票

您必须使用标志

D3D12_HEAP_FLAG_SHARED
创建资源,否则,您无法在不同设备之间共享资源。

您不应直接在设备 2 上使用设备 1 创建的

ID3D12Resource
实例。相反,应在设备 1 创建的资源上使用 CreateSharedHandle,然后在设备 2 上调用 OpenSharedHandle(使用该句柄)创建一个第二个
ID3D12Resource
实例专用于设备2。之后,这两个
ID3D12Resource
实例将指向GPU上的相同资源(该资源现在是共享的)。

如果您的设备是在不同的适配器(不同的 GPU)上创建的,则必须使用

D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER
而不是
D3D12_HEAP_FLAG_SHARED


0
投票

D3D12 设备是每进程单例设备。如果您第二次调用 D3D12CreateDevice,它将返回完全相同的设备对象,只是添加一个引用。因此,在这些设备之间“共享”纹理将会像您发现的那样工作,并且预计会工作,因为您实际上根本没有共享它。

不需要像其他答案建议的那样使用共享标志。

© www.soinside.com 2019 - 2024. All rights reserved.