wine O Direct3D 10 não é suportado nesta GPU com o backend atual do shader

2

Oi eu estou tentando paly NFS2012 com playonLinxu. estou recebendo erro

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

E log de depuração

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
    
por RahulG 16.01.2016 / 12:02

2 respostas

3

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.

    
por Hi-Angel 16.01.2016 / 19:34
2

Se seus drivers de GPU não suportarem contextos de compatibilidade, você pode tentar adicionar uma chave de registro para dizer ao Wine para criar um contexto principal.

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

De acordo com a documentação :

  |  +->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.]

Se a execução de $ glxinfo | grep GLSL relatar somente a string de versão do idioma de sombreamento OpenGL ES , você pode ter sido enganado. Tente $ glxinfo | grep -e "shading language" , que relata o seguinte para mim:

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
    
por crt0mega 08.08.2016 / 20:30