2013-08-01 1 views
1

DirectX 11을 사용자 지정 위젯에 통합 한 QT 응용 프로그램에서 작업 중입니다. 이 응용 프로그램은 파일에서 읽는 데이터의 그래픽 표현 인 스크롤 표시를 렌더링합니다. 사용자는 스크롤 속도를 높이거나 낮출 수 있습니다.DirectX 11 드라이버의 원인을 확인하는 방법

대부분 큰 효과가 있습니다. DirectX 11 렌더링은 예상대로 내 맞춤 위젯에 제공됩니다. 문제는 그래픽 드라이버가 임의로 멈추고 프로그램이 중단된다는 것입니다. 나는 이것을 동일한 데이터 파일로 테스트했기 때문에 "임의"라고 말하기 때문에 파일의 같은 지점에서, 특정 시간이 지나면, 또는 특정 스크롤링 속도 (스크롤링 속도가 더 빠르다. 프레임 당 GPU가 더 많은 작업을 수행함).

응용 프로그램이 멈 추면 화면이 잠시 멈추고 검은 색으로 변한 다음 NVidia에서 드라이버 충돌로 인해 복구 된 멋진 메시지가 반환됩니다.

D3D11: Removing Device.

D3D11 ERROR: ID3D11Device::RemoveDevice: Device removal has been triggered for the following reason (DXGI_ERROR_DEVICE_HUNG: The Device took an unreasonable amount of time to execute its commands, or the hardware crashed/hung. As a result, the TDR (Timeout Detection and Recovery) mechanism has been triggered. The current Device Context was executing commands when the hang occurred. The application may want to respawn and fallback to less aggressive use of the display hardware). [ EXECUTION ERROR #378: DEVICE_REMOVAL_PROCESS_AT_FAULT]

나는 단순히 IDXGISwapChain1을 주석 : 현재 호출하여 응용 프로그램이 놀라운 속도의 파일을 통해 실행됩니다 것을 발견했다 : Visual Studio에서 디버그 출력에는 다음이 포함되어 있습니다. 그래픽 방식은 GPU에 데이터를 계속 밀어 넣고 대상을 렌더링하기 위해 그리기 때문에 내 창에 표시되지 않습니다.

내가 바라는 건 운전자가 어떤 종류의 물건을 떨어 뜨리는 지에 대한 아이디어입니다. 내 쉐이더는 매우 간단합니다. 기본적으로 프로젝션 매트릭스를 사용하여 꼭지점을 배치합니다. 그리고 위의 단락에서 설명한 것을 고려하면 Present가 호출되지 않아도 셰이더가 여전히 정점과 픽셀을 통해 크래킹해야합니다. 그렇습니까?

이것이 Qt와의 호환성 문제 일 수 있습니다. DirectX는 Qt에서 공식적으로 지원하지 않습니다. 그래서 CreateWindowEx를 사용하여 별도의 윈도우를 만들고 Custom Qt 위젯 대신 스왑 체인을 사용하려고했습니다. 그 창문으로 렌더링되었지만 이전처럼 드라이버를 매달았다.

내 랩톱에서 드라이버 버그가 의심 스러웠으므로 다른 DirectX 11 응용 프로그램 (non-Qt)이 문제없이 실행되는 비싼 데스크탑 PC에서 응용 프로그램을 실행 해 보았습니다 (다른 응용 프로그램 훨씬 더 복잡한 쉐이더를 사용하여 스크롤링 된 디스플레이의 비슷한 데이터). 하지만 내 QT 응용 프로그램은 해당 PC에도 드라이버를 걸어 놓습니다.

누구나 운전자가 멈추는 원인에 대한 자세한 설명을 알 수 있습니까?

제공 할 수있는 도움에 미리 감사드립니다.

업데이트 : 2013-08-01 17:16 CST 현재 스레드 동기화 문제를 조사 중이며이 문제는 범인이 될 수 있습니다. 내일 혼자서이 문제를 해결하면 내일 아침까지 계속됩니다.

+0

디버그 레이어가 켜져 있습니까? 참조 장치와 WARP를 사용하여이 두 장치에서 문제가 재현되는지 확인해 보셨습니까? –

+0

나는 고통스럽게 느린 REF 장치를 시험해 보았지만 그곳에는 여전히 문제가 발생했다. 내가 그 장치 유형에 익숙하다고 말하면서 경고하지 않으 셨습니다. –

+0

글쎄, 그것은 참조 장치에 응답하지 않으면 아마 어떤 장치에 끊어 질 것입니다. –

답변

2

오늘 일부 테스트를 마친 후 스레드 문제가있는 것으로 보입니다. 오늘 그래픽 충돌없이 여러 번 실행했습니다. 그래서 오늘 내 테스트 (또는 운이 좋지 않은, 오히려 - 이것이 하루나 이틀 만에 추악한 얼굴을 다시 보여 준다면)와 함께 행운을 얻지 않는 한 내 문제는 해결되어야합니다.

즉각적인 장치 컨텍스트가 스레드로부터 안전하지 않다는 것을 알고있었습니다. 하지만 지연된 컨텍스트를 사용하는 대신 중요한 섹션을 사용하여 스레드를 동기화하고 장치 컨텍스트의 사용을 조정했습니다. 다른 스레드가 장치 컨텍스트를 사용하는 동안 IDXGISwapChain1 :: Present를 호출하는 것이 안전하지 않다는 것을 내가 깨닫지 못했습니다. 의미가 있지만 장치 컨텍스트 자체에서 직접 호출되지 않기 때문에 간과 할 수 없습니다.나는 문자 그대로 내 Present() 호출을 몇 줄을 내 중요한 섹션 블록으로 옮겼습니다. 그 이후로는 나에게 충돌이 발생하지 않았습니다.

+0

+1 시간 동안 머리를 긁어 모으는데 +1 - 같은 문제, 배경 스레드가 텍스처를 불러 와서 컨텍스트를 동기화하고 있었지만'Present '호출도 보호해야한다는 필요성에 대해서도 몰랐습니다. 간단한 수정 및 많은 감사. 감사! –