D3D11:参考光栅与WARP

问题描述 投票:-1回答:1

我有一个像素着色器的测试,该着色器进行了一些渲染并将结果与​​参考图像进行比较,以验证该着色器产生了预期的输出。在CI机器上运行此测试时,它在没有GPU的VM上运行,因此我使用D3D_DRIVER_TYPE_REFERENCE调用D3D11CreateDevice以使用参考光栅化器。多年来,我们在Windows 7 VM上一直做到这一点。

我们现在正在尝试迁移到Windows 10 VM进行CI测试。当我在此处运行测试时,使用DXGI_ERROR_DEVICE_REMOVED进行一定数量的成功测试(大约在5000-10000之间)后,各种API调用会开始失败,并调用GetDeviceRemovedReason返回DXGI_ERROR_DRIVER_INTERNAL_ERROR。经过一些调试后,我发现故障是在调用ID3D11DeviceContext :: PSSetShader的过程中引起的(是的,返回的是void,但我是通过KernelBase.dll!RaiseException中的断点发现的)。据我所知,此调用看起来完全像以前对PSSetShader的数千次调用。它似乎不是资源问题,发生错误时该过程仅使用8MB内存,并且句柄数没有增长。

我可以在多个Win10系统上重现该问题,并且在多个Win7系统上都可以成功。两者之间的最大区别是,在Win7上,API调用通过d3d11ref.dll,而在Win10上,API调用通过d3d10warp.dll。我并不真正了解这些差异是什么,或者为什么会选择一个或另一个,因此MSDN的文档在这个主题上还很模糊。我知道d3d11ref.dll和d3d10warp.dll都出现在故障系统和通过系统中;我不知道为同一组调用加载一个或另一个逻辑是什么,或者为什么d3d10warp库失败。

因此,有人可以解释两者之间的区别,和/或建议如何将d3d11ref.dll加载到Windows 10中吗?据我所知,这是d3d10warp.dll中的错误,现在我只想回避它。

[如果有问题,我正在将所需功能级别设置为D3D_FEATURE_LEVEL_11_0来调用D3D11CreateDevice,并验证是否返回了相同的级别。我为creationFlags传递了0,我的D3D11_SDK_VERSION在d3d11.h中定义为7。下面是发生故障时PSSetShader上方的调用堆栈。这似乎是第一个失败的调用,并且此后每个带有返回代码的调用也都会失败。

KernelBase.dll!RaiseException()
KernelBase.dll!OutputDebugStringA()
d3d11.dll!CDevice::RemoveDevice(long)
d3d11.dll!NDXGI::CDevice::RemoveDevice()
d3d11.dll!CContext::UMSetError_()
d3d10warp.dll!UMDevice::MSCB_SetError(long,enum UMDevice::DDI_TYPE)
d3d10warp.dll!UMContext::SetShaderWithInterfaces(enum PIXELJIT_SHADER_STAGE,struct D3D10DDI_HSHADER,unsigned int,unsigned int const *,struct D3D11DDIARG_POINTERDATA const *)
d3d10warp.dll!UMDevice::PsSetShaderWithInterfaces(struct D3D10DDI_HDEVICE,struct D3D10DDI_HSHADER,unsigned int,unsigned int const *,struct D3D11DDIARG_POINTERDATA const *)
d3d11.dll!CContext::TID3D11DeviceContext_SetShaderWithInterfaces_<1,4>(class CContext *,struct ID3D11PixelShader *,struct ID3D11ClassInstance * const *,unsigned int)
d3d11.dll!CContext::TID3D11DeviceContext_SetShader_<1,4>()
MyTest.exe!MyFunctionThatCallsPSSetShader()
c++ directx-11 direct3d11 warp
1个回答
0
投票

问题是您尚未在该系统上启用Windows 10可选功能“图形工具”。这就是您在Windows 10上安装DirectX 11/12调试运行时的方式,包括Direct3D 11的参考设备,DirectX 12的WARP,DX11 / DX12的DirectX SDK调试层等。

© www.soinside.com 2019 - 2024. All rights reserved.