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個問題:
- 如何WaitForSingleObject函數導致訪問衝突中只有1 4幾乎相同的測試案例?
- RSSetScissorRects函數和WaitForSingleObject函數是如何相互關聯的?
Likeliest嫌疑人是'fenceEvent_'是NULL;你能檢查一下嗎? –
已經在Debugger中檢查過它,在兩種情況下都不爲null,但反彙編只給出了? ??作爲兩個測試用例的值。 – TioZ
請顯示一個MCVE –