WaitForSingleObject 関数により、次のエラーが発生します
DrawTexturedCube.exe の 0x00007FFA02794AD0 (d3d12warp.dll) でスローされる例外: 0xC0000005: アクセス違反の読み取り場所 0x0000000000000000
前のフレームが完了するのを待っている間。コードは、MSDN DirectX12 サンプル コード ( https://msdn.microsoft.com/en-us/library/windows/desktop/dn899189%28v=vs.85%29.aspx ) から取得されます。
void D3D12RenderSystem::waitForPreviousFrame() {
const UINT fence = fenceValue_;
ThrowIfFailed(commandQueue_->Signal(fence.Get(), fence));
fenceValue_++;
if (fence_->GetCompletedValue() < fence) {
ThrowIfFailed(fence_->SetEventOnCompletion(fence, fenceEvent_));
WaitForSingleObject(fenceEvent_, INFINITE);
}
frameIndex_ = swapChain_->GetCurrentBackBufferIndex();
}
このエラーは、4 つのテスト ケースのうちの 1 つでのみ発生します。ここで説明されているように構成されている paintEvent ループから次の関数への呼び出しを削除すると、アクセス違反は消えます (ただし、ビューポートにレンダリングされた画像も消えます) ( https://msdn.microsoft.com/de-de/ライブラリ/ウィンドウ/デスクトップ/dn903899%28v=vs.85%29.aspx )。
void D3D12CommandList::setScissorRect(const int width, const int height) {
D3D12_RECT rectScissor = { 0.0f, //top
0.0f, //left
static_cast<LONG>(width), //right
static_cast<LONG>(height)}; //bottom
commandList_->RSSetScissorRects(1, &rectScissor);
}
私は VS2015 を使用していますが、デバッガーはすべてのテスト ケースで fenceEvent_ 変数を NULL として表示せず、逆アセンブリで ?? と表示されます。?? すべてのテストケースでハンドルが指すメモリ。私のシェーダーはジオメトリ シェーダーを使用しません。
だから今私は2つの質問があります:
- ほぼ同一の 4 つのテスト ケースのうち 1 つだけで、WaitForSingleObject 関数によってアクセス違反が発生するのはなぜですか?
- RSSetScissorRects 関数と WaitForSingleObject 関数は互いにどのように関連していますか?