こんにちは。
DXライブラリを使用させていただくか検討している中で、テクスチャの読み込みの非同期読み込みに失敗することがあるバグを発見したので報告させていただきます。
症状
ログに「テクスチャに画像を転送するためのメモリの確保に失敗しました[Graphics_D3D11_BltBmpOrBaseImageToGraph3_NoMipMapBlt]」と表示され、テクスチャの読み込みに失敗することがある。
条件
1. Direct3D11を使用
2. テクスチャを非同期読み込みで読み込もうとする
3. テクスチャの非同期読み込み前に、Graphics_D3D11_GetD3DFormatColorData()を呼び出す関数をメインスレッドで呼ばない
原因
Graphics_D3D11_GetD3DFormatColorData()が未初期化の状態で複数スレッドから同時アクセスすると、初期化が複数回実行される。
またGraphics_D3D11_GetD3DFormatColorData()から返されるカラーフォーマット情報は、初期化中にアクセスすると内容が0クリアされているタイミングがある。
その結果、Graphics_D3D11_BltBmpOrBaseImageToGraph3_NoMipMapBlt()内のDestColor->PixelByteが0になる(DestColorが初期化される)タイミングでTempBufferPitchを計算すると0となる。
そのため、DXALLOC()で0バイトのメモリを確保することとなり、確保に失敗してエラーメッセージが表示される。
解決策
Graphics_D3D11_Device_Create()の最後に以下のコードを入れることで対処できることを確認
{
volatile COLORDATA *ColorData;
ColorData = Graphics_D3D11_GetD3DFormatColorData(GD3D11.Device.Caps.ScreenFormat);
}
備考
Direct3D9ではメインスレッドのGraphics_D3D9_Device_Create()内でGraphics_D3D9_GetD3DFormatColorData()を呼び出しているので、この症状は発生しない。