Condividi tramite


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 che viene eseguito su Windows Vista e versioni successive e Windows Server 2008 e versioni successive deve fallire la creazione dell'adattatore (cioè non eseguire una chiamata alla funzione OpenAdapter10 del driver) per le versioni DDI che non sono esplicitamente supportate dal driver.

Windows 7 consente alle applicazioni Direct3D di individuare le versioni DDI e le funzionalità hardware supportate dal driver in modo esplicito. 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 riesce la chiamata a OpenAdapter10.

OpenAdapter10_2 restituisce una tabella delle funzioni specifiche per l'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 query sulle versioni DDI e sulle 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 illustra 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 funzionalità hardware e versione DDI tramite una chiamata alla funzione GetSupportedVersions .

Il runtime Direct3D può passare i valori ai membri Interface e Version di D3D10DDIARG_CREATEDEVICE in una chiamata alla funzione CreateDevice(D3D10) del driver che sono diversi dai valori che il runtime ha passato 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 che il GetSupportedVersions del driver ha restituito 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 membri dell'interfaccia e della versione passati a CreateDevice(D3D10) invece di OpenAdapter10_2. È consigliabile analizzare le implementazioni delle funzioni CalcPrivateDeviceSize e CreateDevice(D3D10) nel driver convertito per assicurarsi che non ci siano presupposti sui valori nei membri Interface e Version per CreateDevice(D3D10) corrispondenti ai valori nei membri Interface e Version per OpenAdapter10_2.

NotaOpenAdapter10_2 ha la stessa firma di 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.