2016-04-01 48 views
16

In tutte le strutture di creazione delle informazioni (vk*CreateInfo) nella nuova API Vulkan, c'è SEMPRE un membro .sType. Perché è lì se il valore può essere solo una cosa? Anche la specifica Vulkan è molto esplicita che è possibile utilizzare solo le strutture vk*CreateInfo come parametri per la corrispondente funzione vkCreate*. Sembra un po 'ridondante. Posso vedere che se il driver stava passando questa struttura direttamente alla GPU, potrebbe essere necessario averlo (ho notato che è sempre il primo membro). Ma questa sembra davvero una cattiva idea per l'app, perché se il driver lo facesse, le app sarebbero molto meno soggette a errori, e la preparazione di un int a una struct non sembra un'operazione estremamente inefficiente computazionale. Io proprio non vedo perché esiste.Vulkan: Qual è il punto di sType in vk * CreateInfo structs?

TL; DR
        Perché le vk*CreateInfo le strutture hanno il membro .sType?

risposta

23

In modo che l'API può essere modificata senza rompere la compatibilità all'indietro.

Se la versione 1.1 di Vulkan vuole espandersi sulla creazione di, ad esempio, buffer di comandi, come farebbe? Bene, potrebbero aggiungere un nuovo punto di accesso: vkCreateCommandPool2. Ma questa funzione avrebbe quasi la stessa identica firma di vkCreateCommandPool; l'unica differenza è che prendono diverse strutture pCreateInfo.

Quindi, invece, tutto ciò che dovete fare è dichiarare una struttura VkCommandPoolCreateInfo2. E quindi dichiarare che vkCreateCommandPool può prendere uno dei due. In che modo l'implementazione dirà a chi sei passato?

Perché i primi 4 byte di qualsiasi struttura di questo tipo sono sType. Possono testare quel valore. Se il valore è VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, allora è la vecchia struttura. Se è VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2, allora è il nuovo.

Ciò rende inoltre più semplice per le estensioni eseguire l'override di una struttura CreateInfo. Il campo pNext serve per convertire un'API con parametri aggiuntivi. Con sType, un'estensione può modificare i parametri esistenti.

+0

Perché un'ipotetica versione dell'SDK 1.1 non contiene solo la definizione aggiornata 'vkCreateCommandBufferPool()' con la firma aggiornata? La maggior parte delle librerie non contiene tutte le diverse revisioni delle loro strutture da tutta la loro cronologia delle versioni. Perché una biblioteca come Vulkan lo farebbe? Oppure le librerie sono così uniche perché un'applicazione potrebbe forse ricorrere a una struttura più vecchia a seconda delle capacità dell'hardware? – spaaarky21

+0

@ spaaarky21: Perché hanno promesso di non farlo. Le specifiche di Vulkan spiegano come funziona il controllo delle versioni. Spiega quali cambiamenti faranno per quale tipo di versione cambia. Le modifiche alle versioni minori sono specificate come retrocompatibili con tutte le versioni minori minori della stessa versione principale. Quindi se scrivo codice contro 1.0, funzionerà su un'implementazione 1.1 o 1.2. Ma non è garantito che funzioni su 2.0 o 3.0. –