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