2016-08-09 53 views
2

vkMapMemory Zustände:Wie man `vkMapMemory` synchronisiert?

vkMapMemory prüft nicht, ob die Gerätespeicher derzeit im Einsatz ist, die Host-zugänglichen Zeiger vor der Rückkehr. Die Anwendung muss garantieren, dass alle zuvor übermittelten Befehle, die in diesen Bereich schreiben, abgeschlossen sind, bevor der Host diesen Bereich liest oder in diesen Bereich schreibt und dass alle zuvor übermittelten Befehle aus diesem Bereich abgeschlossen wurden, bevor der Host in diese Region schreibt

Es Links zu this site, die leider scheint noch nicht zu existieren. Ich frage mich, wie ich das synchronisieren würde?

Grundsätzlich muss ich über zwei Dinge Sorgen

  • Nur 1 Faden greift auf den gleichen Bereich bei gleichzeitig
  • Die GPU ist derzeit nicht den Bereich

Die lesen versuchen, Der einzige Weg, den ich sehe, um dies zu synchronisieren, ist eine Thread-Liste. Jedes Mal, wenn Sie in diesen Puffer schreiben/lesen wollen, müssen Sie den Speicherbereich hinzufügen, den Sie gerade lesen oder in diese Thread-Liste schreiben wollen.

Das bedeutet, wenn Sie auf diesen Puffer zugreifen möchten, müssen Sie diese Liste sperren und nach dem Bereich suchen, auf den Sie zugreifen möchten.

Ist das wie Sie synchronisieren würden vkMapMemory oder gibt es andere Möglichkeiten, dies zu tun?

Antwort

3

Die GPU versucht nur dann, auf den zugeordneten Speicher zuzugreifen, wenn ein Befehlspuffer, der auf diesen Speicher zugreift, übergeben wurde. Dieser Speicher wird solange verwendet, bis die zugehörige vkFence gemeldet wurde.

Eine allgemeine Lösung wäre, jeden Speicherzugriff durch die GPU zu verfolgen und jeden CPU zugeordneten Speicherzugriff mit einem Anfangs-/Endpaar zu umgeben, das auf den entsprechenden Zäunen wartet und flush/invalidate wie benötigt aufruft. Dies ist eine Menge Zustandsverfolgung und eine Fülle von potenziell blockierenden Anrufen.

Bei persistenten Mesh/Textur-Daten müssen Sie jedoch nur in einen Zwischenspeicher schreiben und dann in einen lokalen nicht-Host-sichtbaren Puffer des Geräts kopieren. Sie sollten dies nicht oft brauchen, also genügt ein einzelner Zaun, um zu verfolgen, ob eine Kopie davon im Flug ist. Oder für Daten, die nur für einen einzelnen Frame (pro Objekttransformationen) überleben müssen, können Sie einen Ringpuffer verwenden. Rücklesen des GPU-Okklusionstests oder Berechnen der Ergebnisse, Sie können einen Ringpuffer verwenden.

Ich hoffe, Sie können das Muster auftauchen sehen. Verwenden Sie nur ein paar gemappte Ring-Puffer und seien Sie sich sehr bewusst, wann sie von der GPU verwendet werden, und dann müssen Sie nur ein kleines Array von vkFence + Offset + Größe pro Ringpuffer aufbewahren, um sicherzustellen, dass kein Datenrisiko auftritt.