调用D3D11On12Device::CreateWrappedResource返回E_INVALIDARG错误求助
解决D3D11On12Device::CreateWrappedResource返回E_INVALIDARG的常见排查点
E_INVALIDARG通常是参数不匹配或不符合底层要求导致的,官方文档未明确列出的常见触发点包括:
D3D12资源本身不符合兼容要求
- 资源状态不能是
D3D12_RESOURCE_STATE_UNKNOWN,得是D3D11可兼容的状态(比如D3D12_RESOURCE_STATE_COMMON、D3D12_RESOURCE_STATE_RENDER_TARGET这类,具体看你要包装成哪种D3D11资源)。 - 资源格式必须同时被D3D11和D3D12支持,一些小众压缩格式可能不满足。
- D3D12资源的绑定标志必须包含对应D3D11资源的需求位——比如要包装成D3D11渲染目标,D3D12资源必须设置
D3D12_RESOURCE_BIND_RENDER_TARGET。
- 资源状态不能是
D3D11资源描述与D3D12资源不匹配
- 传入的
D3D11_RESOURCE_DESC里的所有属性(宽度、高度、mip层级、数组大小、格式、样本数等)必须和D3D12资源完全一致,哪怕差一点都会报错。 Usage和CPUAccessFlags要和D3D12资源的CPU访问属性对齐:如果D3D12资源不可CPU访问,D3D11这边就不能设D3D11_USAGE_STAGING,也不能给CPUAccessFlags加读写权限位。
- 传入的
包装选项参数非法
D3D11_ON12_RESOURCE_FLAGS的设置要和资源实际属性匹配,比如设了D3D11_ON12_RESOURCE_FLAG_ALLOW_RENDER_TARGET但D3D12资源没开渲染目标绑定,就会触发错误。- 别给
Flags参数加文档里没定义的位。
设备与资源归属问题
- 要包装的D3D12资源必须是当前D3D11On12设备关联的D3D12设备创建的,跨设备包装肯定失败。
- 确认D3D11On12设备处于有效状态,没被提前释放或进入错误流程。
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

