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/ )库/windows/desktop/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 并且反汇编显示??? 对于所有测试用例中句柄指向的内存。我的着色器不使用几何着色器。
所以现在我有两个问题:
- WaitForSingleObject 函数如何在几乎相同的 4 个测试用例中只有 1 个导致访问冲突?
- RSSetScissorRects 函数和 WaitForSingleObject 函数是如何相互关联的?