Suite à mes tests avec Genlock, j'envisage d'écrire un nouveau module basé sur ce dernier qui s'appellera NVStereo. NV parce qu'il ne concernera dans un premier temps que les cartes graphiques NVIDIA et Stereo parce que je compte supprimer les fonctions de genlocking/framelocking et ne conserver que le code relatif à la stéréo en page flipping sur un unique écran.

Voici les modifications que je compte inclure dans NVStereo par ordre de priorité :

  1. suppression du code relatif au genlocking/framelocking
  2. suppression de la gestion du port parallèle pour le genlocking et le pilotage de lunettes
  3. inversion du rendu quand un retour vertical est manqué
  4. inversion du rendu par une application en user space en temps réel
  5. activation/désactivation du page flipping par une application en user space en temps réel
  6. détection de la parité des trames pour toujours alterner les trames dans un ordre prédéfini
  7. détection des changements de mode graphique et recalcul de la durée d'une trame
  8. support des lunettes LCD à obturation VGA DDC
  9. choix du CRTC pour la synchronisation avec le retour vertical
  10. support des lunettes GeForce 3D Vision si je trouve un moyen de tester les bouts de code existants

À terme, j'aimerais m'en servir comme base pour un futur driver 3D généraliste capable de fonctionner aussi bien avec OpenGL qu'avec XVideo et peut-être X Window de façon plus générale. Il faudra également trouver de la doc pour adapter le code à d'autres marques de cartes graphiques (ATI et Intel dans un premier temps) et procéder à quelques adaptations supplémentaires.

Concernant les cartes NVIDIA, le code de détection du retour vertical ne devrait pas avoir à subir de changements, mais il faudra essayer de faire en sorte que le page flipping puisse fonctionner sans écran virtuel et si possible en mode fenêtré. Pour X Window et/ou XVideo il faudrait tester avec un Pixmap en mémoire vidéo, qu'il faudra sans doute marquer d'un tag spécial pour que le driver sache de quel Pixmap il doit s'occuper. Il sera sans doute impossible de gérer autre chose que des modes plein écran avec le page flipping.

À priori le driver stéréo 3D NVIDIA fonctionne d'une manière similaire pour l'affichage de vidéos et d'images, en utilisant une surface vidéo avec une résolution horizontale double et une ligne supplémentaire contenant un tag spécifique ainsi que des paramètres pour le rendu.

Les paramètres sont à priori les suivants pour le tag :

  • unsigned int dwSignature;
  • unsigned int dwWidth; // à priori non utilisé pour l'instant (trouvé sur MTBS3D)
  • unsigned int dwHeight; // à priori non utilisé pour l'instant (trouvé sur MTBS3D)
  • unsigned int dwBPP;
  • unsigned int dwFlags;

Contenu de la signature :

  • #define NVSTEREO_IMAGE_SIGNATURE 0x4433564e //NV3D

Et pour les flags :

  • #define SIH_SWAP_EYES 0x00000001
  • #define SIH_SCALE_TO_FIT 0x00000002
  • #define SIH_SCALE_TO_FIT2 0x00000004 // à utiliser avec le précédent pour conserver l'aspect ratio (trouvé sur MTBS3D)

Ensuite cette surface est envoyée vers le back buffer avec un StretchRect et la vidéo est affichée en 3D lorsque le back buffer est présenté à l'écran. Il faudra voir s'il y a besoin d'utiliser un back buffer avec X Window/XVideo (éventuellement avec DBE) ou si on peut se contenter de pixmaps en mémoire vidéo.

Il faudra voir si la même chose est possible sous OpenGL avec des FBOs ou trouver une autre technique en étudiant le mode de fonctionnement des drivers stéréo NVIDIA sous Direct3D et/ou OpenGL.

Il faudra également ajouter du code pour la gestion de divers paramètres, comme la séparation et la convergence par exemple.