WaitForSingleObject для события вызывает нарушение прав доступа, если вызывается RSSetScissorRects

Функция WaitForSingleObject вызывает следующую ошибку

Исключение, выданное в 0x00007FFA02794AD0 (d3d12warp.dll) в DrawTexturedCube.exe: 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();
}

Эта ошибка возникает только в 1 из 4 тестовых случаев. Нарушение доступа исчезает (как и изображение, отображаемое в окне просмотра), если я удалю вызов следующей функции из цикла paintEvent, который структурирован, как описано здесь (https://msdn.microsoft.com/de-de/library/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 во всех тестовых случаях, и разборка показывает ?? ?? для памяти, на которую указывает указатель во всех тестовых случаях. Мои шейдеры не используют геометрические шейдеры.

Итак, теперь у меня есть 2 вопроса:

  1. Как функция WaitForSingleObject может привести к нарушению доступа только в 1 из 4 почти идентичных тестовых случаев?
  2. Как функции RSSetScissorRects и функция WaitForSingleObject связаны друг с другом?

-2

Решение

Хорошо, теперь я нашел ошибку и исправил ее. Это произошло из-за случайного переопределения кучи дескриптора буфера текстур с помощью кучи дескриптора константного буфера. Таким образом, команда draw попыталась получить доступ к буферу текстуры, который, конечно, был больше, чем постоянный буфер, и поэтому привел к ошибке сегментации. Не устанавливая прямоугольник ножниц, также не выполнялся вызов отрисовки, поэтому нет ошибки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]