作者: BigLoser 访问次数: 1237 创建时间: 2020-10-20 18:59:16 更新时间: 2024-04-23 14:46:39
最后,您可以轻松地与自己的应用程序日志集成的D3D12消息!D3D12 InfoQueue消息回调功能使开发人员可以利用堆栈上下文捕获调试消息,从而为错误分析提供了另一个重要的调试工具。
迄今为止,D3D12具有ID3D12InfoQueue API。但是,开发人员始终希望有消息回调功能,该功能使他们可以更轻松地调查实时错误的调用堆栈,并使用定制的错误记帐和报告机制。
如果您从后来的Create *或Present调用中获取DXGI_ERROR_DEVICE_REMOVED HRESULT时感到沮丧,现在,当D3D12运行时看到设备移除事件时,您现在可以捕获它们。
好消息是,此功能现已在Windows 10 Release Preview版本20236中可用。让我们首先看一下API:
interface ID3D12InfoQueue1
: ID3D12InfoQueue
{
HRESULT RegisterMessageCallback(
D3D12MessageFunc CallbackFunc,
D3D12_MESSAGE_CALLBACK_FLAGS CallbackFilterFlags,
void* pContext,
DWORD *pCallbackCookie);
HRESULT UnregisterMessageCallback(
DWORD CallbackCookie);
}
typedef void (*D3D12MessageFunc)(
D3D12_MESSAGE_CATEGORY Category,
D3D12_MESSAGE_SEVERITY Severity,
D3D12_MESSAGE_ID ID,
LPCSTR pDescription,
void* pContext);
typedef enum D3D12_MESSAGE_CALLBACK_FLAGS
{
D3D12_MESSAGE_CALLBACK_FLAG_NONE = 0x00,
D3D12_MESSAGE_CALLBACK_IGNORE_FILTERS = 0x01,
} D3D12_MESSAGE_CALLBACK_FLAGS;
要使用消息回调功能,此操作非常简单,只需在要注册回调时调用RegisterMessageCallback,在不再需要回调时调用UnregisterMessageCallback。RegisterMessageCallback注册一个在生成调试消息时调用的回调,并且使用此方法,您可以创建自己的回调函数。此外,该函数还使用void * pContext作为输入,这意味着您现在可以将自己的数据放入回调函数中。此函数将回调cookie返回给您,您以后可以使用此cookie值注销不再需要的任何回调。
另外,我们将CallbackFilterFlags作为输入,以确保您具有最常用的两种情况。
1.如果您想在回调中使用自己的消息过滤机制,您可以将此值设置为D3D12_MESSAGE_CALLBACK_IGNORE_FILTERS,这将禁用消息筛选。
2.如果要以与作为调试文本记录的内容完全相同的方式过滤当前回调。您可以将此值设置为D3D12_MESSAGE_CALLBACK_FLAG_NONE。
值得一提的是消息回调支持多个回调,因为支持多个回调注册使进程中的D3D12组件能够处理消息,而不会破坏同一进程中任何其他D3D12组件注册的回调。并且如果多个回调处于活动状态,则将按照注册回调的顺序依次调用它们。
在使用此新API之前,需要注意几件事,因为此API确实有一些限制。最重要的是不要在回调中进行其他D3D调用。此限制仅记录在案,并且运行时未严格验证。回调可能在内部运行时处于不安全的状态下进行调用其他D3D调用,因此来自回调实现的任何D3D API调用都可能导致死锁和崩溃。还要注意的另一件事是,回调可能在最初发出API调用的线程之外的线程上执行,因此您需要确保您的回调可以正确处理此线程。
希望您会喜欢此功能!
语言: zh-CN
翻译人员:
原作者:
转载地址:
源网址: https://devblogs.microsoft.com/directx/d3d12-debug-layer-message-callback/
版权: 本站所有内容, 版权归原作者所有。发表原创内容将会获得现金奖励, 并且随着时间倍数增长, 请了解我们的内容奖励计划。