wine Direct3D 10 不支持此 GPU 上的当前着色器后端

wine Direct3D 10 不支持此 GPU 上的当前着色器后端

你好,我正在尝试使用 playonLinxu 玩 NFS2012。我遇到了错误

winediag:dxgi_check_d3d10_support Direct3D 10 is not supported on this GPU with the current shader backend

在此处输入图片描述

以及调试日志

err:winediag:init_driver_info Invalid GPU override 8086:0a16 specified, ignoring.
fixme:dxgi:dxgi_output_GetDisplayModeList iface 0x13e6a0, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0x32f3a4, desc (nil) partial stub!
fixme:dxgi:dxgi_output_GetDisplayModeList iface 0x13e6a0, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0x32f3a4, desc 0x13e1978 partial stub!
fixme:d3d11:D3D11CoreCreateDevice Ignoring feature levels.
fixme:dxgi:dxgi_check_d3d10_support Ignoring adapter type.
fixme:winediag:dxgi_check_d3d10_support Direct3D 10 is not supported on this GPU with the current shader backend.
fixme:system:SystemParametersInfoW Unimplemented action: 59 (SPI_SETSTICKYKEYS)
fixme:system:SystemParametersInfoW Unimplemented action: 53 (SPI_SETTOGGLEKEYS)
fixme:system:SystemParametersInfoW Unimplemented action: 51 (SPI_SETFILTERKEYS)
fixme:thread:SetThreadIdealProcessor (0x70): stub
fixme:thread:SetThreadIdealProcessor (0x8c): stub
fixme:thread:SetThreadIdealProcessor (0x94): stub
fixme:thread:SetThreadIdealProcessor (0x98): stub

答案1

总结

运行glxinfo | grep GLSL— 您想要看到的最低版本是3.30否则您的驱动程序就不支持 wine 用于 DX10 实现的 GLSL 版本。


我也遇到了同样的错误,所以我决定调查一下。首先我们必须找出代码。在 Wine 源代码中进行 grepping 后,显示错误居住在dlls/dxgi/utils.c:448。以下是相关部分:

    hr = wined3d_get_device_caps(factory->wined3d, adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, &caps);
    if (FAILED(hr) || caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4)
    {
        FIXME_(winediag)("Direct3D 10 is not supported on this GPU with the current shader backend.\n");

因此,错误是由于wined3d_get_device_caps失败或着色器版本太低引起的。看一下在实施dlls/wined3d/directx.c:4884可能失败的原因表明这wined3d_get_device_caps是一个相当大的函数,约 700 行,而且只有两个返回s 位于其主体中 — 失败代码位于开始代码下方约 12 行,成功代码位于结尾。失败代码如下所示

    if (adapter_idx >= wined3d->adapter_count)
        return WINED3DERR_INVALIDCALL;

看看返回值的名称WINED3DERR_INVALIDCALL,我猜想这里的行是针对错误的情况 — 无论是在 Wine 中还是在应用程序中。我觉得这不太可能是我们的情况,所以让我们假设函数成功,返回到utils.c,并查看其他失败情况,即caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4

我没有接触过图形,所以不知道什么是 Vertex/Pixel Shader 版本。搜索后,我找到了一个答案,它也被称为“着色器模型”。顺便说一句,这不是可靠的来源,但是维基百科文章根本没有提到版本控制,所以总比没有好。

接下来,搜索着色器模型可以得到高级语言语言文章,幸运的是,它有 Pixel 和 Vertex 着色器版本的表格;两个表格都有4.0wine 正在寻找的版本。最后一件事:如果我们的 GPU 驱动程序实现了 OpenGL,我们如何才能知道它是否支持 4.0 版本?

事实证明有一篇关于检测着色器模型的文章对于 OpenGL,还有…OpenGL 和 Direct3D 版本的比较!引用:Direct3D Shader Model 4.0 is equivalent to GLSL version 3.30

让我们看看我们是否获得了该版本:

$ glxinfo | grep GLSL
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00

嗯,正如你所见,原来是驱动程序不支持所需的版本3.30☹ 我希望你幸运,但是,如果你正在读这篇文章,我想你并不幸运。

答案2

如果您的 GPU 驱动程序不支持兼容性上下文,您可以尝试添加注册表项来告诉 Wine 创建核心上下文。

[HKEY_CURRENT_USER\Software\Wine\Direct3D]
"MaxVersionGL"=dword:00030002

按照文档

  |  +->MaxVersionGL
  |  |   [DWORD Value (REG_DWORD): Choose the maximum GL version to request. Currently defaults to version 1.0.
  |  |    Set it to 30002 (hexadecimal) or greater to request a core profile context.]

如果运行$ glxinfo | grep GLSL仅报告 OpenGLES着色语言版本字符串,您可能被误导了。尝试$ glxinfo | grep -e "shading language"为我报告以下内容:

OpenGL core profile shading language version string: 4.20
OpenGL shading language version string: 1.30
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00

相关内容