win32 应用程序创建 2 个设备,device1 和 device2(同一适配器)。 device1创建一个纹理为“ComPtr<::ID3D12Resource>纹理”,那么device2是否可以使用device1创建的纹理? 因为device1和device2在同一个进程中,所以device2有办法访问“ComPtr<::ID3D12Resource>纹理”。 (“ComPtr<::ID3D12Resource>纹理”不是共享纹理) 谢谢
我按照上面的方式编码,我发现它有效。 但我不知道它是否可以通过使用任何其他 GPU 来工作。
您必须使用标志
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
。
D3D12 设备是每进程单例设备。如果您第二次调用 D3D12CreateDevice,它将返回完全相同的设备对象,只是添加一个引用。因此,在这些设备之间“共享”纹理将会像您发现的那样工作,并且预计会工作,因为您实际上根本没有共享它。
不需要像其他答案建议的那样使用共享标志。