-2

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つの質問があります:

  1. ほぼ同一の 4 つのテスト ケースのうち 1 つだけで、WaitForSingleObject 関数によってアクセス違反が発生するのはなぜですか?
  2. RSSetScissorRects 関数と WaitForSingleObject 関数は互いにどのように関連していますか?
4

1 に答える 1