2016-06-20 44 views
-2

WaitForSingleObject函數導致以下錯誤WaitForSingleObject的一個事件導致訪問衝突,如果RSSetScissorRects被稱爲

拋出異常的0x00007FFA02794AD0(d3d12warp.dll)在DrawTexturedCube.exe:0000005:訪問衝突讀取位置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循環中刪除了對以下函數的調用,則此訪問衝突消失(但呈現給視口的圖像也如此),此循環結構如此處所述(​​)。

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. 如何WaitForSingleObject函數導致訪問衝突中只有1 4幾乎相同的測試案例?
  2. RSSetScissorRects函數和WaitForSingleObject函數是如何相互關聯的?
+0

Likeliest嫌疑人是'fenceEvent_'是NULL;你能檢查一下嗎? –

+0

已經在Debugger中檢查過它,在兩種情況下都不爲null,但反彙編只給出了? ??作爲兩個測試用例的值。 – TioZ

+3

請顯示一個MCVE –

回答

1

好的,所以現在我找到了錯誤並修復了它。這是由於意外地用常量緩衝區的描述符堆覆蓋了紋理緩衝區的描述符堆。所以繪圖命令試圖訪問紋理緩衝區,這當然比常量緩衝區大,因此導致了分割錯誤。通過不設置剪刀矩形,也不執行繪製調用,因此沒有錯誤。