2013-02-04 55 views
7

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

は、私がデータ競合または暗黙的な同期のためにブロックすることなく、別のスレッドでGetDCReleaseDCID3D11DeviceID3D11DeviceContextと対話することができますか?または、GDIレンダリングを行っているスレッド用に個別のD3D11Deviceを作成し、次にD3D11_RESOURCE_MISC_SHARED_KEYED_MUTEXにコピーして「メイン」D3D11Deviceに転送するGPUアイドリングを回避するにはどうすればよいですか?

つまり、有効なのは以下のとおりですか?

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を参照している)、あなたはどんな新しいDirect3Dのコマンドを発行する前にIDXGISurface1 :: ReleaseDCのメソッドを呼び出す必要があります。

  • この方法で未処理のDCが既に作成されている場合、この方法は失敗します。

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

私はあなたが述べたように別々のスレッドでGDI図面を準備しようとしますが、システムメモリバッファに描画します。その後、内容をDXGIサーフェスにblitします。

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

関連する問題