2016-11-03 2 views
1

Ich wundere mich, warum wir normalerweise (von Vulkan Tutorial und Sascha Willems Beispiel) die Barriere an der Spitze der Pipeline.Barrier und Bild Übergang

Wenn ich argumentiere wie ein Produzent und Verbraucher (für Mipmap-Erstellung zum Beispiel), habe ich beide in src und dst Bühne die "Flagge" "TRANSFER_BIT". Also, wenn ich die gleiche Stufe für src und dst verwende, sollte die Schranke sofort passieren, was der gleiche Fall ist, wenn ich TOP_OF_PIPE Flag verwende?

Bin ich richtig?

+0

Es ist nicht klar, was mit der gleichen Stufe für src und dst zu tun hat, wie schnell die Barriere ausgeführt wird. Ich verstehe nicht, was Sie von den Pipeline-Barrieren von Vulkan verstehen. –

+0

Das Ziel der Stageflags bei Barrieren ist in erster Linie, eine Ausführungsabhängigkeit zwischen Benutzern einer Ressource sicherzustellen. –

+0

@NicolBolas krOoze erklärt mir mehr Details, was ich vorher nicht verstanden habe. Um einfach zu sein, verstehe ich nicht, warum Sascha Willems TOP_OF_PIPE für Layout-Übergang verwenden, wenn es Mipmaps generiert. Für mich sollte der "richtige Weg" sein, zu verwenden src = dst = TRANSFER_BIT ... Vielleicht vermisse ich einige Details über die "Maske" in der "vkImageMemoryBarrier" ... –

Antwort

2

Ich bin nicht sicher, ob ich die Frage verstehe, aber hoffentlich werde ich es erklären, Barrieren zu erklären.

src=TOP_OF_PIPE oder dst=BOTTOM_OF_PIPE eine nicht blockierende Barriere (effektiv nur die Hälfte einer Speicherabhängigkeit und keine Ausführungsabhängigkeit). Ist es das, was du mit der "sofort stattfindenden" Barriere meinst?

dst=TOP_OF_PIPE oder src=BOTTOM_OF_PIPE soll all-blockierende Barriere sein (zumindest sehe ich es oft in Beispielen und Tutorials). Ich bin nicht so klar darüber aus der Spezifikation (vor allem, wenn Memory Dependency muss auch da sein) und (oder |10 spezifische Stufen) scheinen ein besserer Ersatz zu sein.

(BTW habe ich über my peeve mit dieser API-Design geschrieben.)

Allgemeinen wie für Ausführungsabhängigkeit, was die Barrieren zu tun ist: sie sicher srcStage aller Befehle vor der Schranke aufgezeichnet machen wird, bevor dstStage irgend abgeschlossen der Befehle, die nach dem Start der Sperre aufgezeichnet wurden.
(Die oben genannten Sonderfällen sollte auch mit dieser Beschreibung übereinstimmen.)

Also, was gesagt wird, TOP_OF_PIPE nicht für TRANSFER wie ein geeigneter Ersatz scheint. Es würde entweder seine beabsichtigte Funktion überhaupt nicht erfüllen oder ineffizient sein (basierend auf den obigen Beschreibungen).

srcStage==dstStage hat keine besondere Bedeutung. Die Verwendung von TRANSFER in diesem Fall bedeutet TRANSFER Stufe der zuvor aufgezeichneten Befehle abgeschlossen vor TRANSFER Stufe der Befehle nach der Barriere aufgezeichnet.

+0

Also, so gehen, warum einige Beispiele (wie Sascha Willems) TOP_OF_PIPE verwenden und nicht übertragen? Ich habe einen src und dst Zugriff in Bildspeicherbarriere. Bedeutet das, dass selbst wenn die Übertragung nicht beendet ist, die wenigen, die übertragen werden, "sichtbar" sind? Aber in diesem Fall sollte der Code von Sascha falsch sein? Oder ich vermisse etwas? Empfehlen Sie für mipmap generation, src = dst = TRANSFER zu verwenden? –

+0

Faule Implementierung (Versuch einer verallgemeinerten All-Blocking-Barriere, die überall leicht wiederverwendet werden kann) und Trägheit (Viele frühe Beispiele hatten es so.). @SashaWillems hatte eines der ersten Beispiele und das kompletteste von ihnen (ich schwöre, der Typ ist eine Legion). Wenn Sie es in vielen Tutorials sehen, liegt es daran, dass sie sich immer noch von ihm inspirieren lassen. – krOoze

+0

Okay, danke, also ist es nur "lesbarer", dass er das tut, aber in "robuster Implementierung" sollte ich Übertragungsbit verwenden ?? –