You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨设备复制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、采样参数完全一致,任意参数不匹配都会导致调用失败。

修复步骤

  1. 修正共享纹理创建属性:将用于共享的源纹理用途改为D3D11_USAGE_DEFAULT,MiscFlags补充D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX与D3D11_RESOURCE_MISC_SHARED_NTHANDLE标记,使用IDXGIResource1::GetSharedHandle获取NT共享句柄,调用OpenSharedResource1打开句柄,跨设备兼容性更好。
  2. 补全所有API的HRESULT校验,对每个调用的返回值做判断,确认每一步都执行成功后再进行后续操作,根据错误码可以直接定位具体失败原因。
  3. 增加共享资源同步逻辑:打开共享纹理后,查询IDXGIKeyedMutex接口,调用AcquireSync(0, INFINITE)获取资源控制权后再执行CopyResource,操作完成后调用ReleaseSync(0)释放控制权。
  4. 确认执行CopyResource的Context所属设备,与源、目标纹理的所属设备完全一致。

内容的提问来源于stack exchange,提问作者bielf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:57:00