Поделиться через


Настройка выходных данных отладки с помощью ID3D10InfoQueue (Direct3D 10)

Очередь сведений управляется интерфейсом (см. ИНТЕРФЕЙС ID3D10InfoQueue), который хранит, извлекает и фильтрует сообщения отладки. Очередь состоит из: очереди сообщений, необязательного стека фильтров хранилища и необязательного стека фильтров извлечения. Стек фильтров хранилища можно использовать для фильтрации нужных сообщений; стек фильтров извлечения можно использовать для фильтрации сообщений, которые вы хотите извлечь. После фильтрации сообщения сообщение будет напечатано в окне отладки и хранится в соответствующем стеке.

Вообще:

  • Вызвать ID3D10InfoQueue::AddApplicationMessage для создания пользовательских сообщений
  • Вызов ID3D10InfoQueue::GetMessage используется для получения сообщений, которые проходят через необязательный фильтр извлечения.

Элементы управления реестра

Используйте разделы реестра для настройки параметров фильтра, настройки точек останова и отключения выходных данных отладки. Уровень отладки будет проверять эти пути для разделов реестра, и будет использоваться первый найденный путь.

  1. HKCU\Software\Microsoft\Direct3D\ подраздел<, заданный пользователем,>
  2. HKLM\Software\Microsoft\Direct3D\<созданный пользователем подраздел>
  3. HKCU\Software\Microsoft\Direct3D

Где:

  • HKCU стоит для HKEY_CURRENT_USER, а HKLM — для HKEY_LOCAL_MACHINE.
  • <определяемого пользователем подключа> используется в качестве произвольного имени для хранения параметров отладки приложения.

Фильтрация отладочных сообщений с помощью ключей реестра

Если реестр содержит ключ InfoQueueStorageFilterOverride (и не равен нулю), сообщения (и выходные данные отладки) можно отфильтровать, добавив следующие элементы управления реестра.

  • DWORD Mute_CATEGORY_* — отладочные выходные данные, если этот ключ не равен нулю.
  • DWORD Mute_SEVERITY_* — отладочный вывод отключен, если этот ключ не равен нулю.
  • DWORD Mute_ID_* — имя или номер сообщения можно использовать для * (как описано ранее для BreakOn_ID_*). Выходные данные отладки отключены, если этот ключ не равен нулю.
  • DWORD Unmute_SEVERITY_INFO — отладочный вывод включен, если этот ключ не равен нулю. По умолчанию, когда включен InfoQueueStorageFilterOverride, отладочные сообщения с уровнем серьезности INFO отключаются - поэтому данный ключ позволяет снова включить INFO.

Эти элементы управления изменяют, записывается ли сообщение или отображается; они не влияют на прохождение или сбой API.

Настройка условий останова с помощью разделов реестра

Приложения могут быть вынуждены прерывать сообщение с помощью следующих разделов реестра.

EnableBreakOnMessage — этот ключ позволяет останавливать выполнение по сообщениям и приводит к игнорированию настроек SetBreakOnCategory()/SetBreakOnSeverity()/SetBreakOnID(). Сообщения для остановки определяются с помощью одного или нескольких значений BreakOn_*, указанных ниже.

  • BreakOn_CATEGORY_* — разрыв в любом сообщении, передаваемом через фильтры хранилища. * является одним из сообщений категории D3D10_MESSAGE_CATEGORY.
  • BreakOn_SEVERITY_* — остановка любого сообщения, проходящего через фильтры хранилища. * является одним из D3D10_MESSAGE_SEVERITY_ сообщений.
  • BreakOn_ID_*— разрыв в любом сообщении, передаваемом через фильтры хранилища. * является одним из D3D10_MESSAGE_ID_ сообщений или может быть числовым значением перечисления ошибок. Например, предположим, что сообщение с идентификатором "D3D10_MESSAGE_ID_HYPOTHETICAL" имело значение 123 в перечислении D3D10_MESSAGE_ID. В этом случае создание значения BreakOn_ID_HYPOTHETICAL=1 или BreakOn_ID_123=1 приведет к одному и тому же результату - прерывание произойдет при обнаружении сообщения с идентификатором D3D10_MESSAGE_ID_HYPOTHETICAL.

Отключение выходных данных отладки с помощью разделов реестра

Выходные данные отладки можно отключить с помощью ключа MuteDebugOutput. Наличие этого значения в реестре приводит к принудительному переопределению метода ID3D10InfoQueue::SetMuteDebugOutput в InfoQueue. MuteDebugOutput останавливает сообщения, которые проходят через фильтр хранилища, от перенаправления в выходные данные для отладки.

Отключение сообщений об уровне отладки

Сообщения слоя отладки можно отключить отдельно или как группу во время выполнения, указав фильтры с помощью ID3D10InfoQueue::AddStorageFilterEntries. Аргумент pFilter для ID3D10InfoQueue::AddStorageFilterEntries принимает структуру D3D10_INFO_QUEUE_FILTER, которая содержит список разрешённых элементов и список запрещённых элементов. Списки разрешений и запретов описываются структурами 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)