Jusqu'ici ça ne fonctionnait qu'avec le pilote propriétaire NVIDIA sur ma carte graphique (GeForce 6200 AGP, codename NV4A, génération NV40), mais je viens de réussir à faire fonctionner cette technique avec le pilote Nouveau en me basant sur nvclock. 🙂
Il suffit de compiler nvclock, d'aller dans le répertoire src/simple et de modifier test.c :
Remplacer :
val = nv_card.PGRAPH[0x50C/4];
printf("value read : 0x%x \n", val);
Par :
int offset = 512;
nv_card.PCIO[0x3d4] = 0x0D;
nv_card.PCIO[0x3d5] = offset & 0xFF;
nv_card.PCIO[0x3d4] = 0x0C;
nv_card.PCIO[0x3d5] = offset >> 8;
getchar();
nv_card.PCIO[0x3d4] = 0x0D;
nv_card.PCIO[0x3d5] = 0;
nv_card.PCIO[0x3d4] = 0x0C;
nv_card.PCIO[0x3d5] = 0;
Ensuite taper
make depuis ce répertoire puis lancer
./test, ça devrait décaler l'affichage puis le restaurer quand on tape <Entrée>.
Chez moi l'affichage n'est pas correctement restauré, ça affiche une bouillie de pixels dans une bande horizontale d'une dizaine de pixels en haut de l'écran, puis il est correctement affiché à la suite. Un
xrandr -s 1024x768 -r 85 remet tout dans l'ordre, mais c'est quand même bizarre.
J'ai aussi régulièrement une perte du pointeur de la souris quand je lance nvclock, mais c'est revenu une fois en lançant test et en bougeant la souris en même temps.
Je vais essayer de corriger ces problèmes et faire une nouvelle version de pflip qui détectera automatiquement le pilote et le device utilisés. Visiblement je ne devais pas faire le mmap de la bonne façon...