使用 ID3D10InfoQueue (Direct3D 10) 自定义调试输出

信息队列由接口管理, (请参阅存储、检索和筛选调试消息的 ID3D10InfoQueue 接口) 。 队列由消息队列、可选的存储筛选器堆栈和可选的检索筛选器堆栈组成。 存储筛选器堆栈可用于筛选要存储的消息;检索筛选器堆栈可用于筛选要存储的消息。 筛选消息后,消息将打印到调试窗口并存储在相应的堆栈中。

一般而言:

注册表控件

使用注册表项调整筛选器设置、调整断点以及将调试输出静音。 调试层将检查注册表项的这些路径;将使用找到的第一个路径。

  1. HKCU\Software\Microsoft\Direct3D\<user-defined 子项>
  2. HKLM\Software\Microsoft\Direct3D\<user-defined 子项>
  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 - 如果此键为非零,则调试输出为 ENABLED。 默认情况下,启用 InfoQueueStorageFilterOverride 时,具有严重性 INFO 的调试消息将被静音 ,因此对于此密钥,可以重新打开 INFO。

这些控件更改是记录还是显示消息;它们不会影响 API 是通过还是失败。

使用注册表项设置中断条件

可以使用以下注册表项强制应用程序中断消息。

EnableBreakOnMessage - 此密钥允许中断 (的消息,并导致 i 的 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 方法。 静音DebugOutput 可阻止将存储筛选器传递的消息发送到调试输出。

禁用调试层消息

可以通过使用 ID3D10InfoQueue::AddStorageFilterEntries 指定筛选器,在运行时单独禁用调试层消息或作为组禁用。 ID3D10InfoQueue::AddStorageFilterEntriespFilter 参数采用包含允许列表和拒绝列表的D3D10_INFO_QUEUE_FILTER结构。 允许列表和拒绝列表由 D3D10_INFO_QUEUE_FILTER_DESC 结构描述,这些结构允许按服务、严重性和单个消息 ID 指定筛选。

以下代码是设置 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 层

Direct3D 10) (API 功能