오류 처리

사용자 모드 표시 드라이버가 구현하는 Direct3D 버전 10 함수 에는 일반적으로 반환 매개 변수 형식에 대한 VOID가 있습니다. 이 규칙의 주요 예외는 CalcPrivateObjTypeSize-type 함수(예: CalcPrivateResourceSize 함수)입니다. 이 형식의 함수는 ObjType 형식 만들기 함수(예: CreateResource(D3D10))를 통해 드라이버가 특정 개체 형식을 만드는 데 필요한 메모리 영역의 크기를 나타내는 SIZE_T 매개 변수 형식을 반환합니다.

VOID를 반환하면 사용자 모드 표시 드라이버가 기존의 방식으로 Direct3D 런타임에 오류를 알리지 않습니다(즉, 사용자 모드 표시 드라이버의 함수 반환 매개 변수를 통해). 대신 사용자 모드 표시 드라이버는 Direct3D 런타임의 pfnSetErrorCb 콜백 함수를 사용하여 이러한 정보를 런타임에 다시 전달해야 합니다. 런타임은 createDevice(D3D10) 함수 호출에서 D3D10DDIARG_CREATEDEVICE 구조체의 pUMCallbacks 멤버가 가리키는 D3D10DDI_CORELAYER_DEVICECALLBACKS 구조체의 pfnSetErrorCb에 대한 포인터를 제공합니다.

각 사용자 모드 표시 드라이버 함수에 대한 참조 페이지는 함수가 pfnSetErrorCb에 대한 호출을 통해 전달할 수 있는 오류를 지정합니다. 즉, 사용자 모드 표시 드라이버가 현재 사용자 모드 표시 드라이버 함수에 대해 허용되지 않는 오류 코드를 사용하여 pfnSetErrorCb 를 호출하는 경우 런타임은 오류 조건이 중요하다고 판단하고 적절하게 작동합니다. 런타임은 pfnSetErrorCb 중에 적절하게 작동하므로 pfnSetErrorCb( S_OK )와 같은 호출을 통해 pfnSetErrorCb( E_FAIL )를 호출하는 효과를 되돌릴 수 있을 것으로 예상해서는 안 됩니다. 실제로 런타임은 S_OK E_FAIL 유효하지 않거나 중요합니다. S_OK 반환 코드의 개념은 pfnSetErrorCb 를 전혀 호출하지 않는 사용자 모드 표시 드라이버 함수와 동일합니다.

Direct3D 런타임에서 오류 조건이 중요하다고 판단되면 먼저 기본 사후 분석(Just-In-Time) 디버거인 Watson 박사를 사용하여 오류를 로깅하여 조치를 취합니다. 그러면 런타임에서 의도적으로 디바이스가 손실되므로 D3DDDIERR_DEVICEREMOVED 오류 코드를 수신하는 시나리오를 에뮬레이트합니다. 드라이버가 pfnSetErrorCb 콜백 함수를 호출하도록 요구하면 드라이버에서 나오는 모든 오류에 관련된 유용한 호출 스택이 있을 확률이 훨씬 큽니다. 오류와 연결된 호출 스택을 사용하면 빠른 진단과 정확한 Dr. Watson 로그를 사용할 수 있습니다.

런타임에서 특정 드라이버 함수에 대해 허용하지 않는 오류 코드를 반환하는 것이 드라이버 버그 또는 문제로 런타임에 의해 결정되더라도 드라이버에서 문제가 발생할 경우 드라이버 코드에서 pfnSetErrorCb 를 사용해야 합니다. 사용자 모드 디스플레이 드라이버가 중요한 오류를 흡수하고 계속 진행하는 것은 더욱 악화될 수 있습니다. 사용자 모드 표시 드라이버는 사후 디버깅에 유용한 호출 스택을 제공하기 위해 가능한 한 오류 검색 지점에 가까운 pfnSetErrorCb 를 호출해야 합니다.

다음 표에서는 Direct3D 런타임이 특정 드라이버 함수에서 허용하는 오류 범주를 나열합니다.

