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

news/2025/3/6 14:13:06/

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;// InterfacesDXGKCBINT_FEATURE_NATIVEFENCE_1 NativeFenceInterface = {};// Interface queried valuesDXGKARGCB_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 interfaceDXGKARGCB_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);}
}

 


http://www.ppmy.cn/news/1577085.html

相关文章

美股回测:历史高频分钟数据的分享下载与策略解析20250305

美股回测:历史高频分钟数据的分享下载与策略解析20250305 在金融分析和投资决策的精细化过程中,美股历史分钟高频数据发挥着至关重要的作用。这些数据以其详尽性和精确性,记录了股票每分钟的价格波动和成交量变化,为投资者提供了…

复试准备日常

实验室目前投了 aiot 这周四 感知计算面试3.5号下午2点开始(面完了他问我有没有项目) 532图像处理实验室(我的项目大多也是图像处理的)(预计下周末)提前到3.4号下午6点 我不在第一批里面 软专不知道要几个 …

ctf网络安全大赛python

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 CTF网络安全大赛中的Python应用 CTF(Capture The Flag)网络安全大赛是一个在网络安全社区中广泛流行的竞赛形式。它通过各种挑战来检验参…

kubectl 运行脚本 kubernetes 部署springcloud微服务 yaml + Dockerfile+shell 脚本

Dockerfile文件编写 #基础镜像,如果本地仓库没有,会从远程仓库拉取 openjdk:8 FROM openjdk:8 #暴露端口 EXPOSE 9301 #容器中创建目录 RUN mkdir -p /usr/local/java #编译后的jar包copy到容器中创建到目录内 ../../realize-gateway COPY realize-auth.…

OpenWrt如何配置WireGuard互联?

我们之前介绍过如何部署OpenWrt(将OpenWrt部署在x86服务器上),也介绍过如何配置WireGuard(在Ubuntu快速配置WireGuard互联),那如何在OpenWrt上配置WireGuard呢?我们今天一块学习一下。 首先&…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好,如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码,点击S…

C# 牵手DeepSeek:打造本地AI超能力

一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…

K8s控制器Deployment详解

回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…