TL; DR
Execute glxinfo | grep GLSL
- a menor versão que você deseja ver é o 3.30 . Caso contrário, o seu driver simplesmente não suporta a versão GLSL que o vinho está usando para a implementação do DX10.
Eu também estava recebendo o mesmo erro, então decidi investigar. Primeiro temos que descobrir o código. Grepping over the Wine source mostra que o erro reside em dlls/dxgi/utils.c:448
. Aqui está parte relevante:
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");
Portanto, o erro é causado por wined3d_get_device_caps
fail ou por versões de sombreamento muito baixas. Dando uma olhada na implementação em dlls/wined3d/directx.c:4884
para o A possível razão de falha mostra que wined3d_get_device_caps
é uma função muito grande de ≈700 linhas e tem apenas dois retorno s em seu corpo - a falha é ≈12 linhas abaixo do início e o sucesso No final. O código de falha se parece com
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
Olhando para o nome do valor de retorno WINED3DERR_INVALIDCALL
, eu acho que a linha aqui é para o caso de um bug - no Wine ou no aplicativo. Eu tenho a sensação de que isso é improvável no nosso caso, então vamos supor que a função seja bem-sucedida, retornar ao utils.c
e dar uma olhada nos outros casos de falha, ou seja, caps.VertexShaderVersion < 4 || caps.PixelShaderVersion < 4
.
Eu não trabalho com gráficos, então não sei o que é Vertex / Pixel Shader Versions. Pesquisando sobre isso dá uma resposta, que também é referido como «modelo shader» . Não é confiável fonte btw, mas o artigo da Wikipedia não mencionou versionamento em tudo, então melhor do que nada.
Em seguida, a pesquisa sobre o modelo de shader nos fornece o artigo HLSL , que felizmente tem tabelas para o Pixel e o Vertex shader versões; ambas as tabelas têm 4.0
versão, que o vinho está procurando. Uma última coisa: como poderíamos descobrir se nosso driver de GPU suporta a versão 4.0 se implementa o OpenGL?
Bem, acontece que há um artigo sobre como detectar o modelo de shader para o OpenGL, e… há uma comparação de versões para OpenGL e Direct3D! Citando: Direct3D Shader Model 4.0 is equivalent to GLSL version 3.30
.
Vamos descobrir se conseguimos essa versão:
$ glxinfo | grep GLSL
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Bem, como você pode ver, o driver não suportou a versão necessária 3.30 ☹ Eu desejo que você tenha sorte, no entanto, se você está lendo isso, adivinhe re não.