API-lager (Direct3D 10)

Direct3D 10-körningen är konstruerad med lager, som börjar med de grundläggande funktionerna i kärnan och skapar valfria och utvecklarhjälpsfunktioner i yttre lager.

Kärnskikt

Kärnskiktet finns som standard. ger en mycket tunn mappning mellan API:et och enhetsdrivrutinen, vilket minimerar omkostnaderna för högfrekventa anrop. Eftersom kärnskiktet är viktigt för prestanda utför det bara kritisk validering.

De återstående lagren är valfria. Som en allmän regel lägger lager till funktioner, men ändrar inte befintligt beteende. Kärnfunktioner har till exempel samma returvärden oberoende av felsökningsskiktet som instansieras, även om ytterligare felsökningsutdata kan tillhandahållas om felsökningsskiktet instansieras.

Skapa lager när en enhet skapas genom att anropa D3D10SkapaEnhet och ange ett eller flera D3D10_CREATE_DEVICE_FLAG värden.

Felsöka lager

Felsökningsskiktet ger omfattande ytterligare parameter- och konsekvensvalidering (till exempel validering av skuggningslänkning och resursbindning, validering av parameterkonsekvens och rapportering av felbeskrivningar). Utdata som genereras av felsökningsskiktet består av en kö med strängar som är tillgängliga med hjälp av ID3D10InfoQueue Interface (se Anpassa felsökningsutdata med ID3D10InfoQueue (Direct3D 10)). Fel som genereras av kärnskiktet markeras med varningar av felsökningsskiktet.

Om du vill skapa en enhet som stöder felsökningsskiktet måste du installera DirectX SDK (för att få D3D10SDKLayers.DLL) och sedan ange flaggan D3D10_CREATE_DEVICE_DEBUG när du anropar D3D10CreateDevice. Det går naturligtvis betydligt långsammare att köra ett program med felsökningsskiktet. Om du vill aktivera/inaktivera felsökningsmeddelanden för D3DX10-API:er anropar du D3DX10DebugMute.

När felsökningsskiktet visar minnesläckor visas en lista över objektgränssnittspekare tillsammans med deras egna namn. Standardnamnet är "<namnlös>". Du kan ange det egna namnet med hjälp av metoden ID3D10DeviceChild::SetPrivateData och WKPDID_D3DDebugObjectName GUID som finns i D3Dcommon.h. Om du till exempel vill namnge pTexture med SDKLayer-namnet mytexture.jpganvänder du följande kod:

const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );

Vanligtvis bör du kompilera dessa anrop från din produktionsversion.

Växla till referensskikt

Det här lagret gör det möjligt för ett program att övergå mellan en maskinvaruenhet (HAL) och en referens- eller programvaruenhet (REF). Om du vill växla en enhet måste du först skapa en enhet som stöder switch-to-reference-lagret (se D3D10CreateDevice) och sedan anropa ID3D10SwitchToRef::SetUseRef.

Alla enhetstillstånd, resurser och objekt underhålls via den här enhetsövergången. Ibland går det dock inte att exakt matcha resursdata. Detta beror på att viss information är tillgänglig för en maskinvaruenhet som inte är tillgänglig för en referensenhet.

Praktiskt taget alla realtidsprogram använder HAL-implementeringen av pipelinen. När pipelinen växlas från en maskinvaruenhet till en referensenhet utförs återgivningsåtgärder samtidigt i både maskinvara och programvara. När programvaruenheten återger krävs det att resurser laddas ned till systemminnet. Detta kan kräva att andra resurser som cachelagras i systemminnet avlägsnas för att göra plats.

Not

Den här switch-to-reference-layer-funktionen stöds endast i Direct3D 10 och Direct3D 10.1 och stöds inte längre i Direct3D 11- och senare versioner.

 

Thread-Safe lager

Det här lagret är utformat för att tillåta program med flera trådar att komma åt enheten från flera trådar.

Ett Direct3D 10-program kan styra en enhetssynkronisering med hjälp av enhetsfunktioner. På så sätt kan ett program aktivera/inaktivera kritiska avsnitt (tillfälligt aktivera/inaktivera flertrådsskydd) och ta/frigöra ett kritiskt avsnittslås över flera Direct3D 10 API-startpunkter. Det trådsäkra lagret är aktiverat som standard. För entrådade program har det trådsäkra lagret ingen inverkan på prestandan.

Skillnader mellan Direct3D 9 och Direct3D 10:

  • Till skillnad från Direct3D 9 är Direct3D 10 API:et som standard helt trådsäkert.

 

API-funktioner (Direct3D 10)