DirectX11中CreateShaderHandle句柄是否仅支持同一适配器(GPU)使用?
关于DirectX 11跨适配器共享句柄的问题解答
没错,你遇到的情况是DirectX 11资源共享的正常行为——通过CreateShaderHandle(这里大概率是笔误,应该是IDXGIResource1::CreateSharedHandle吧?)创建的共享句柄,确实只能在同一适配器(GPU)对应的D3D11设备之间正常工作。
为什么同一适配器可行,跨适配器不行?
你当前在同一适配器下调用D3D11CreateDevice(dxgi_adapter, ...)创建设备,这些设备属于同一个GPU的资源池,共享句柄本质是指向该GPU显存内资源的直接引用,所以不同线程的设备能正常识别并访问这个资源。
而DirectX 11的常规共享机制是绑定在单个GPU适配器的硬件资源池上的:每个GPU有自己独立的显存和硬件上下文,其他适配器没有权限也无法直接访问不属于自己的显存空间,所以跨适配器使用普通共享句柄时就会失效。
如果需要跨GPU共享资源怎么办?
要是你的业务场景必须在不同GPU的设备间共享资源,得用DirectX 11.1及以上(要求Windows 8或更高版本)支持的跨适配器共享方案,具体步骤如下:
- 创建共享资源时,在
D3D11_RESOURCE_DESC的MiscFlags里同时设置D3D11_RESOURCE_MISC_SHARED_NTHANDLE和D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX(后者用来处理跨设备的同步问题) - 调用
IDXGIResource1::CreateSharedHandle时,传入DXGI_SHARED_RESOURCE_NTHANDLE标志 - 在消费线程的另一个适配器设备上,使用
ID3D11Device1::OpenSharedResource1来打开共享句柄,别用旧的OpenSharedResource
这种模式下,系统会在后台负责资源在不同适配器之间的复制(或者基于硬件支持的按需访问),以此实现跨GPU的资源共享。
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

