你好,我正在尝试使用 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.0
wine 正在寻找的版本。最后一件事:如果我们的 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