Condividi tramite


Superfici visualizzabili

Prima delle superfici visualizzabili, la presentazione è stata in genere eseguita creando una catena di scambio di buffer con proprietà identiche, che sono state quindi ciclizzate (capovolte) ripetutamente, per poter essere presentate allo schermo. Se si desidera modificare le proprietà di un buffer da presentare, è necessario eliminare la catena di scambio e crearne una nuova con tutti i buffer aggiornati alle stesse nuove proprietà.

La funzionalità superfici visualizzabili aggiunge un nuovo comportamento del sistema operativo che elimina tali restrizioni (ma richiede il supporto del driver per il comportamento corretto). In particolare, la funzionalità indica che i buffer presentati possono avere proprietà diverse e possono essere presenti in qualsiasi ordine.

Le funzionalità delle superfici visualizzabili e delle relative API sono state introdotte in Windows 11 (Build 10.0.22000.194). La funzionalità è abilitata nei driver supportati, a partire dai driver WDDM 3.0, abilitando scenari di presentazione avanzati per Direct3D 11.

Verificare il supporto e usare superfici visualizzabili

Per determinare se la funzionalità superfici visualizzabili è disponibile in un sistema, chiamare ID3D11Device::CheckFeatureSupport. Passare D3D11_FEATURE::D 3D11_FEATURE_DISPLAYABLE e ricevere una struttura D3D11_FEATURE_DATA_DISPLAYABLE.

L'API ID3D11Device::CreateTexture2D supporta D3D11_RESOURCE_MISC_FLAG::D 3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, che è possibile usare nel membro D3D11_TEXTURE2D_DESC::MiscFlags della struttura passata a CreateTexture2D nel parametro pDesc.

Le trame con D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE sono limitate a una dimensione di matrice pari a 1 e a 1 livello mip.

Quando si usa il flag D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE nella trama, è possibile visualizzare la trama in qualsiasi output attivo (inclusi più output contemporaneamente). A seconda dello scenario, la trama potrebbe finire per essere utilizzata dal compositor (DWM), analizzata o associata a varie parti della pipeline, potenzialmente tutte contemporaneamente. Ad esempio, una trama di acquisizione da una fotocamera potrebbe essere visualizzata su due schermi e un'anteprima di esso mostrata su un terzo display, tutti contemporaneamente, e tutti dalla stessa allocazione senza copie aggiuntive. Nel caso in cui una superficie visualizzabile venga analizzata su più schermi, il sistema operativo coordina la raccolta di capovolgimenti completati dagli output coinvolti prima di avvisare l'applicazione che la superficie viene rilasciata di nuovo. Non è richiesto alcun coordinamento del completamento dell'inversione dal driver.

Tali trame, come descritto in precedenza, devono essere visualizzate per l'uso flessibile della presentazione. Queste trame non sono necessarie per avere le stesse proprietà, ad esempio formati e dimensioni possono differire e queste trame devono essere visualizzate in ordine arbitrario ("presentazione non ordinata"). La presentazione verrà eseguita usando l'oggetto DDI Present1 esistente, con i relativi modelli di chiamata esistenti. Si consideri, ad esempio, un pool di sei buffer, tre che sono 720p (A, B e C) e tre che sono 4K (D, E e F): un ordine di presentazione valido potrebbe essere A-E-C-F-E-E-D-C>>>>>>>.

Formati

Il flag D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE è supportato per i formati seguenti in Direct3D 11:

Facoltativamente, un driver può supportare anche i formati seguenti:

  • DXGI_FORMAT_P010

È possibile usare l'esempio di codice seguente per verificare il supporto delle superfici visualizzabili per i formati facoltativi precedenti. L'esempio prevede la chiamata a ID3D11Device::CheckFeatureSupport e la verifica della presenza di 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
    }
}

Flag

I formati condivisibili supportano già i flag di associazione seguenti: D3D11_BIND_FLAG::D 3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET e D3D11_BIND_DECODER.

Gli utilizzi supportati esistenti delle risorse condivise con il flag D3D11_BIND_VIDEO_ENCODER vengono estesi per supportare anche l'aggiunta del flag D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE in questi casi. Vengono mantenute restrizioni esistenti correlate all'uso di risorse condivise con D3D11_BIND_VIDEO_ENCODER .

D3D11_BIND_VIDEO_ENCODER e D3D11_BIND_SHADER_RESOURCE in precedenza si escludono a vicenda, tranne quando vengono combinati con determinati altri flag di associazione. L'eccezione è stata estesa per consentire l'uso di D3D11_BIND_VIDEO_ENCODER e D3D11_BIND_SHADER_RESOURCE insieme quando viene usata D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .

Il flag D3D11_RESOURCE_MISC_HW_PROTECTED è supportato con il flag D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .