DXGK_ALLOCATIONINFOFLAGS_WDDM2_0 结构 (d3dkmddi.h)
DXGK_ALLOCATIONINFOFLAGS_WDDM2_0 结构标识分配的属性。
语法
typedef struct _DXGK_ALLOCATIONINFOFLAGS_WDDM2_0 {
union {
struct {
UINT CpuVisible : 1;
UINT PermanentSysMem : 1;
UINT Cached : 1;
UINT Protected : 1;
UINT ExistingSysMem : 1;
UINT ExistingKernelSysMem : 1;
UINT FromEndOfSegment : 1;
UINT DisableLargePageMapping : 1;
UINT Overlay : 1;
UINT Capture : 1;
UINT CreateInVpr : 1;
UINT Reserved00 : 1;
UINT DXGK_ALLOC_RESERVED17 : 1;
UINT Reserved02 : 1;
UINT MapApertureCpuVisible : 1;
UINT Reserved03 : 1;
UINT HistoryBuffer : 1;
UINT AccessedPhysically : 1;
UINT ExplicitResidencyNotification : 1;
UINT HardwareProtected : 1;
UINT CpuVisibleOnDemand : 1;
UINT DXGK_ALLOC_RESERVED16 : 1;
UINT DXGK_ALLOC_RESERVED15 : 1;
UINT DXGK_ALLOC_RESERVED14 : 1;
UINT DXGK_ALLOC_RESERVED13 : 1;
UINT DXGK_ALLOC_RESERVED12 : 1;
UINT DXGK_ALLOC_RESERVED11 : 1;
UINT DXGK_ALLOC_RESERVED10 : 1;
UINT DXGK_ALLOC_RESERVED9 : 1;
UINT DXGK_ALLOC_RESERVED4 : 1;
UINT DXGK_ALLOC_RESERVED3 : 1;
UINT DXGK_ALLOC_RESERVED2 : 1;
UINT DXGK_ALLOC_RESERVED1 : 1;
UINT DXGK_ALLOC_RESERVED0 : 1;
};
UINT Value;
};
} DXGK_ALLOCATIONINFOFLAGS_WDDM2_0;
成员
CpuVisible
[out]一个 UINT 值,该值指定分配是否由 CPU 直接访问。 显示微型端口驱动程序必须为用户模式显示驱动程序设置此标志,才能在分配中成功调用 pfnLockCb 函数。 如果未在分配上设置此标志, pfnLockCb 将返回错误。
请注意,只有创建共享分配的进程才能锁定该分配。
设置此成员等效于设置 32 位 Value 成员 (0x00000001) 的第一位。
PermanentSysMem
[out]一个 UINT 值,该值指定是否应将分配的副本保留在系统内存中,即使内容位于内存段中。 默认情况下,将分配传输到内存段时,Surface 系统内存后备存储会丢失。 指定 PermanentSysMem 标志并从内存段逐出分配时,如果分配未脏 (,则分配内容将被丢弃,并且不会分页,也就是说,分配不是写入操作的目标,因为它是在) 中分页的。
调用分配上的 pfnLockCb 始终返回分配的系统内存后备存储。 如果在用户模式显示驱动程序调用 pfnUnlockCb 时,分配位于内存段中,则分配的内存段资源将使用新内容更新。 对于显示微型端口驱动程序,此更新显示为通过 DxgkDdiBuildPagingBuffer 函数的常规分页操作。 请注意,如果显示微型端口驱动程序需要最小区域大小或分页操作对齐方式,则此要求应反映在正在锁定的区域。 当驱动程序设置 PermanentSysMem 时,驱动程序还必须设置 CpuVisible 成员。 驱动程序不得在主图面上设置 PermanentSysMem 。
设置此成员等效于设置 32 位 Value 成员 (0x00000002) 的第二位。
Cached
[out]一个 UINT 值,该值指定是否应将分配后备存储分配为缓存内存;默认情况下,分配后备存储存储作为写入组合内存存储。 在缓存一致 (段(例如,内存段或 AGP 段) )中使用缓存内存分配时,视频内存管理器通过在适当时间从处理器缓存中刷新该分配内容来确保分配内容的一致性。
当驱动程序设置 Cached 并同时设置 ExistingSysMem 或 ExistingKernelSysMem 成员时,驱动程序会向视频内存管理器指示现有内存已映射可缓存。 如果现有内存已映射可缓存,但驱动程序未能设置 Cached 成员,则视频内存管理器无法确保数据一致性,并且会发生损坏。 驱动程序应为要由应用程序或用户模式显示驱动程序读取的分配设置 Cached 成员。 驱动程序绝不应为只写分配设置 Cached 成员。
驱动程序设置此成员时,驱动程序还必须设置 CpuVisible 成员。 驱动程序不得在主图面上设置 缓存 。
设置此成员等效于设置 32 位 Value 成员 (0x00000004) 的第三位。
Protected
[out]一个 UINT 值,该值指定是否应在内核内存而不是用户地址空间中分配分配支持存储,以保护分配免受应用程序潜在的直接 CPU 访问。 驱动程序不能将此成员与 PermanentSysMem、 ExistingSysMem 或 ExistingKernelSysMem 成员结合使用设置。 驱动程序不得在主图面上设置 “受保护 ”。
设置此成员等效于设置 32 位 Value 成员 (0x00000008) 的第四位。
ExistingSysMem
[out]一个 UINT 值,该值指定视频内存管理器是否应将现有系统内存范围用作分配的后备存储。 对于分配大小,系统内存范围必须是当前进程的有效用户模式地址。 系统内存范围还必须是页对齐的,并且必须是大小为多个页的页。
如果系统内存范围是可缓存的虚拟地址,驱动程序应设置 Cached 成员以通知视频内存管理器,以确保分配的缓存一致性。 如果未指定 Cached 成员,则视频内存管理器将确定系统内存范围不可缓存、写入组合或可缓存;但是,在这种情况下,驱动程序要么确保缓存一致性,要么确定缓存一致性不是指定用法的问题。
请注意,这种类型的分配隐式具有与在其中设置 PermanentSysMem 成员的分配相同的锁语义。
驱动程序无法将 ExistingSysMem 与 PermanentSysMem、 Protected 或 ExistingKernelSysMem 成员结合使用。 驱动程序不得在主图面上设置 ExistingSysMem 。
设置此成员等效于设置 32 位 Value 成员 (0x00000010) 的第五位。
ExistingKernelSysMem
[out]一个 UINT 值,该值指定视频内存管理器是否应将现有系统内存范围用作分配的后备存储。 系统内存范围必须是有效的内核模式地址,该地址在页面上对齐,并且页面大小为 1 倍。
如果系统内存范围是可缓存的虚拟地址,驱动程序应设置 Cached 成员以通知视频内存管理器,以确保分配的缓存一致性。 如果未指定 Cached 成员,则视频内存管理器将确定系统内存范围不可缓存、写入组合或可缓存;但是,在这种情况下,驱动程序要么确保缓存一致性,要么确定缓存一致性不是指定用法的问题。
请注意,这种类型的分配隐式具有与在其中设置 PermanentSysMem 成员的分配相同的锁语义。
驱动程序无法将 ExistingKernelSysMem 与 PermanentSysMem、 Protected 或 ExistingSysMem 成员结合使用。 驱动程序不得在主图面上设置 ExistingKernelSysMem 。
设置此成员等效于设置 32 位 Value 成员 (0x00000020) 的第六位。
FromEndOfSegment
[out]一个 UINT 值,该值指定在分页期间是否应从段的末尾分配分配。 视频内存管理器扫描段地址空间,并从段末尾查找分配空间,而不是从段开头扫描 (这是) 的默认行为。 但是,提示和首选的段信息优先于此标志。
设置此成员等效于设置 32 位 Value 成员 (0x00000040) 的第七位。
DisableLargePageMapping
[out]一个 UINT 值,该值指定是否应禁用分配的大页映射。 从 WDDM2.1 开始,添加了对驱动程序的大型页面的支持。 转换虚拟地址时使用大页面,其中最低级别的页表将替换为与级别 0 页表相等的大页面。 此标志禁用该标记,并使用页表进行地址转换。
设置此成员等效于设置 32 位 Value 成员 (0x00000080) 的第 8 位。
Overlay
[out]一个 UINT 值,该值指定分配是否用于覆盖操作。 覆盖分配固定在内存中,视频内存管理器无法逐出这些分配,除非超时检测和恢复 (TDR) 进程、即插即用 (PnP) 停止或发生级别 3 同步。 请注意,在级别 3 同步发生之前,通常会销毁覆盖层。 默认情况下,覆盖分配是有限的,不能占用超过最后 20% 的段。 如果在光圈段中分配覆盖分配,则显示微型端口驱动程序应将使用该光圈段作为逐出段的任何其他分配的大小限制为段大小的 80%。 显示微型端口驱动程序指示分配可以通过为分配的 EvictionSegmentSet DXGK_ALLOCATIONINFO 成员的 EvictionSegmentSet 成员中的段指定适当的位来指示分配可以使用段进行逐出。 如果显示微型端口驱动程序未限制另一个分配的大小,则视频内存管理器无法通过段逐出该分配,因为固定分配 (即覆盖分配) 占用逐出所需的区域。 在这种情况下,正在逐出的其他分配的内容将丢失,并且拥有丢失的分配的应用程序无法再使用该分配呈现。
设置此成员等效于设置 32 位 Value 成员 (0x00000100) 的第 9 位。
Capture
[out]一个 UINT 值,该值指定是否将分配用于捕获操作。 捕获分配固定在内存中,类似于覆盖分配。 因此,应用于覆盖分配的问题也适用于捕获分配。 有关这些问题的详细信息,请参阅 覆盖 标志的说明。 请注意,在 级别 3 同步 发生之前,捕获通常会停止。
设置此成员等效于设置 32 位 Value 成员 (0x00000200) 的第 10 位。
CreateInVpr
[out]一个 UINT 值,该值指定是否应在视频保护范围内创建分配。 此成员用于硬件数字版权管理 (WDDM 版本 >= WDDM 2.1 中的 DRM) 。
设置此成员等效于设置 32 位 Value 成员 (0x00000400) 的第 11 位。
Reserved00
[in]对于早于 WDDM 2.1 的 WDDM 版本,此成员是保留的,应设置为零。
设置此成员等效于设置 32 位 Value 成员 (0x00000400) 的第 11 位。
DXGK_ALLOC_RESERVED17
[in]此成员为保留成员,应设置为零。
设置此成员等效于设置 32 位 Value 成员的第十二位 (0x00000800) 。
Reserved02
[in]此成员为保留成员,应设置为零。
设置此成员等效于设置 32 位 Value 成员 (0x00001000) 的第 13 位。
MapApertureCpuVisible
[in]设置后,指示驱动程序需要在 DxgkDdiBuildPagingBuffer 调用 期间访问内存,以执行DXGK_OPERATION_MAP_APERTURE_SEGMENT2 操作。 MapApertureCpuVisible 是 DxgkDdiBuildPagingBuffer 的 MapAperatureSegment2 功能的一部分,因此驱动程序必须设置 DXGK_VIDMMCAPS MapAperature2Supported 才能使用此字段。 如果未设置 MapAperature2Supported ,但驱动程序指定 MapApertureCpuVisible,则对 DxgkDdiCreateAllocation 的调用将失败。 有关详细信息 ,请参阅 IOMMU DMA 重新映射 。 从 Windows Server 2022 开始支持。
Reserved03
[in]此成员为保留成员,应设置为零。
HistoryBuffer
[out]一个 UINT 值,该值指定用户模式显示驱动程序是否分配历史记录缓冲区。 显示微型端口驱动程序必须设置此标志,以指示用户模式驱动程序可以管理历史记录缓冲区的创建和销毁。
当显示微型端口驱动程序设置 HistoryBuffer 时,它还必须设置 CpuVisible 标志。 如果驱动程序支持缓存一致的光圈段,则它还必须将 “缓存”设置为“缓存”,并且必须将所有其他成员设置为零。
设置此成员等效于设置 32 位 Value 成员 (0x00004000) 的第 15 位。
AccessedPhysically
内核模式驱动程序在分配上设置 标志,这些分配由其物理地址访问。 此类分配将从 GPU 内存段连续分配。 从系统内存中分配时,分配将不连续。
设置此成员等效于设置 32 位 Value 成员 (0x00008000) 的第 16 位。
ExplicitResidencyNotification
指定此标志后,当分配驻留更改 (逐出、提交) 时,驱动程序将收到 NotifyResidency 分页缓冲区操作。 仅当设置了 “访问”“物理” 标志时,才能设置标志。
设置此成员等效于设置 32 位 Value 成员 (0x00010000) 的第 17 位。
HardwareProtected
设置此成员后,分配将保存用于硬件 DRM 的内容。
CpuVisibleOnDemand
设置此成员后,视频内存管理器将在映射/锁定时尝试为分配分配虚拟地址。 这将导致分配没有永久虚拟地址,从而减少使用的虚拟地址空间量。 它的行为类似于 CpuVisible 标志,因为它是由 CPU 直接访问的分配,但它只是“按需”获取虚拟地址,而不是永久分配。
DXGK_ALLOC_RESERVED16
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED15
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED14
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED13
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED12
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED11
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED10
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED9
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED4
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED3
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED2
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED1
[in]此成员为保留成员,应设置为零。
DXGK_ALLOC_RESERVED0
[in]此成员为保留成员,应设置为零。
Value
[out] DXGK_ALLOCATIONINFOFLAGS_WDDM2_0 包含的联合中的成员可以包含标识分配属性的 32 位值。
注解
面向任何 WDDM 版本 >= WDDM 2.0 的显示微型端口驱动程序使用此结构为视频内存管理器指定这些标志。 面向早于 WDDM 2.0 的 WDDM 版本的驱动程序应使用 DXGK_ALLOCATIONINFOFLAGS。
可以通过在 32 位 Value 成员中设置位或在 DXGK_ALLOCATIONINFOFLAGS 结构包含的联合中设置结构的单个成员来指定分配的属性。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10 |
标头 | d3dkmddi.h (包括 D3dkmddi.h) |