DXGK_ALLOCATIONINFOFLAGS 结构 (d3dkmddi.h)

DXGK_ALLOCATIONINFOFLAGS 结构标识分配的属性。

语法

typedef struct _DXGK_ALLOCATIONINFOFLAGS {
  union {
    struct {
      UINT CpuVisible : 1;
      UINT PermanentSysMem : 1;
      UINT Cached : 1;
      UINT Protected : 1;
      UINT ExistingSysMem : 1;
      UINT ExistingKernelSysMem : 1;
      UINT FromEndOfSegment : 1;
      UINT Swizzled : 1;
      UINT Overlay : 1;
      UINT Capture : 1;
      UINT UseAlternateVA : 1;
      UINT SynchronousPaging : 1;
      UINT LinkMirrored : 1;
      UINT LinkInstanced : 1;
      UINT HistoryBuffer : 1;
      UINT AccessedPhysically : 1;
      UINT ExplicitResidencyNotification : 1;
      UINT HardwareProtected : 1;
      UINT CpuVisibleOnDemand : 1;
      UINT Reserved : 4;
      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;

成员

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 并设置 ExistingSysMemExistingKernelSysMem 成员时,驱动程序会向视频内存管理器指示现有内存已映射可缓存。 如果现有内存已映射可缓存,但驱动程序无法设置 Cached 成员,则视频内存管理器无法确保数据一致性,并发生损坏。 驱动程序应为要由应用程序或用户模式显示驱动程序读取的分配设置 Cached 成员。 驱动程序绝不应为只写分配设置 Cached 成员。

当驱动程序设置此成员时,驱动程序还必须设置 CpuVisible 成员。 驱动程序不得在主图面上设置 缓存

设置此成员等效于设置 32 位 Value 成员 (0x00000004) 的第三位。

Protected

[out]一个 UINT 值,该值指定是否应在内核内存而不是用户地址空间中分配分配后备存储,以防止应用程序进行潜在的直接 CPU 访问。 驱动程序无法将此成员与 PermanentSysMemExistingSysMemExistingKernelSysMem 成员结合使用。 驱动程序不得在主图面上设置 受保护

设置此成员等效于设置 32 位 Value 成员 (0x00000008) 的第四位。

ExistingSysMem

[out]一个 UINT 值,该值指定视频内存管理器是否应使用现有系统内存范围作为分配的后备存储。 对于分配大小的当前进程,系统内存范围必须是有效的用户模式地址。 系统内存范围还必须是页面对齐的,并且必须是大小为倍数的页。

如果系统内存范围是可缓存的虚拟地址,驱动程序应设置 Cached 成员以通知视频内存管理器,以确保分配的缓存一致性。 如果未指定 Cached 成员,则视频内存管理器将确定系统内存范围不可缓存、写入组合或可缓存;但是,在这种情况下,驱动程序要么确保缓存一致性,要么确定缓存一致性不是指定用法的问题。

请注意,这种类型的分配隐式具有与在其中设置 PermanentSysMem 成员的分配相同的锁语义。

驱动程序不能将 ExistingSysMemPermanentSysMemProtectedExistingKernelSysMem 成员结合使用。 驱动程序不得在主图面上设置 ExistingSysMem

设置此成员等效于设置 32 位 Value 成员的第五位 (0x00000010) 。

ExistingKernelSysMem

[out]一个 UINT 值,该值指定视频内存管理器是否应使用现有系统内存范围作为分配的后备存储。 系统内存范围必须是有效的内核模式地址,该地址在页面上对齐,并且页面大小为倍数。

如果系统内存范围是可缓存的虚拟地址,驱动程序应设置 Cached 成员以通知视频内存管理器,以确保分配的缓存一致性。 如果未指定 Cached 成员,则视频内存管理器将确定系统内存范围不可缓存、写入组合或可缓存;但是,在这种情况下,驱动程序要么确保缓存一致性,要么确定缓存一致性不是指定用法的问题。

请注意,这种类型的分配隐式具有与在其中设置 PermanentSysMem 成员的分配相同的锁语义。

驱动程序无法将 ExistingKernelSysMemPermanentSysMemProtectedExistingSysMem 成员结合使用。 驱动程序不得在主图面上设置 ExistingKernelSysMem

设置此成员等效于设置 32 位 Value 成员 (0x00000020) 的第六位。

FromEndOfSegment

[out]一个 UINT 值,该值指定在分页期间是否应从段的末尾分配分配。 视频内存管理器扫描段地址空间,并从段末尾查找分配空间,而不是从段 (这是) 的默认行为。 但是,提示和首选的段信息优先于此标志。

设置此成员等效于设置 32 位 Value 成员 (0x00000040) 的第七位。

Swizzled

[out]一个 UINT 值,该值指定是否重排分配,并需要视频内存管理器的特殊支持来锁定分配。 有关重排分配的详细信息,请参阅 锁定重排分配

设置此成员等效于设置 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 位。

UseAlternateVA

[out]一个 UINT 值,该值指定是否可以锁定主分配。 UseAlternateVA 仅对主分配有效。 如果为任何其他分配指定 UseAlternateVA ,则不会创建分配。 使用 UseAlternateVA 创建主分配时,在创建分配时会设置主分配的重排范围。

设置此成员等效于设置 32 位 Value 成员 (0x00000400) 的第 11 位。

SynchronousPaging

[out]一个 UINT 值,该值指定是否应以同步方式分页分配。 如果显示微型端口驱动程序为分配设置此位,则视频内存管理器将等到分配不再繁忙 (也就是说,视频内存管理器将等到图形处理单元 (GPU) 报告所有引用分配) 的围栏,然后视频内存管理器才提交引用该分配的分页缓冲区。

同样,视频内存管理器将等待同步分配的分页操作完成,然后视频内存管理器允许驱动程序提交非分页直接内存访问 (DMA) 缓冲区。

设置此成员等效于设置 32 位 Value 成员 (0x00000800) 的第 12 位。

LinkMirrored

[out]一个 UINT 值,该值指定是否应跨逻辑适配器中的所有物理适配器复制分配的单个实例, (即链接) 。 视频内存管理器调用驱动程序来分页,并在系统内存中使用单个共享后备存储来逐出所有物理适配器上的分配。

设置此成员等效于设置 32 位 Value 成员 (0x00001000) 的第 13 位。

LinkInstanced

[out]一个 UINT 值,该值指定是否在逻辑适配器中的所有物理适配器 ((即链接) )中分页和逐出分配的不同实例。 逻辑适配器中每个物理适配器存在一个系统内存后备存储。

设置此成员等效于设置 32 位 Value 成员 (0x00002000) 的第 14 位。

HistoryBuffer

[out]一个 UINT 值,该值指定用户模式显示驱动程序是否分配历史记录缓冲区。 显示微型端口驱动程序必须设置此标志,以指示用户模式驱动程序可以管理历史记录缓冲区的创建和销毁。

当显示微型端口驱动程序设置 HistoryBuffer 时,它还必须设置 CpuVisible 标志。 如果驱动程序支持缓存一致光圈段,则还必须将 “缓存”设置为“已缓存”,并且必须将所有其他成员设置为零。

设置此成员等效于设置 32 位 Value 成员 (0x00004000) 的第 15 位。

从 Windows 8.1 开始支持。

AccessedPhysically

内核模式驱动程序在分配上设置 标志,这些分配由其物理地址访问。 此类分配将从 GPU 内存段连续分配。 从系统内存分配时,分配不会连续。

设置此成员等效于设置 32 位 Value 成员 (0x00008000) 的第 16 位。

从 Windows 10 开始支持。

ExplicitResidencyNotification

指定此标志后,当分配驻留更改 (逐出、提交) 时,驱动程序将收到 NotifyResidency 分页缓冲区操作。 仅当设置了 “访问”“物理” 标志时,才能设置标志。

设置此成员等效于设置 32 位 Value 成员 (0x00010000) 的第 17 位。

从 Windows 10 开始支持。

HardwareProtected

设置此成员后,分配将保存用于硬件数字权限管理的内容 (DRM) 。

CpuVisibleOnDemand

设置此成员后,视频内存管理器将在映射/锁定时尝试为分配分配虚拟地址。 这将导致分配没有永久虚拟地址,从而减少使用的虚拟地址空间量。 它的行为类似于 CpuVisible 标志,因为它是由 CPU 直接访问的分配,但它只是“按需”获取虚拟地址,而不是永久分配。

Reserved

预留给系统使用。 从Windows 10开始可用。

DXGK_ALLOC_RESERVED16

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED15

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED14

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED13

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED12

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED11

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED10

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED9

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED4

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED3

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED2

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED1

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

DXGK_ALLOC_RESERVED0

[in]此成员为保留成员,应设置为零。 支持从Windows 8开始。

Value

[out] DXGK_ALLOCATIONINFOFLAGS 包含的联合中的成员可以保存标识分配属性的 32 位值。

注解

面向 WDDM 2.0 之前的任何 WDDM 版本的显示微型端口驱动程序使用此结构为视频内存管理器指定这些标志。 面向 WDDM 版本 >= WDDM 2.0 的驱动程序应使用 DXGK_ALLOCATIONINFOFLAGS_WDDM2_0

可以通过在 32 位 Value 成员中设置位或在 DXGK_ALLOCATIONINFOFLAGS 结构包含的联合中设置结构的单个成员来指定分配的属性。

要求

要求
最低受支持的客户端 Windows Vista
标头 d3dkmddi.h (包括 D3dkmddi.h)

另请参阅

DXGK_ALLOCATIONINFO

DXGK_ALLOCATIONINFOFLAGS_WDDM2_0

DxgkDdiBuildPagingBuffer

pfnLockCb

pfnUnlockCb