2016-04-01 14 views
16

In allen create info structs (vk*CreateInfo) in der neuen Vulkan API gibt es IMMER einen .sType Member. Warum ist das da, wenn der Wert nur eine Sache sein kann? Auch die Vulkan-Spezifikation ist sehr explizit, dass Sie nur vk*CreateInfo Strukturen als Parameter für ihre entsprechende vkCreate* Funktion verwenden können. Es scheint ein wenig überflüssig. Ich kann sehen, dass, wenn der Treiber diese Struktur direkt an die GPU übergibt, Sie diese benötigen (ich habe bemerkt, dass es immer das erste Mitglied ist). Aber das scheint eine wirklich schlechte Idee für die App zu sein, denn wenn der Treiber es tun würde, wären Apps viel weniger fehleranfällig, und das Voranstellen eines int an eine Struktur scheint nicht wie eine extrem rechenintensive Operation zu sein. Ich sehe einfach nicht, warum es existiert.Vulkan: Was ist der Punkt von sType in vk * CreateInfo-Strukturen?

TL; DR
        Warum die vk*CreateInfo structs haben das .sType Mitglied?

Antwort

23

So dass die API geändert werden kann, ohne Abwärtskompatibilität zu brechen.

Wenn Version 1.1 der Erweiterung von zum Beispiel Befehlspufferpools erweitern möchte, wie würde es das tun? Nun, sie könnten einen ganz neuen Einstiegspunkt hinzufügen: vkCreateCommandPool2. Aber diese Funktion hätte fast genau die gleiche Signatur wie vkCreateCommandPool; Der einzige Unterschied ist, dass sie verschiedene Strukturen annehmen.

Stattdessen müssen Sie lediglich eine Struktur VkCommandPoolCreateInfo2 deklarieren. Und dann deklarieren, dass vkCreateCommandPool eine nehmen kann. Wie würde die Implementierung sagen, welche Sie übergeben haben?

Da die ersten 4 Bytes einer solchen Struktur sType ist. Sie können diesen Wert testen. Wenn der Wert VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO ist, dann ist es die alte Struktur. Wenn es VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2 ist, dann ist es das neue.

Dies macht es auch für Erweiterungen einfacher, eine Struktur vollständig zu überschreiben. Das Feld pNext dient zum Erweitern einer API mit zusätzlichen Parametern. Mit sType kann eine Erweiterung bestehende Parameter ändern.

+0

Warum sollte eine hypothetische 1.1 SDK-Version nur die aktualisierte 'vkCreateCommandBufferPool()' Definition mit der aktualisierten Signatur enthalten? Die meisten Bibliotheken enthalten nicht alle Revisionen ihrer Strukturen aus dem gesamten Versionsverlauf. Warum sollte eine Bibliothek wie Vulkan das tun? Oder sind Bibliotheken wie diese einzigartig, weil eine Anwendung möglicherweise auf eine ältere Struktur zurückgreifen muss, abhängig von den Fähigkeiten der Hardware? – spaaarky21

+0

@ spaaarky21: Weil sie es versprochen haben. Die Spezifikation von Vulkan legt dar, wie Versionierung funktioniert. Es beschreibt, welche Änderungen für welche Art von Versionsänderungen vorgenommen werden. Geringfügige Versionsänderungen sind so spezifiziert, dass sie abwärtskompatibel zu allen niedrigeren Nebenversionen derselben Hauptversion sind. Wenn ich also Code gegen 1.0 schreibe, wird es bei einer 1.1 oder 1.2 Implementierung funktionieren. Aber es gibt keine Garantie, dass es auf 2.0 oder 3.0 funktioniert. –