Visningsbara ytor
Före visningsbara ytor gjordes presentationen vanligtvis genom att skapa en växlingskedja med buffertar med identiska egenskaper, som sedan cyklades (vändes) genom upprepade gånger, för att presenteras på skärmen. Om du vill ändra egenskaperna för en buffert som ska visas måste du förstöra växlingskedjan och skapa en ny med alla buffertar uppdaterade till samma nya egenskaper.
Funktionen för visningsbara ytor lägger till ett nytt operativsystembeteende (OS) som eliminerar dessa begränsningar (men det kräver drivrutinsstöd för att fungera korrekt). Mer specifikt innebär funktionen att buffertar som presenteras kan ha varierande egenskaper och du kan presentera dem i valfri ordning.
Funktionerna för visningsbara ytor (och flexibel presentation) och deras API:er introducerades i Windows 11 (version 10.0.22000.194). Funktionen är aktiverad på drivrutiner som stöds, från och med WDDM 3.0-drivrutiner, vilket möjliggör förbättrade presentationsscenarier för Direct3D 11.
Sök efter stöd och använd visningsbara ytor
För att avgöra om funktionen för visningsbara ytor är tillgänglig i ett system anropar du ID3D11Enhet::CheckFeatureSupport. Skicka D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLEoch ta emot en D3D11_FEATURE_DATA_DISPLAYABLE struktur.
API:et ID3D11Device::CreateTexture2D stöder D3D11_RESOURCE_MISC_FLAG::D 3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, som du kan använda i D3D11_TEXTURE2D_DESC::MiscFlags medlem i den struktur som du skickar till CreateTexture2D- i parametern pDesc.
Texturer med D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE är begränsade till en matrisstorlek på 1 och till 1 mip-nivå.
När du använder flaggan D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE på strukturen kan du visa strukturen på alla aktiva utdata (inklusive flera utdata samtidigt). Beroende på scenariot kan strukturen förbrukas av compositorn (DWM), genomsöks eller bindas till olika delar av pipelinen – potentiellt alla samtidigt. Till exempel kan en bildstruktur från en kamera visas på två skärmar och en miniatyrbild av den visas på en tredje skärm, alla samtidigt – och alla från samma allokering utan ytterligare kopior. Om en visningsbar yta ska genomsökas på flera skärmar samordnar operativsystemet insamlingen av flip completes från de berörda utdata innan du varnar ditt program om att ytan släpps tillbaka till den – ingen samordning av flip-slutförande krävs från drivrutinen.
Om du vill visa en visningsbar textur på skärmen kan du använda api:et Composition Swapchain. Genom att använda visningsbara ytor i stället för oformaterade ytor kan systemet optimera presentationen i vissa situationer för att kringgå systemkompostatorn och genomsöka ytorna direkt, vilket minskar GPU/CPU-omkostnaderna samt den övergripande svarstiden. Detta liknar att använda DXGI-växlingskedjor med presentationslägena "flip". Mer information finns i För bästa prestanda kan du använda DXGI-vändmodell.
Sådana texturer enligt beskrivningen ovan måste vara visningsbara för flexibel presentation. Dessa texturer måste inte ha samma egenskaper, till exempel kan format och storlekar skilja sig åt, och dessa texturer måste kunna visas i godtycklig ordning ("out-of-order presentation"). Presentationen sker med hjälp av den befintliga Present1 DDI, med dess befintliga anropsmönster. Tänk dig till exempel en pool med sex buffertar, tre som är 720p (A, B och C) och tre som är 4K (D, E och F): en giltig presentationsordning kan vara A->E->C->B->F->E->D->C.
Format
Flaggan D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE stöds för följande format i Direct3D 11:
- DXGI_FORMAT::D XGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_NV12
- DXGI_FORMAT_YUY2
En drivrutin kan också ha stöd för följande format:
- DXGI_FORMAT_P010
Du kan använda följande kodexempel för att söka efter stöd för visningsbara ytor för de valfria formaten ovan. Exemplet omfattar att anropa ID3D11Enhet::CheckFeatureSupportoch söka efter D3D11_FEATURE_FORMAT_SUPPORT2.
D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport2;
FormatSupport2.InFormat = DXGI_FORMAT_P010;
if (SUCCEEDED (hr = GetDevice()->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport2, sizeof(FormatSupport2))))
{
if (FormatSupport2.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_DISPLAYABLE)
{
// optional displayable format is supported
}
}
Flaggor
Delningsbara format stöder redan i allmänhet följande bindningsflaggor: D3D11_BIND_FLAG::D 3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGEToch D3D11_BIND_DECODER.
Befintliga användningar som stöds av delade resurser med flaggan D3D11_BIND_VIDEO_ENCODER utökas för att även stödja den D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE flagga som läggs till i dessa fall. Befintliga begränsningar som rör användning av delade resurser med D3D11_BIND_VIDEO_ENCODER underhålls.
D3D11_BIND_VIDEO_ENCODER och D3D11_BIND_SHADER_RESOURCE var tidigare ömsesidigt uteslutande, förutom när de kombinerades med vissa andra bindningsflaggor. Undantaget har utökats så att D3D11_BIND_VIDEO_ENCODER och D3D11_BIND_SHADER_RESOURCE kan användas tillsammans när D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE används.
Flaggan D3D11_RESOURCE_MISC_HW_PROTECTED stöds med flaggan D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.
Relaterade ämnen
- Använd DXGI-vändmodell för bästa prestanda