2016-05-04 38 views
5

Es ist mir nicht klar, wann es eine gute Idee ist, VK_IMAGE_LAYOUT_GENERAL zu verwenden, anstatt für jede Aktion, die ich gerade ausführen möchte, zum optimalen Layout überzugehen. Derzeit besteht meine Richtlinie darin, immer zum optimalen Layout überzugehen.Wann ist VK_IMAGE_LAYOUT_GENERAL zu verwenden?

Aber VK_IMAGE_LAYOUT_GENERAL existiert. Vielleicht sollte ich es verwenden, wenn ich nur für kurze Zeit ein bestimmtes Layout verwende.

Zum Beispiel schreibe ich gerade Code, um Mipmaps mit vkCmdBlitImage zu generieren. Wenn ich die Unterressourcen durchlaufen habe, die die vkCmdBlitImage-Befehle ausführen, sollte ich zu VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL übergehen, wenn ich in einen Mip heruntersklettere, dann zu VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL übergehen, wenn ich die Quelle für den nächsten Mip bin, bevor ich schließlich zu VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL übergehe alles erledigt? Es sieht so aus, als würde man viel übergehen, und vielleicht ist das Generieren der Mips in VK_IMAGE_LAYOUT_GENERAL besser.

Ich schätze die Antwort könnte sein zu messen, aber es ist schwer zu messen auf alle meine Ziel-GPUs (vor allem, weil ich noch nichts auf Android laufen habe), also wenn jemand eine anständige Faustregel hat, um es anzuwenden sehr geschätzt werden.

FWIW, Ich schreibe Vulkan-Code, der auf Desktop-GPUs und Android laufen wird, aber ich bin hauptsächlich besorgt über die Leistung auf dem letzteren.

Antwort

5

Sie würden es verwenden, wenn:

  1. Sie faul sind
  2. benötigen Sie den Speicher abzubilden Host (es sei denn, Sie vorinitialisierten verwenden)
  3. Wenn Sie das Bild als mehrere inkompatible Anhänge verwenden und Sie haben keine andere Wahl
  4. Für Shop Bilder

(5. Andere Fälle, wenn Sie Layouts zu viel wechseln würde (ein Sie brauchen nicht einmal Barrieren) relativ zu der Arbeit, die an den Bildern gemacht wird. Die zur Bestätigung von GENERAL erforderliche Messung ist in diesem Fall besser. Höchstwahrscheinlich eine vorzeitige Optimierung sogar dann. )

PS: Sie könnten alle mip-maps zusammen mit einem einzigen Befehl in TRANSFER_DST umwandeln und dann nur den, den Sie für SRC benötigen. Mit einer ordentlichen Festplatte sollte es sogar am besten sein, sie bereits mit Mip-Maps zu speichern, wenn das eine Option ist (und vielleicht sogar eine bessere Qualität mit einem ausgeklügelten Algorithmus hat).

PS2: Schade, es gibt keinen Mip-Map-Erstellungsbefehl. Die cmdBlit macht es wahrscheinlich unter der Haube für Bilder kleiner als halbe Auflösung ....

+0

Es ist wichtig zu beachten, dass solche Messungen an den entsprechenden Implementierungen vorgenommen werden müssen. IE: diejenigen, von denen bekannt ist, dass sie für Layouts empfindlich sind. –

+0

^Nun, das ist impliziert. Messungen sollten immer an der Maschine vorgenommen werden, auf der der Code ausgeführt werden soll. – krOoze

+0

Akzeptiert diese Antwort. Ich denke, Ihr Punkt über vorzeitige Optimierung ist wirklich der Kern der Sache. Ich nehme an, dass ich mir Sorgen machte, dass mein aktueller Ansatz, der möglicherweise Übergänge verwendet, eine vorschnelle Optimierung war, aber Sie argumentieren überzeugend, dass der Versuch, Übergänge zu vermeiden, die vorzeitige Optimierung in diesem Fall wäre. Ich werde weiterhin Übergänge zu optimalen Layouts verwenden, bis ich weit genug fortgeschritten bin, um auf der Zielhardware zu messen. – Columbo

2

Wenn Sie zum Erstellen des Mipmap [n + 1] -Bildes von mipmap [n] image lesen, sollten Sie die Transfer Image Flags verwenden, wenn Ihr Code in allen Vulkan-Implementierungen ausgeführt werden soll und die höchste Leistung in allen Implementierungen erhalten soll Die Flags können von der GPU verwendet werden, um das Bild für Lese- oder Schreibvorgänge zu optimieren.

Wenn Sie also herstellerübergreifend arbeiten möchten, verwenden Sie VK_IMAGE_LAYOUT_GENERAL, um den Deskriptor einzurichten, der das endgültige Image und nicht das Image liest oder schreibt.

Wenn Sie nicht so viele Übergänge verwenden möchten, können Sie aus einem Puffer anstelle eines Bildes kopieren, obwohl Sie natürlich nicht die Formatkonvertierung, Skalierung und Filterung erhalten würden, die vkCmdBlitImage für Sie kostenlos zur Verfügung stellt.

Vergessen Sie auch nicht zu überprüfen, ob das Zielformat tatsächlich die Bits BLIT_SRC oder BLIT_DST unterstützt. Dies ist unabhängig davon, ob Sie das Transfer- oder das allgemeine Layout für Kopien verwenden.