分享到: 分享到QQ  分享到Twitter

作者: 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调用的线程之外的线程上执行,因此您需要确保您的回调可以正确处理此线程。

 

希望您会喜欢此功能!

季度最有价值文章

月度最有价值文章

投票统计

是否原创: 0 %

0 % Complete (success)

是否有价值: 0 %

0% Complete

是否有素质: 0 %

0% Complete (warning)

是否合法: 0 %

0% Complete

   群组工具

   外部链接