2017-02-13 4 views
0

Ich schrieb Vulkan Code auf meinem Laptop, der funktionierte, und dann habe ich einen neuen Laptop und jetzt läuft es, bricht das Programm ab, da vkAllocateDescriptorSets() VK_OUT_OF_HOST_MEMORY zurückgibt.vkAllocateDescriptorSets gibt VK_OUT_OF_HOST_MEMORY zurück

Ich bezweifle, dass es tatsächlich nicht genügend Arbeitsspeicher ist, und ich weiß, dass es Speicher reservieren kann, da VkCreateInstance() nicht wie in diesem Stapelüberlaufposten fehlschlägt: Vulkan create instance VK_OUT_OF_HOST_MEMORY.

EDIT: Außerdem habe ich vergessen zu erwähnen, vkAllocateDescriptorSets() gibt nur VK_OUT_OF_HOST_MEMORY das zweite Mal, wenn ich es ausführen.

+0

Sie sollten eine [mcve] bereitstellen. –

Antwort

0

vkAllocateDescriptorSets weist Deskriptoren aus einem Pool zu. Während eine solche Zuordnung aufgrund eines fehlenden Host-/Gerätespeichers fehlschlagen kann, gibt es zwei andere Dinge, die Fehler verursachen könnten. Es kann einfach nicht genügend Speicher im Pool geben, um die Anzahl der angeforderten Deskriptoren/Sätze zuzuweisen. Oder es könnte genug Speicher vorhanden sein, aber wiederholte Zuweisungen/Deallokationen haben den Pool fragmentiert, so dass die Zuordnungen nicht vorgenommen werden können.

Der Fall, dass mehr Deskriptoren/Sets zugewiesen werden als verfügbar sind, sollte nie passieren. Immerhin, Sie wissen, wie viele Deskriptoren & setzt Sie in diesen Pool, so sollten Sie genau wissen, wann Sie ausgehen werden. Dies ist ein Fehlerzustand, den eine funktionierende Anwendung garantieren kann. Obwohl die Erweiterung VK_KHR_maintenance1 diesen Umstand unterstützt: VK_ERROR_OUT_OF_POOL_MEMORY_KHR.

Wenn Sie jedoch Ihre Pool-Erstellung in irgendeiner Weise vermasselt haben, erhalten Sie diese Möglichkeit. Da es keinen Fehlercode (außerhalb der Erweiterung) gibt, muss die Implementierung natürlich einen anderen Fehlercode bereitstellen: entweder die Erschöpfung des Hosts oder des Gerätes.

Aber auch dies ist ein Programmierfehler auf Ihrer Seite, nicht etwas, das Sie sollten immer mit Arbeits Code zu sehen erwarten. Insbesondere sollten Sie, auch wenn Sie diese Erweiterung anfordern, die Zuweisung aus einem Pool nicht fortsetzen, bis der Speicher nicht mehr verfügbar ist. Das ist nur eine schlechte Codierung.

Für den Fall der Fragmentierung haben sie einen Fehlercode: VK_ERROR_FRAGMENTED_POOL. Die Khronos-Gruppe hat jedoch versagt. Die ersten Versionen von Vulkan enthielten diesen Fehlercode nicht. Es wurde später hinzugefügt. Das bedeutet, dass Implementierungen vor dem Hinzufügen dieses Fehlercodes (und wahrscheinlich danach) einen ungeeigneten Fehlercode auswählen mussten, um ihn zurückzugeben. Wiederum entweder Host- oder Gerätespeicher.

Sie müssen also im Grunde jeden Fehler dieser Funktion entweder als Fragmentierung, Programmierfehler behandeln (dh: Sie haben nach mehr Zeug gefragt, als Sie in den Pool gelegt haben) oder etwas anderes. In allen Fällen können Sie zur Laufzeit nichts wiederherstellen.

Da es schien, einmal zu arbeiten, Chancen sind gut, dass Sie wahrscheinlich nur mehr Zeug zugeteilt als der Pool enthält. Sie sollten also sicherstellen, dass Sie genügend Material zum Pool hinzufügen, bevor Sie es zuweisen.

0

Das Problem war, dass ich nicht genügend Speicher im Pool zugewiesen hatte. Ich habe es gelöst, indem ich mehrere Pools erstellt habe. Eine für jeden Deskriptorsatz.