J'ai décidé de passer sur l'IRC xorg-devel pour obtenir des infos. Et on m'a conseillé de faire le driver en espace utilisateur avec glXWaitVideoSyncSGI. En gros on en revient à ce qu'y à été fait il y a bien longtemps pour la libnvstusb ... Donc ça me laisse 2 choix :
- Faire un démon qui attends le vblank avec glXWaitVideoSyncSGI et qui effectue uniquement le vblank à ce moment là
- Intégrer le support des lunettes directement dans glQuadBufferEmu
La deuxième solution que j'avais déjà envisagée a quelques avantages par rapport à l'autre :
- Si la 3D n'est pas requise aucun processus ne nécessitant pas la 3D ne tourne
- Possibilité de corriger les imperfections (si une frame est trop longue à être dessinée ou si le scheduler nous redonne pas la main assez tôt)
Par contre la deuxième solution implique l'utilisation d'OpenGL pour utiliser les lunettes 3D alors que la première solution ne s'occupe pas du tout du rendu, donc tant que le programme de "dessin" se synchronise avec l'écran il n'y aura pas de problème. Est-ce que c'est vraiment un problème ? Je vais essayer de mettre à jour glQuadBufferEmu rapidement, qu'on puisse voir ce que ça donne. Si ça marche pas trop mal on part là dessus sinon retour à la case départ !
N'empêche si ça marche "juste comme ça" j'aurais passé des mois sans rien faire alors que la solution était sous mes yeux. En plus si ça marche en user-space ça veut dire ajout facile de nouvelles lunettes (oui le kernel-space c'est bien mais, faut le dire, c'est pas simple). Donc support des écrans avec émetteur intégré (via DDC) pas trop dur (le code est passé sur le forum y'a quelques temps) et je parle pas des autres types de lunettes ... Je pourrais peut-être repenser aux lunettes bluetooth par exemple (un driver de lunettes bluetooth en kernel-space ça me faisait un peu peur).
Je fais ça tout de suite, gardez l'adresse du git sous la main :
https://github.com/magestik/glQuadBufferEmu
EDIT: je viens de mettre à jour le git : j'ai intégré le code de libnvstusb !
Pour les testeurs, j'avoue que j'ai pas encore trop testé. Tout ce que je peux dire c'est que l’émetteur s'active et qu'à l'écran ça apparait bien (le clignotement à l'air correct) ! Chez moi ça synchronise correctement (glxgears indique 30 FPS vu que je suis en 60 Hz). Il faut placer le firmware à l'endroit d'où on lance le programme pour que ça marche. Il faut aussi avoir la libusb d'installée. Oh et je viens de me rendre compte que le mode frame-sequential ne marche plus que quand l’émetteur USB est branché donc ça devrait plus marcher pour ceux qui ont un écran de bureau avec émetteur intégré kit ou carrément des autres lunettes. Je m'occuperai de ça demain.
Pour ceux qui vont regarder le code : attention, ça pique les yeux ^^' Si ça marche correctement je m'occuperais de nettoyer un peu le code parce que là c'est quand même pas très propre ... faut quand même le dire. Je vais essayer de faire un dossier par mode d'affichage, ça permettra de pouvoir mieux s'y retrouver. Je vais aussi tenter de refaire le Makefile.
J'attends des nouvelles des testeurs parce que à quelques petits trucs près ça devrait marcher beaucoup mieux que tout ce qu'on a tenté jusqu'aujourd'hui. C'est pas aussi bien que ce que j'aurais esperé mais je pense qu'au moins ça devrait marcher.