DirectX11: dove avviene esattamente lo scambio di buffer nella "catena di scambio"?

4

Ho letto la teoria / il ragionamento dietro una catena di scambio in Graphics. Ovunque io abbia letto, parlano di puntatori sul fronte e sui backbuffer che vengono scambiati invece dello scambio di dati effettivo. La mia domanda è, dove possiamo vedere esattamente questo scambio? è in qualche funzione? è automatico? se è automatico, dove prendiamo il puntatore sull'altro buffer?

Se guardiamo questo codice da Rastertek per esempio, m_renderTargetView sembra puntare sempre allo stesso buffer durante l'esecuzione del codice:

result = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
if(FAILED(result))
{
    return false;
}

// Create the render target view with the back buffer pointer.
result = m_device->CreateRenderTargetView(backBufferPtr, NULL, &m_renderTargetView);
if(FAILED(result))
{
    return false;
}
backBufferPtr->Release();
backBufferPtr = 0;
    
posta Amit 20.10.2015 - 14:19
fonte

1 risposta

4

Quando si scambia con un dispositivo Direct3D 11, l'API presenta il contenuto del buffer corrente e internamente esegue il mapping nel buffer successivo come lo stesso slot, facendo sembrare che si lavori sempre con lo stesso buffer.

Da quello che ho visto su Direct3D 12, sembrano rimuovere questo shadowing e costringe lo sviluppatore a tenere traccia manualmente di quale risorsa è stata usata per presentare e quale è il target di rendering.

Direct3D 12 vieta l'utilizzo del solito DXGI_SWAP_EFFECT_DISCARD e DXGI_SWAP_EFFECT_SEQUENTIAL , invece di mandare DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL .

Citazione della pagina MSDN intitolata Miglioramenti di DXGI 1.4 :

Invariant Backbuffer Identity

In Direct3D 11, applications could call GetBuffer( 0, … ) only once. Every call to Present implicitly changed the resource identity of the returned interface. Direct3D 12 no longer supports that implicit resource identity change, due to the CPU overhead required and the flexible resource descriptor design. As a result, the application must manually call GetBuffer for every each buffer created with the swapchain. The application must manually render to the next buffer in the sequence after calling Present. Applications are encouraged to create a cache of descriptors for each buffer, instead of re-creating many objects each Present.

    
risposta data 20.10.2015 - 15:35
fonte

Leggi altre domande sui tag