Je suis assis avec une application OpenGL 3.2 dans Delphi 2009. Lorsque vous utilisez FastMM 4.97 avec FullDebugMode défini, les UBO ne reçoivent pas leurs données correctement. Avec FullDebugMode indéfini tout fonctionne comme un charme.OpenGL 3.2 dans Delphi 2009 en utilisant FastMM 4.97 problème avec les UBOs dans FullDebugMode
Exemple: Définition des dimensions de la fenêtre pointant vers deux champs d'entiers privés, FWidth et FHeight, dans notre classe de cadres de rendu. Cela fait maintenant quelques jours que j'arrache les cheveux à cette question et je ne sais vraiment pas comment procéder. Je ne m'attends pas à un support complet d'OpenGL ici mais j'espère que quelqu'un peut venir avec une suggestion basée sur des différences connues entre l'exécution de FullDebugMode et non.
Paramètres du projet:
[Compiling]
Optimization False
Stack frames True
Use debug .dcus True
[Linking]
Debug info True
Map file Detailed
OS est Windows 7 64 bits.
Édition: Trouvé! Il n'avait rien à voir avec OpenGL. Ailleurs dans notre base de code, une fonction a retourné un PAnsiChar en utilisant Result := @AnsiString(Object.Name)[1];
Cela fonctionnait normalement la plupart du temps puisque la mémoire était seulement libérée mais inchangée. Dans FullDebugMode, les données ont été remplacées par une séquence de 80 $ lorsqu'elles ont été libérées.
Les données envoyées à la mémoire videmo, FWidth dans mon exemple, sont définies sur la ligne avant l'appel de glBufferSubData. 'FWidth: = 400; glBufferSubData (GL_UNIFORM_BUFFER, VUniform.Offset, VUniform.Size, @FWidth); ' Une explication possible est que les données sont effacées par FastMM dans FullDebugMode entre mon paramétrage et le transfert d'OpenGL de la mémoire vers la mémoire vidéo. De même, lors de la vérification de la valeur téléchargée dans l'UBO à l'intérieur du fragment shader avec 'if (UViewDimensionX == 0)', elle est évaluée à true. Un entier rempli avec une séquence de 80 $ ne devrait pas être zéro. – DelphiDabber
Je n'ai regardé que le paramétrage des données dans le buffer côté GPU. Votre théorie avec la mémoire viciée semble plausible mais pour les parties du code où le tampon est lié et utilisé. Le comportement serait le même à l'intérieur du fragment shader pour les données incorrectes dans le tampon et un paramètre de tampon mal tourné. Je vais enquêter plus loin. – DelphiDabber