2017-06-21 11 views
1

Ich möchte den Inhalt eines sehr großen Speicherblocks in einen ausreichend großen GPU-Puffer übertragen und dann sofort den Inhalt des Speichers auf der CPU ändern. So etwas wie dies in Pseudo-Code:Wann gibt glBufferSubData zurück?

glBindBuffer(/*very_large_buffer*/); 
glBufferSubData(/*very_large_memory_chunk*/); 
memset(/*zeros*/, /*very_large_memory_chunk*/); 

In diesem Code Was bedeutet glBufferSubData eigentlich? Überträgt es very_large_memory_chunk irgendwo vor der Rückkehr oder plant nur die Übertragung für eine möglicherweise spätere Ausführung? Wenn ich den CPU-Puffer sofort ändere, ist es dann möglich, dass teilweise geänderter Speicher übertragen wird, was zu einem Müll in GPUs very_large_buffer führt?

Beachten Sie, dass ich nicht zum Rendern von Aufrufen frage. Ich weiß, dass, wenn der Puffer zum Rendern verwendet wird, Übertragungsoperationen warten, bis das Rendern abgeschlossen ist und umgekehrt. Ich möchte wissen, ob sich OpenGL bei CPU-zu-GPU-Transferoperationen ähnlich verhält.

Antwort

2

OpenGL definiert nicht, wie glBufferSubData implementiert werden muss: Es kann entweder die Daten sofort in den GPU-Speicher kopieren oder den Kopiervorgang auf einen späteren Zeitpunkt verschieben.

Was OpenGL garantiert (OpenGL 4.5 Spezifikation, Abschnitt 5.3) ist, dass man annehmen kann einen Aufruf an glBufferSubData abgeschlossen werden, wenn die Methode zurückgibt. Dies bedeutet, dass jede Implementierung, die den CPU-> GPU-Kopiervorgang vorschreibt, sicherstellen muss, dass der CPU-Speicher kopiert wird, bevor er zurückkehrt.

Fazit: Sie können den Inhalt des Zeigers sofort ändern, nachdem die glBufferSubData zurückgibt, ohne den Inhalt des Puffers zu ändern/zu zerstören.

Verwandte Themen