2013-02-04 23 views
7

Quali sono le regole di sicurezza del thread per IDXGISurface1GetDC/ReleaseDC per le trame create con D3D11_RESOURCE_MISC_GDI_COMPATIBLE?IDXGISurface1 regole di sicurezza del thread/sincronizzazione per GetDC/ReleaseDC?

Posso interagire con ID3D11Device e ID3D11DeviceContext tra GetDC e ReleaseDC su un altro thread, senza data-razze o bloccando causa sincronizzazione implicita? O sono al fine di evitare che la GPU inattiva venga forzata a creare un D3D11Device separato per il thread che esegue il rendering GDI e quindi lo trasferisce al "principale" D3D11Device copiando su un D3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX?

vale quanto segue?

thread 1: 

D3D11Device::CreateTexture2D // Create texture 1 

IDXGISurface1::GetDC // Get DC for texture 1 

... // Draw to texture1 using GDI 

IDXGISurtface1::ReleaseDC // Release DC for texture1 

thread 2: 

// Is this valid if thread 1 is drawing using GDI? 

D3D11DeviceContext::OMSetRenderTargets 

D3D11DeviceContext::Draw // Draw texture2. 

risposta

1

I seguenti due punti di pallottola da MSDN sembra suggerire che non solo è questa discussione non sicuro, ma c'è una riduzione della capacità del dispositivo, mentre un HDC è eccezionale.

  • È necessario rilasciare il dispositivo (che si riferiscono alla HDC) e chiamare il metodo IDXGISurface1 :: ReleaseDC prima di emettere nuovi comandi Direct3D.

  • Questo metodo ha esito negativo se un CC in sospeso è già stato creato con questo metodo.

Ottenere un HDC da DXGISurface coinvolge intrinsecamente la D3D11 DC della superficie. Anche l'accesso multi-thread di una D3D11 DC non è supportato. Da questa pagina MSDN: se più thread devono accedere a un singolo ID3D11DeviceContext, devono utilizzare un meccanismo di sincronizzazione, ad esempio sezioni critiche, per sincronizzare l'accesso a tale IDDDDeviceContext.

Vorrei provare a preparare il disegno GDI su un filetto separato come indicato, ma renderlo su un buffer di memoria di sistema. Quindi confondi semplicemente il contenuto sulla superficie DXGI.

Inoltre, la maggior parte di questi argomenti risolve il comportamento del contesto immediato, il D3D11 Deferred Context potrebbe avere un comportamento diverso.