2013-01-18

Shader Model 3 (SM3) sous Wine avec Nvidia GeForce 7x

J'ai eu envie d'essayer Eve Online, un MMORPG* qui se déroule dans l'espace et où on incarne un pilote de vaisseau.
Problème : au lancement du jeu, il refusait de démarrer et affichait une alerte comme quoi le jeu requiert les SM3 (Shader Model 3.0).
J'ai donc vérifié que ma carte graphique les supportait (une GForce 7950 GT), et me suis alors rendu compte que c'était wine qui avait décidé que la CG n'était pas capable de les gérer. Les cartes Nvidia des versions 6 et 7 sont concernées par ce bug.
Ci-dessous, voici comment régler le problème**.

Lire la suite

Récupérer les sources de Wine

Et oui, il va falloir compiler son propre wine. Donc allez sur le site de wine, récupérez les sources de la version désirée et décompressez les où vous voulez.

Par exemple, pour la version 1.5.21 :

cordeld@Black:~$ wget http://sourceforge.net/projects/wine/files/Source/wine-1.5.21.tar.bz2/download -O - | tar -xvj

Patcher la détection du support du SM3

À l'aide de votre éditeur favori (vi, emacs, gedit...), ouvrez le fichier "./dlls/wined3d/wined3d_gl.h" et recherchez "NV_TEXTURE_SHADER2" (ligne 146 normalement) et ajoutez une nouvelle ligne avec "NV_TEXTURE_SHADER3" :

NV_TEXTURE_SHADER, NV_TEXTURE_SHADER2, NV_TEXTURE_SHADER3, NV_VERTEX_PROGRAM, NV_VERTEX_PROGRAM1_1,

Idem ensuite pour le fichier "./dlls/wined3d/directx.c", vers la ligne 197, ajoutez la ligne suivante (en gras / rouge):

{"GL_NV_texture_shader", NV_TEXTURE_SHADER }, {"GL_NV_texture_shader2", NV_TEXTURE_SHADER2 }, {"GL_NV_texture_shader3", NV_TEXTURE_SHADER3 }, {"GL_NV_vertex_program", NV_VERTEX_PROGRAM }, {"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1 },

Ouvrez maintenant le fichier "./dlls/wined3d/glsl_shader.c", recherchez la définition de la fonction "shader_glsl_get_caps", et ajoutez un "|| gl_info->supported[NV_TEXTURE_SHADER3]" dans la détection du support du SM3. Le début de la fonction doit donc ressembler à ça ensuite (partie à rajouter en rouge):

static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps) { UINT shader_model; if (gl_info->supported[EXT_GPU_SHADER4] && gl_info->supported[ARB_SHADER_BIT_ENCODING] && gl_info->supported[ARB_GEOMETRY_SHADER4] && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 50) && gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX] && gl_info->supported[ARB_DRAW_INSTANCED]) shader_model = 4; /* ARB_shader_texture_lod or EXT_gpu_shader4 is required for the SM3 * texldd and texldl instructions. */ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD] || gl_info->supported[EXT_GPU_SHADER4] || gl_info->supported[NV_TEXTURE_SHADER3]) shader_model = 3; else shader_model = 2;

Compilons joyeusement

Rien de bien sorcier :

cordeld@Black:~$ ./configure cordeld@Black:~$ make depend cordeld@Black:~$ make cordeld@Black:~$ sudo make install

Je vous laisse vous battre avec les dépendances :).

C'est tout ?

Bah en fait oui... C'est juste que le test du support de SM3 de wine (pour cette version) est tout pourri... J'ai vu des brutes qui supprimaient la détection (les if, else if et else) pour tout simplement forcer le SM3, mais ça leur posera problème s'ils changent de carte Graphique qui supporte le SM4 : elle sera détectée pour ne supporter que le SM3.

* alias Meuporg pour les journalistes
** Au moment où j'écris cet article, le problème existe dans la version la plus récente de wine (1.5.21) mais devrait en théorie ne plus exister dans la prochaine version majeur