Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(二)

GPU 和 CPU 之间的同步

CPU 必须执行 MonitoredValue 的更新,并读取 CurrentValue,以确保不会丢失正在进行的信号中断通知。

  • 当向系统中添加新的 CPU 等待程序时,或者如果现有的 CPU 等待程序失效时,OS 必须修改受监视的值。
  • OS 调用 DxgkDdiUpdateMonitoredValues,以通知 GPU 新的受监视值。
  • DxgkDdiUpdateMonitoredValue 在设备中断级别执行,因此与受监视的围栏信号中断服务例程 (ISR) 同步。
  • DxgkDdiUpdateMonitoredValue 必须保证,在它返回后,任何处理器核心读取的 CurrentValue 都是在观察到新的 MonitoredValue 后由 GPU CMP 写入的。
  • 从 DxgkDdiUpdateMonitoredValue 返回后,OS 将对 CurrentValue 进行重新采样,并满足被新的 CurrentValue 取消阻止的任何等待程序。

对于 CPU 来说,观察一个比 GPU 用来决定是否引发中断的 CurrentValue 更新的值是完全可以接受的。 这种情况偶尔会导致中断通知,但不会解除对任何等待程序的阻止。 无法接受的是,CPU 没有收到受监视的最新 CurrentValue 更新(即 CurrentValue>MonitoredValue)的中断通知。

查询 OS 中的本机围栏功能启用情况

驱动程序必须在驱动程序初始化期间查询操作系统中是否启用了本机围栏功能。从 WDDM 3.2 开始,OS 使用添加 的 IsFeatureEnabled 接口来控制是否启用了某些功能,包括本机围栏功能。

因此,KMD 必须实现 IsFeatureEnabled 接口。 KMD 的实现必须查询 OS 是否在DXGK_VIDSCHCAPS中播发本机围栏支持之前启用了DXGK_FEATURE_NATIVE_FENCE功能。 如果 KMD 在 OS 未启用该功能时播发本机围栏支持,OS 将失败适配器初始化。

用于查询本机围栏功能的 DDI 启用

KMD 引入了以下接口,用于查询 OS 是否启用了本机围栏功能:

  • DXGKCB_FEATURE_NATIVEFENCE_CAPS_1
  • DXGKARGCB_FEATURE_NATIVEFENCE_CAPS_1
  • DXGKCBINT_FEATURE_NATIVEFENCE_1

OS 实现了新增的 DXGKCB_FEATURE_NATIVEFENCE_CAPS_1 接口表,专用于 DXGK_FEATURE_NATIVE_FENCE 的版本 1。 KMD 必须查询此功能接口表以确定 OS 的功能。 在将来的 OS 版本中,OS 可能会引入此接口表的未来版本,详细说明对新功能的支持。

用于查询支持的示例驱动程序代码

以下示例代码演示如何使用DXGK_FEATURE_INTERFACE接口中的DXGK_FEATURE_NATIVE_FENCE功能来查询支持。

复制代码
DXGK_FEATURE_INTERFACE      FeatureInterface;

struct FEATURE_RESULT
{
    bool Enabled;
    DXGK_FEATURE_VERSION Version;
};

// Driver internal cache for state & version of queried features
struct FEATURE_STATE
{
    struct
    {
        UINT NativeFenceEnabled             : 1;
    };

    DXGK_FEATURE_VERSION NativeFenceVersion = 0;

    // Interfaces
    DXGKCBINT_FEATURE_NATIVEFENCE_1 NativeFenceInterface = {};

    // Interface queried values
    DXGKARGCB_FEATURE_NATIVEFENCE_CAPS_1 NativeFenceOSCaps1 = {};
};

// Helper function to query OS's feature enabled interface
FEATURE_RESULT IsFeatureEnabled(
    DXGK_FEATURE_ID FeatureId
    )
{
    FEATURE_RESULT Result = {};

    //
    // If the feature interface functionality is available (e.g. supported by the OS)
    //
    DXGKARGCB_ISFEATUREENABLED2 Args = {};
    Args.FeatureId = FeatureId;

    if(NT_SUCCESS(FeatureInterface.IsFeatureEnabled(DxgkInterface.DeviceHandle, &Args)))
    {
        Result.Enabled = Args.Result.Enabled;
        Result.Version = Args.Result.Version;
    }

    return Result;
}

// Actual code to query whether OS has enabled Native Fence support and corresponding OS caps
FEATURE_RESULT FeatureResult = IsFeatureEnabled(DXGK_FEATURE_NATIVE_FENCE);
FEATURE_STATE FeatureState = {};
FeatureState.NativeFenceEnabled = !!FeatureResult.Enabled;

if (FeatureResult.Enabled)
{
    // Query OS caps for native fence feature, using the feature interface
    DXGKARGCB_QUERYFEATUREINTERFACE QFIArgs = {};
    QFIArgs.FeatureId = DXGK_FEATURE_NATIVE_FENCE;
    QFIArgs.Interface = &FeatureState.NativeFenceInterface;
    QFIArgs.InterfaceSize = sizeof(FeatureState.NativeFenceInterface);
    QFIArgs.Version = FeatureResult.Version;

    Status = FeatureInterface.QueryFeatureInterface(DxgkInterface.DeviceHandle, &QFIArgs);
    if(NT_SUCCESS(Status))
    {
        FeatureState.NativeFenceVersion = FeatureResult.Version;
        Status = FeatureState.NativeFenceInterface.GetOSCaps(&FeatureState.NativeFenceOSCaps1);
        NT_ASSERT(NT_SUCCESS(Status));
    }
    else
    {
        // We should always succeed getting an interface from a successfully
        // negotiated feature + version.
        NT_ASSERT(FALSE);
    }
}
相关推荐
生而为虫1 小时前
Claude Code 最新版安装教程(Windows/Mac/Linux 全平台) 面向普通用户的 Claude Code 安装与模型接入指南
linux·windows·macos
DevilSeagull1 小时前
Windows 批处理 (Batch) 编程: 从入门到入土. (一) 基础概念与环境配置
开发语言·windows·后端·batch·语言
CyL_Cly2 小时前
Parsec(parsec安卓/windows/macos下载)
windows
XD7429716363 小时前
科技早报晚报|2026年5月2日:Spec 驱动开发、空口隔离交付与时序预测 Copilot,今天最值得跟进的 3 个机会
驱动开发·科技·copilot·开源项目·科技新闻·开发者工具
2601_958320573 小时前
【小白零基础上手 】钉钉内部机器人接入 OpenClaw 完整流程讲解(含安装包)
人工智能·windows·机器人·钉钉·open claw·open claw安装
love530love4 小时前
f2 项目(多平台的作品下载与接口数据处理)源码部署记录
人工智能·windows·f2
生而为虫4 小时前
在VScode中使用Claude Code agent并配置模型(仅mac电脑实际操作,windows电脑未实际操作如有问题可留言)
windows·vscode·macos
叶小鸡4 小时前
Java 篇-项目实战-天机学堂(从0到1)-day10
windows·microsoft
love530love5 小时前
如何在 Google Chrome 中强制开启 Gemini AI 侧边栏(完整图文教程)
前端·人工智能·chrome·windows
skilllite作者5 小时前
Zed 1.0 编辑器深度评测与实战指南
开发语言·人工智能·windows·python·编辑器·agi