2011-04-12 1 views
0

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.

Répondre

0

Vous recherchez probablement une mémoire qui a été libérée prématurément (par votre propre application).

Normalement, vous pouvez toujours accéder aux anciennes valeurs jusqu'à ce qu'elles soient remplacées par une nouvelle allocation + écritures. Cela pourrait très bien permettre à votre application de fonctionner correctement, même si vous accédez à des parties de mémoire obsolètes. Cependant, dans FullDebugMode, la mémoire désallouée est remplie avec une séquence octet 80 $. Vous pouvez facilement vérifier cela si vous connaissez l'appel exact de glBufferSubData qui casse, regardez simplement la mémoire à ce moment-là.

+0

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

+0

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

Questions connexes