使用 ID3D10InfoQueue (Direct3D 10) 自定义调试输出
信息队列由接口管理, (请参阅存储、检索和筛选调试消息的 ID3D10InfoQueue 接口) 。 队列由消息队列、可选的存储筛选器堆栈和可选的检索筛选器堆栈组成。 存储筛选器堆栈可用于筛选要存储的消息;检索筛选器堆栈可用于筛选要存储的消息。 筛选消息后,消息将打印到调试窗口并存储在相应的堆栈中。
一般而言:
- 调用 ID3D10InfoQueue::AddApplicationMessage 以生成用户定义的消息
- 调用 ID3D10InfoQueue::GetMessage 用于获取传递可选检索筛选器) 的消息 (。
注册表控件
使用注册表项调整筛选器设置、调整断点以及将调试输出静音。 调试层将检查注册表项的这些路径;将使用找到的第一个路径。
- HKCU\Software\Microsoft\Direct3D\<user-defined 子项>
- HKLM\Software\Microsoft\Direct3D\<user-defined 子项>
- 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::AddStorageFilterEntries 的 pFilter 参数采用包含允许列表和拒绝列表的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 );
相关主题