2016-06-20 5 views
-2

WaitForSingleObject 함수가의 WaitForSingleObject는 RSSetScissorRects가 호출되는 경우 액세스 위반이 발생

예외 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 가지 테스트 케이스 중 하나에서만 발생합니다. 여기에 설명 된대로 구조화 된 paintEvent 루프에서 다음 함수에 대한 호출을 제거하면 액세스 위반이 사라집니다 (그러나 이미지가 뷰포트에 렌더링 됨). (https://msdn.microsoft.com/de-de/library/windows/desktop/dn903899%28v=vs.85%29.aspx)

VS2015를 사용하고 있으며 모든 테스트 케이스에서 디버거가 fenceEvent_ 변수를 NULL로 표시하지 않고 디스 어셈블리가 어떻게 표시합니까 ?? ?? 핸들이 모든 테스트 케이스에서 가리키는 메모리에 대해. 내 셰이더는 기하학 셰이더를 사용하지 않습니다.

그래서 지금은이 개 질문이 :

  1. 어떻게 할 만 한 4 중 거의 동일한 테스트 케이스에서 액세스 위반 WaitForSingleObject 함수 리드?
  2. RSSetScissorRects 함수와 WaitForSingleObject 함수는 서로 어떻게 관련되어 있습니까?
+0

'fenceEvent_'는 NULL입니다. 이것을 확인할 수 있습니까? –

+0

이미 디버거에서 확인했지만, 두 경우 모두 null이 아니지만 디스 어셈블리 만 제공합니까 ?? ?? 두 경우 모두 값으로 사용됩니다. – TioZ

+3

MCVE를 표시하십시오 –

답변

1

이제 오류가 발견되어 해결되었습니다. 실수로 상수 버퍼의 디스크립터 힙으로 텍스처 버퍼의 디스크립터 힙을 오버 라이딩했기 때문입니다. 그래서 draw 명령은 물론 상수 버퍼보다 ​​크기가 커서 세그먼테이션 오류가 발생하는 텍스처 버퍼에 액세스하려고했습니다. 가위 사각형을 설정하지 않으면 그리기 호출도 실행되지 않으므로 오류가 발생하지 않습니다.