TL;DR
Run glxinfo | grep GLSL
— the least version you want to see is the 3.30. Otherwise your driver just doesn't support the GLSL version which wine is using for DX10 implementation.
I was also getting the same error, so I decided to investigate it. First we have to find out the code. Grepping over the Wine source shows that the error resides in dlls/dxgi/utils.c:448
. Here's relevant part:
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");
So, the error is caused either by wined3d_get_device_caps
fail, or by too low shader versions. Taking a look at the implementation in dlls/wined3d/directx.c:4884
for the possible fail reason shows that the wined3d_get_device_caps
is pretty big function of ≈700 lines, and it have only two returns in its body — the fail one is ≈12 lines below the start, and the successful in the end. The fail code looks like
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
Looking at the name of return value WINED3DERR_INVALIDCALL
, I'd guess that the line here is for the case of a bug — either in Wine or in app. I've a feeling that this is unlikely our case, so let's assume that the function succeeds, return to the utils.c
, and take a look at the other fail cases, i.e. caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4
.
I haven't work with graphics, so didn't know what're Vertex/Pixel Shader Versions. Searching about it gives an answer, that it is also referred as «shader model». Isn't reliable source btw, but the Wikipedia article didn't mention versioning at all, so better than nothing.
Next, searching about shader model gives us HLSL article, which fortunately have tables for both Pixel and Vertex shader versions; both tables have 4.0
version, which wine is looking for. One last thing: how could we find whether our GPU driver supports the 4.0 version if it rather implements OpenGL?
Well, it turns out there's an article about detecting the shader model for OpenGL, and… there's a comparison of versions for OpenGL and Direct3D! Quoting: Direct3D Shader Model 4.0 is equivalent to GLSL version 3.30
.
Let's find out whether we got that version:
$ glxinfo | grep GLSL
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Well, as you see, it turns out that the driver didn't support the needed version 3.30 ☹ I wish you're lucky, though, if you're reading that, guess you're not.