Fermer2
DrTypoFrLe 02/05/2021 à 18:41
Bon là je ne sais plus quoi faire.
J'essaie de faire un jeu 3D et je rencontre un bug de corruption de mémoire très embêtant.
Le DSP fait les calculs de transformations et le mixage des samples (3 voies à 16KHz).
Le GPU fait le rendu des triangles, avec la Blitter.
Quand le mixage des sons et le rendu au GPU sont actifs, j'ai des corruptions de bouts de mémoire qui s'accumulent progressivement. Le symptôme le plus flagrant c'est des parties de samples qui sont corrompus. D'autres parties de la mémoire finissent par être atteintes: au bout d'un moment je perds l'affichage (mais j'entends toujours les sons, avec les corruptions). Puis la Jaguar semble planter complètement. Une fois j'ai même eu un écran rouge.

Si je désactive le rendu au GPU, bon on voit pas grand chose évidemment mais les sons ne sont plus corrompus. La machine reste parfaitement stable.
Si je désactive le mixage des sons, évidemment on n'entend plus rien mais la machine reste également stable.

J'ai protégé toutes les lectures en mémoire externes avec des trucs du style:
load (r0),r1
or r1,r1

Un truc que j'ai pris du code source de Doom c'est la protection des store avec indexation:
or r1,rX
store r1,(r14+5)

Ces protections avaient aidées y'a quelques temps quand j'étais sur la partie 3D. Le clipping se mettait à déconner quand j'ai rajouté le son.
Avec les protections ça a cessé de déconner. Je pensais être tiré d'affaire mais non...

Là on dirait qu'il y a autre chose. Une sortie de conflit entre la lecture des sons et le rendu au GPU/Blitter. D'ailleurs j'ai essayé un rendu pur GPU ça fait pareil, c'est pas spécifiquement le Blitter qui pose problème.

Voilà, si y'a des gens motivés je peux partager le code source.
Je joins un binaire. Il suffit de rester sur l'écran de titre et en moins de 2 minutes on finit par entendre des bruits désagréables.

tromb Fichier joint : jag.zip

Ah oui j'oubliais: ça marche parfaitement bien dans l'émulateur Phoenix. Ca semble indiquer que c'est pas une bête histoire de pointeur qui se met à vadrouiller là où il devrait pas.