ID3D10InfoQueue를 사용하여 디버그 출력 사용자 지정(Direct3D 10)

정보 큐는 디버그 메시지를 저장, 검색 및 필터링하는 인터페이스( ID3D10InfoQueue 인터페이스 참조)에 의해 관리됩니다. 큐는 메시지 큐, 선택적 스토리지 필터 스택 및 선택적 검색 필터 스택으로 구성됩니다. 스토리지 필터 스택을 사용하여 저장하려는 메시지를 필터링할 수 있습니다. 검색 필터 스택을 사용하여 저장하려는 메시지를 필터링할 수 있습니다. 메시지를 필터링하면 메시지가 디버그 창에 출력되고 적절한 스택에 저장됩니다.

일반적으로:

레지스트리 컨트롤

레지스트리 키를 사용하여 필터 설정을 조정하고 중단점을 조정하며 디버그 출력을 음소거합니다. 디버그 계층은 레지스트리 키에 대해 이러한 경로를 검사. 발견된 첫 번째 경로가 사용됩니다.

  1. HKCU\Software\Microsoft\Direct3D\<사용자 정의 하위 키>
  2. HKLM\Software\Microsoft\Direct3D\<사용자 정의 하위 키>
  3. HKCU\Software\Microsoft\Direct3D

위치:

  • HKCU는 HKEY_CURRENT_USER, HKLM은 HKEY_LOCAL_MACHINE 지지합니다.
  • <사용자 정의 하위 키> 는 애플리케이션에 대한 디버그 설정을 저장하는 임의의 이름입니다.

레지스트리 키를 사용하여 디버그 메시지 필터링

레지스트리에 InfoQueueStorageFilterOverride 키가 포함되어 있고 0이 아닌 경우 다음 레지스트리 컨트롤을 추가하여 메시지(및 디버그 출력)를 필터링할 수 있습니다.

  • DWORD Mute_CATEGORY_* - 이 키가 0이 아닌 경우 출력을 디버그합니다.
  • DWORD Mute_SEVERITY_* - 이 키가 0이 아닌 경우 디버그 출력을 사용할 수 없습니다.
  • DWORD Mute_ID_* - 메시지 이름 또는 번호는 *(앞에서 설명한 BreakOn_ID_*와 마찬가지로)에 사용할 수 있습니다. 이 키가 0이 아닌 경우 디버그 출력을 사용할 수 없습니다.
  • DWORD Unmute_SEVERITY_INFO - 이 키가 0이 아닌 경우 디버그 출력이 ENABLED입니다. 기본적으로 InfoQueueStorageFilterOverride를 사용하도록 설정하면 심각도 INFO가 있는 디버그 메시지가 음소거되므로 이 키를 사용하면 INFO를 다시 설정할 수 있습니다.

이러한 컨트롤은 메시지를 기록할지 표시할지 여부를 변경합니다. API가 통과하거나 실패하는지 여부는 영향을 미치지 않습니다.

레지스트리 키를 사용하여 중단 조건 설정

애플리케이션은 다음 레지스트리 키를 사용하여 메시지에서 강제로 중단될 수 있습니다.

EnableBreakOnMessage - 이 키를 사용하면 메시지를 끊을 수 있습니다(및 i's SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID() 설정이 무시됨). 중단할 실제 메시지는 아래에 정의된 하나 이상의 BreakOn_* 값을 사용하여 정의됩니다.

  • BreakOn_CATEGORY_* - 스토리지 필터를 통과하는 모든 메시지를 중단합니다. *는 D3D10_MESSAGE_CATEGORY 메시지 중 하나입니다.
  • BreakOn_SEVERITY_* - 스토리지 필터를 통과하는 모든 메시지를 중단합니다. *는 D3D10_MESSAGE_SEVERITY_ 메시지 중 하나입니다.
  • BreakOn_ID_* - 스토리지 필터를 통과하는 모든 메시지를 중단합니다. * 는 D3D10_MESSAGE_ID_ 메시지 중 하나이거나 오류 열거형의 숫자 값일 수 있습니다. 예를 들어 ID가 "D3D10_MESSAGE_ID_HYPOTHETICAL"인 메시지에 D3D10_MESSAGE_ID 열거형의 값이 123이라고 가정합니다. 이 경우 BreakOn_ID_HYPOTHETICAL=1 또는 BreakOn_ID_123=1 값을 만들면 모두 동일한 작업을 수행합니다. ID가 D3D10_MESSAGE_ID_HYPOTHETICAL 메시지가 발생하면 중단됩니다.

레지스트리 키를 사용하여 디버그 출력 음소거

MuteDebugOutput 키를 사용하여 디버그 출력을 음소거할 수 있습니다. 레지스트리에 이 값이 있으면 InfoQueue의 ID3D10InfoQueue::SetMuteDebugOutput 메서드를 강제로 재정의합니다. MuteDebugOutput은 스토리지 필터를 전달하는 메시지가 디버그 출력으로 전송되지 않도록 중지합니다.

디버그 계층 메시지 비활성화

ID3D10InfoQueue::AddStorageFilterEntries를 사용하여 필터를 지정하여 디버그 계층 메시지를 개별적으로 또는 런타임에 그룹으로 사용하지 않도록 설정할 수 있습니다. ID3D10InfoQueue::AddStorageFilterEntries에 대한 pFilter 인수는 허용 목록과 거부 목록을 포함하는 D3D10_INFO_QUEUE_FILTER 구조를 사용합니다. 허용 및 거부 목록은 필터링을 케이터링, 심각도 및 개별 메시지 ID로 지정할 수 있는 D3D10_INFO_QUEUE_FILTER_DESC 구조에 의해 설명됩니다.

다음 코드는 ID3D10InfoQueue 인터페이스 를 설정하여 D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL 메시지를 거부하는 예제입니다.

  //retrieve the ID3D10InfoQueue from a Direct3D device created with the D3D10_CREATE_DEVICE_DEBUG flag
  ID3D10InfoQueue * pInfoQueue;
    g_pd3dDevice->QueryInterface( __uuidof(ID3D10InfoQueue),  (void **)&pInfoQueue );
    
  //set up the list of messages to filter
    D3D10_MESSAGE_ID messageIDs [] = { D3D10_MESSAGE_ID_DEVICE_DRAW_INDEX_BUFFER_TOO_SMALL };
    
  //set the DenyList to use the list of messages
    D3D10_INFO_QUEUE_FILTER filter = { 0 };
    filter.DenyList.NumIDs = 1;
    filter.DenyList.pIDList = messageIDs;
    
  //apply the filter to the info queue
    pInfoQueue->AddStorageFilterEntries( &filter );  

API 계층

API 기능(Direct3D 10)