Supporto per l'individuazione delle versioni

Questa sezione si applica solo ai sistemi operativi Windows 7 e versioni successive.

Un driver di visualizzazione in modalità utente eseguito in Windows Vista e versioni successive e Windows Server 2008 e versioni successive deve non riuscire la creazione dell'adattatore, ovvero non è possibile eseguire una chiamata alla funzione OpenAdapter10 del driver, per le versioni DDI che il driver non supporta in modo esplicito.

Windows 7 consente alle applicazioni Direct3D di individuare le versioni DDI e le funzionalità hardware supportate in modo esplicito dal driver. Ciò migliora la verifica della versione. Windows 7 introduce nuove funzioni specifiche dell'adattatore per migliorare il controllo delle versioni e offrire la possibilità di ottimizzare l'inizializzazione di API e driver. È necessario implementare ed esportare la funzione OpenAdapter10_2 nel driver Direct3D versione 10.1, in modo che il runtime Direct3D possa chiamare le nuove funzioni specifiche dell'adattatore del driver. Se invece implementi OpenAdapter10 nel driver Direct3D versione 10.1, il driver può indicare solo se supporta una versione DDI passando o non eseguendo la chiamata a OpenAdapter10.

OpenAdapter10_2 restituisce una tabella delle funzioni specifiche dell'adattatore del driver nel membro pAdapterFuncs_2 della struttura D3D10DDIARG_OPENADAPTER . pAdapterFuncs_2 punta a una struttura D3D10_2DDI_ADAPTERFUNCS . Il runtime Direct3D chiama la funzione GetSupportedVersions specifica dell'adattatore del driver per eseguire una query per le versioni DDI e le funzionalità hardware supportate dal driver. GetSupportedVersions restituisce le versioni DDI e le funzionalità hardware in una matrice di valori a 64 bit. L'esempio di codice seguente mostra un'implementazione getSupportedVersions :

// Array of 64-bit values that are defined in D3d10umddi.h
const UINT64 c_aSupportedVersions[] = {
    D3D10_0_7_DDI_SUPPORTED, // 10.0 on Windows 7
    D3D10_0_DDI_SUPPORTED, // 10.0 on Windows Vista
 D3D10_1_x_DDI_SUPPORTED, // 10.1 with all extended 
                           // format support (but not
                           // Windows 7 scheduling)
};

HRESULT APIENTRY GetSupportedVersions(
                 D3D10DDI_HADAPTER hAdapter, 
                 __inout UINT32* puEntries,
 __out_ecount_opt( *puEntries ) 
 UINT64* pSupportedDDIInterfaceVersions)
)
{
    const UINT32 uEntries = ARRAYSIZE( c_aSupportedVersions );
    if (pSupportedDDIInterfaceVersions &&
        *puEntries < uEntries)
    {
        return HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
    }

    // Determine concise hardware support from kernel, cache with hAdapter.
    // pfnQueryAdapterInfoCb( hAdapter, ... )

    *puEntries = uEntries;
    if (pSupportedDDIInterfaceVersions)
    {
        UINT64* pCurEntry = pSupportedDDIInterfaceVersions;
        memcpy( pCurEntry, c_aSupportedVersions, sizeof( c_aSupportedVersions ) );
        pCurEntry += ARRAYSIZE( c_aSupportedVersions );
        assert( pCurEntry - pSupportedDDIInterfaceVersions == uEntries );
    }
    return S_OK;
}

Non è necessario un driver Direct3D versione 10.1 per verificare i valori passati ai membri Interface e Version di D3D10DDIARG_OPENADAPTER in una chiamata alla relativa funzione OpenAdapter10_2 anche se questi valori contengono informazioni sulla versione DDI con cui inizializzare il driver. Il driver può restituire le funzionalità hardware e della versione DDI tramite una chiamata alla relativa funzione GetSupportedVersions .

Il runtime Direct3D può passare valori ai membri Interface e Version di D3D10DDIARG_CREATEDEVICE in una chiamata alla funzione CreateDevice(D3D10) del driver diversi dai valori passati al runtime a OpenAdapter10_2; il runtime passa i valori ai membri Interface e Version di D3D10DDIARG_CREATEDEVICE basati sulla versione DDI e sulle informazioni sulle funzionalità hardware restituite dal driver al runtime. Il driver non è necessario per convalidare i valori passati ai membri Interface e Version di D3D10DDIARG_CREATEDEVICE perché il driver ha già indicato il supporto di questi valori tramite la relativa funzione GetSupportedVersions .

Se si esegue la conversione del driver da Direct3D versione 10.0 a Direct3D versione 10.1, è necessario convertire il driver in modo da monitorare solo i membridell'interfaccia e della versione passati a CreateDevice(D3D10) anziché OpenAdapter10_2. È consigliabile analizzare sia le implementazioni di funzioni CalcPrivateDeviceSize che CreateDevice(D3D10) nel driver convertito per assicurarsi che non ci siano presupposti sui valori nei membri dell'interfaccia e della versione per CreateDevice(D3D10) corrispondenti ai valori nei membri dell'interfaccia e della versione per OpenAdapter10_2.

Si notiOpenAdapter10_2 ha la stessa firma della funzione di OpenAdapter10 , ovvero PFND3D10DDI_OPENADAPTER definita nell'intestazione D3d10umddi.h . È possibile implementare entrambe le funzioni nella stessa DLL del driver di visualizzazione in modalità utente.