7

IDXGISurface1 GetDC/ReleaseDCで作成されたテクスチャのスレッドセーフルールは何D3D11_RESOURCE_MISC_GDI_COMPATIBLEですか?

暗黙的な同期によるデータの競合やブロッキングなしに、別のスレッドとの間で、および別のスレッド上でID3D11Device対話ID3D11DeviceContextできGetDCますか?または、GPUアイドリングがGDIレンダリングを実行するスレッド用に別のスレッドを作成し、それを「メイン」にコピーして戻すことをReleaseDC回避するためですか?D3D11DeviceD3D11DeviceD3D11_RESOURCE_MISC_SHARED_KEYED_MUTEX

つまり、次は有効ですか?

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. 
4

1 に答える 1

1

次のMSDNの2つの箇条書きは、このスレッドが安全でないだけでなく、HDCが優れている間、デバイスの機能が低下していることを示唆しているようです。

  • 新しいDirect3Dコマンドを発行する前に、デバイスを解放し(HDCを参照しています)、IDXGISurface1::ReleaseDCメソッドを呼び出す必要があります。

  • このメソッドによって未処理のDCがすでに作成されている場合、このメソッドは失敗します。

DXGISurfaceからHDCを取得するには、本質的にサーフェスの親D3D11DCが必要です。D3D11DCのマルチスレッドアクセスもサポートされていません。このMSDNページから:複数のスレッドが単一のID3D11DeviceContextにアクセスする必要がある場合、そのID3D11DeviceContextへのアクセスを同期するには、クリティカルセクションなどの同期メカニズムを使用する必要があります。

あなたが述べたように、私は別のスレッドでGDI図面を準備しようとしますが、それをシステムメモリバッファにレンダリングします。次に、コンテンツをDXGIサーフェスにブリットします。

また、これらのトピックのほとんどが直接コンテキストの動作に対応していることにも注意してください。D3D11遅延コンテキストの動作は異なる場合があります。

于 2013-02-20T12:57:50.880 に答える