跨设备复制D3D11Texture时CopyResource失效,已配置共享接口如何解决
跨设备D3D11纹理CopyResource失效的常见原因及修复方案
核心错误点
- 共享纹理创建属性非法:D3D11规范明确规定
D3D11_USAGE_STAGING用途的资源不支持设置D3D11_RESOURCE_MISC_SHARED标记,你代码中用于共享的源纹理使用了STAGING用途,这一步纹理创建就已经失败,后续所有操作自然无效。 - CopyResource调用规则违反:
CopyResource要求源、目标资源必须和执行调用的ID3D11DeviceContext属于同一设备,你需要确认m_destTexture2D和tempContext所属的ppDevice是同一设备,否则调用直接失败。 - 缺少跨设备共享同步逻辑:未使用
IDXGIKeyedMutex对共享资源做读写同步,源设备可能还在占用纹理资源,导致读入的数据为空或调用失败。 - 参数校验缺失:你代码中绝大多数返回HRESULT的API都没有做错误判断,包括纹理创建、
OpenSharedResource、CopyResource等调用的返回值都没有校验,无法定位具体失败环节。 - 资源属性不匹配:
CopyResource要求源、目标纹理的宽高、格式、MipLevels、ArraySize、采样参数完全一致,任意参数不匹配都会导致调用失败。
修复步骤
- 修正共享纹理创建属性:将用于共享的源纹理用途改为
D3D11_USAGE_DEFAULT,MiscFlags补充D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX与D3D11_RESOURCE_MISC_SHARED_NTHANDLE标记,使用IDXGIResource1::GetSharedHandle获取NT共享句柄,调用OpenSharedResource1打开句柄,跨设备兼容性更好。 - 补全所有API的HRESULT校验,对每个调用的返回值做判断,确认每一步都执行成功后再进行后续操作,根据错误码可以直接定位具体失败原因。
- 增加共享资源同步逻辑:打开共享纹理后,查询
IDXGIKeyedMutex接口,调用AcquireSync(0, INFINITE)获取资源控制权后再执行CopyResource,操作完成后调用ReleaseSync(0)释放控制权。 - 确认执行CopyResource的Context所属设备,与源、目标纹理的所属设备完全一致。
内容的提问来源于stack exchange,提问作者bielf
相关产品推荐
相关产品推荐