오류 범주 의미

NoErrors

드라이버는 D3DDDIERR_DEVICEREMOVED 포함하여 오류가 발생하지 않아야 합니다. 런타임은 pfnSetErrorCb 에 대한 모든 호출이 중요하다고 결정합니다.

AllowDeviceRemoved

드라이버는 D3DDDIERR_DEVICEREMOVED 제외하고 오류가 발생하지 않아야 합니다. 런타임은 D3DDDIERR_DEVICEREMOVED 전달하지 않는 pfnSetErrorCb 에 대한 모든 호출이 중요하다고 결정합니다. 디바이스가 제거된 경우 드라이버는 DEVICEREMOVED를 반환할 필요가 없습니다. 그러나 런타임을 사용하면 DEVICEREMOVED가 일반적으로 발생하지 않아야 하는 드라이버 함수를 방해한 경우 드라이버가 DEVICEREMOVED를 반환할 수 있습니다.

AllowOutOfMemory

드라이버에 메모리가 부족할 수 있습니다. 따라서 드라이버는 pfnSetErrorCb를 통해 E_OUTOFMEMORY 전달하고 D3DDDIERR_DEVICEREMOVED 수 있습니다. 런타임은 다른 오류 코드가 중요한지 확인합니다.

AllowCounterCreationErrors

드라이버에 메모리가 부족할 수 있습니다. 또한 드라이버는 카운터의 배타적 특성으로 인해 카운터를 만들지 못할 수도 있습니다. 따라서 드라이버는 pfnSetErrorCb를 통해 E_OUTOFMEMORY, DXGI_DDI_ERR_NONEXCLUSIVE 및 D3DDDIERR_DEVICEREMOVED 전달할 수 있습니다. 런타임은 다른 오류 코드가 중요한지 확인합니다.

AllowMapErrors

드라이버는 리소스 경합을 위해 검사 합니다. 따라서 D3D10_DDI_MAP_FLAG_DONOTWAIT 플래그가 드라이버의 ResourceMap 함수에 전달된 경우 드라이버는 pfnSetErrorCb를 통해 DXGI_DDI_ERR_WASSTILLDRAWING 전달할 수 있습니다. 드라이버는 pfnSetErrorCb를 통해 D3DDDIERR_DEVICEREMOVED 전달할 수도 있습니다. 런타임은 다른 오류 코드가 중요한지 확인합니다.

AllowGetDataErrors

드라이버는 쿼리 완료를 위해 검사 합니다. 따라서 쿼리가 아직 완료되지 않은 경우 드라이버는 pfnSetErrorCb 를 통해 DXGI_DDI_ERR_WASSTILLDRAWING 전달할 수 있습니다. 드라이버는 pfnSetErrorCb를 통해 D3DDDIERR_DEVICEREMOVED 전달할 수도 있습니다. 런타임은 다른 오류 코드가 중요한지 확인합니다.

AllowWKCheckCounterErrors

드라이버의 CheckCounter 함수는 런타임 정의 카운터를 지원하는지 여부를 나타내야 합니다. 따라서 드라이버는 pfnSetErrorCb를 통해 DXGI_DDI_ERR_UNSUPPORTED 전달할 수 있습니다. 런타임은 다른 오류 코드가 중요한지 확인합니다.

드라이버는 검사 형식 함수에 대한 D3DDDIERR_DEVICEREMOVED 반환할 수 없습니다.

AllowDDCheckCounterErrors

드라이버는 카운터 ID가 범위 내에 있고 제공된 버퍼에 각 카운터 문자열을 복사할 충분한 공간이 있는지 확인하기 위해 디바이스 종속 카운터 식별자(카운터 ID)의 유효성을 검사해야 합니다. 이 방식으로 매개 변수가 올바르지 않으면 드라이버는 pfnSetErrorCb를 통해 E_INVALIDARG 전달할 수 있습니다.

드라이버는 검사 형식 함수에 대한 D3DDDIERR_DEVICEREMOVED 반환할 수 없습니다.