드라이버 내부 오류(Direct3D 9)

Direct3D 9에서 Direct3D를 사용하면 애플리케이션이 응답할 수 있도록 드라이버가 E_OUTOFMEMORY, D3DERR_OUTOFVIDEOMEMORY 및 D3DERR_UNSUPPORTEDCOLORARG 같은 오류 코드를 반환할 수 있습니다. 그러나 이러한 반환 형식을 생성한 API 호출이 명령 버퍼에 로드되고 GPU로 전송되도록 일괄 처리되는 경우가 있습니다(런타임 및 드라이버 최적화 제어 참조). 이 경우 작업을 수행해야 할 때 오류를 애플리케이션에 릴레이할 수 없으므로 런타임에서 오류 코드를 사용하고 디바이스 개체에 이 오류가 발생했음을 기록해 둡니다. 나중에 애플리케이션이 IDirect3DDevice9::P resent를 호출하면 IDirect3DDevice9::P resent 가 D3DERR_DRIVERINTERNALERROR 반환합니다. 이 때문에 IDirect3DDevice9::P resent 에서 D3DERR_DRIVERINTERNALERROR 수신할 때 애플리케이션에서 가장 좋은 방법은 디바이스를 삭제하고 다시 만드는 것입니다.

더 디버그하려는 경우 오류를 생성하는 API 호출을 파악하기 위한 몇 가지 제안 사항은 다음과 같습니다.

  • 가능한 반환 값 목록이 완료되지 않았기 때문에 다음과 같이 각 API 호출을 둘러싸고 실패하는 호출을 찾을 수 있습니다.

    TRACE ( "Calling DrawPrimitive" );
    d3ddev->DrawPrim(...);
    TRACE ( "done\n" );
    

    그러면 출력 디버그 스트림에 문제를 일으키는 호출이 표시됩니다.

  • 또한 디버깅을 위해 각 IDirect3DDevice9::D rawPrimitive 바로 앞에 IDirect3DDevice9::ValidateDevice를 호출하여 디바이스 드라이버에 추가 문제가 있는지 확인합니다(지원되지 않는 작업, 텍스처 형식의 사용할 수 없는 조합 등).

    참고

    IDirect3DDevice9::ValidateDevice 는 드라이버가 답변을 반환하기 위해 수행해야 하는 유효성 검사 작업의 양 때문에 신중하고 드물게 사용해야 합니다.

     

프로그래밍 팁