2013-02-04 66 views
7

針對D3D11_RESOURCE_MISC_GDI_COMPATIBLE創建的紋理,IDXGISurface1GetDC/ReleaseDC的線程安全規則是什麼?IDXGISurface1 GetDC/ReleaseDC的線程安全/同步規則?

我可以與另一個線程GetDCReleaseDC之間ID3D11DeviceID3D11DeviceContext互動,無需數據爭或因阻止隱式同步?或者我爲了避免GPU空閒,強制爲線程執行GDI渲染而創建單獨的D3D11Device,然後通過複製到D3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX將其轉移回「主」D3D11Device

即下列有效?

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. 

回答

1

以下兩個要點從MSDN似乎表明,這不僅是線程不安全的,但在設備的能力降低,而一個HDC是優秀的。

  • 您必須釋放設備(他們指的是HDC),並調用IDXGISurface1 :: ReleaseDC方法發出任何新的Direct3D命令之前。

  • 如果此方法已創建未完成的DC,則此方法失敗。

從DXGISurface獲取HDC固有地涉及曲面的父D3D11 DC。 D3D11 DC的多線程訪問也不受支持。從此MSDN頁面:如果多個線程必須訪問單個ID3D11DeviceContext,則它們必須使用某些同步機制(例如關鍵部分)來同步對該ID3D11DeviceContext的訪問。

我會嘗試按照您所述的方式在單獨的線程上準備GDI繪圖,但會將其呈現給系統內存緩衝區。然後只需將內容粘貼到DXGI表面。

另請注意,這些主題大多解決直接上下文的行爲,D3D11 Deferred Context可能會有不同的行爲。