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 位 成员的第一位(0x00000001)。

PermanentSysMem

[out]一个 UINT 值,该值指定是否应将分配的副本保留在系统内存中,即使内容位于内存段中。 默认情况下,在将分配传输到内存段时,surface 系统内存支持存储会丢失。 当指定 PermanentSysMem 标志并从内存段中逐出分配时,会丢弃分配的内容,如果分配不脏(也就是说,分配不是写入作的目标,因为它已分页)。

对分配 pfnLockCb 的调用始终返回分配的系统内存支持存储。 如果用户模式显示驱动程序调用 pfnUnlockCb,则分配的内存段资源将更新为新内容时的内存段资源。 此更新显示为显示微型端口驱动程序,作为常规分页作,通过 DxgkDdiBuildPagingBuffer 函数。 请注意,如果显示微型端口驱动程序需要最小区域大小或分页作的对齐方式,则此要求应反映在锁定的区域中。 当驱动程序 PermanentSysMem设置时,驱动程序还必须设置 CpuVisible 成员。 驱动程序不得在主图面上设置 PermanentSysMem

设置此成员等效于设置 32 位 成员的第二位(0x00000002)。

Cached

[out]一个 UINT 值,该值指定是否应将分配支持存储分配为缓存内存;默认情况下,分配支持存储以写入组合内存的形式存储。 当缓存内存分配用于不一致的段(例如内存段或 AGP 段)中时,视频内存管理器会在适当时间从处理器的缓存中刷新该分配内容来确保分配内容的一致性。

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

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

设置此成员相当于设置 32 位 成员(0x00000004)的第三位。

Protected

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

设置此成员相当于设置 32 位 成员的第四位(0x00000008)。

ExistingSysMem

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

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

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

驱动程序无法将 existingSysMem PermanentSysMemProtectedExistingKernelSysMem 成员结合使用来设置 ExistingSysMem。 驱动程序不得在主图面上设置 ExistingSysMem

设置此成员相当于设置 32 位 成员(0x00000010)的第五位。

ExistingKernelSysMem

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

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

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

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

设置此成员相当于设置 32 位 成员的第六位(0x00000020)。

FromEndOfSegment

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

设置此成员相当于设置 32 位 成员的第七位(0x00000040)。

Swizzled

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

设置此成员相当于设置 32 位 成员(0x00000080)的第八位。

Overlay

[out]一个 UINT 值,该值指定分配是否用于覆盖作。 覆盖分配固定在内存中,视频内存管理器无法逐出它们,除非超时检测和恢复(TDR)进程、即插即用(PnP)停止或 级别三级同步 发生。 请注意,在发生第三级同步之前,覆盖层通常会被销毁。 默认情况下,覆盖分配受到限制,不能占用超过最后 20% 的段。 如果在光圈段中分配覆盖分配,则显示微型端口驱动程序应将使用该光圈段作为逐出段的任何其他分配的大小限制为段大小的 80%。 显示微型端口驱动程序通过为分配的 EvictionSegmentSetDXGK_ALLOCATIONINFO 成员中的段指定适当的位来指示分配可以使用段进行逐出。 如果显示微型端口驱动程序没有限制另一个分配的大小,则视频内存管理器无法逐出通过段进行分配,因为固定的分配(即覆盖分配)占用逐出所需的区域。 在这种情况下,正在逐出的其他分配的内容将丢失,拥有丢失分配的应用程序无法再使用该分配呈现。

设置此成员相当于设置 32 位 成员的第九位(0x00000100)。

Capture

[out]一个 UINT 值,该值指定是否将分配用于捕获作。 捕获分配固定在内存中,类似于覆盖分配。 因此,应用于覆盖分配的问题也适用于捕获分配。 有关这些问题的详细信息,请参阅 覆盖 标志的说明。 请注意,在发生 级别三级同步 之前,捕获通常会停止。

设置此成员相当于设置 32 位 成员的第十位(0x00000200)。

UseAlternateVA

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

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

SynchronousPaging

[out]一个 UINT 值,该值指定是否应同步分页分配。 如果显示微型端口驱动程序为分配设置此位,则在视频内存管理器提交引用分配的分页缓冲区之前,视频内存管理器将等待,直到图形处理单元(GPU)报告引用分配的所有围栏。

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

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

LinkMirrored

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

设置此成员相当于设置 32 位 Value 成员(0x00001000)的第 32 位。

LinkInstanced

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

设置此成员相当于设置 32 位 成员(0x00002000)的第 14 位。

HistoryBuffer

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

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

设置此成员相当于设置 32 位 成员(0x00004000)的第 15 位。

从 Windows 8.1 开始支持。

AccessedPhysically

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

设置此成员相当于设置 32 位 成员(0x00008000)的第 16 位。

从 Windows 10 开始支持。

ExplicitResidencyNotification

指定此标志后,驱动程序会在分配驻留发生更改时收到 NotifyResidency 分页缓冲区作(已逐出、已提交)。 仅当设置了 AccessedPhysically 标志时,才能设置该标志。

设置此成员等效于设置 32 位 成员(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 位 成员中设置位,或者通过在 DXGK_ALLOCATIONINFOFLAGS 结构包含的联合中设置结构的各个成员来指定分配的属性。

要求

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

另请参阅

DXGK_ALLOCATIONINFO

DXGK_ALLOCATIONINFOFLAGS_WDDM2_0

DxgkDdiBuildPagingBuffer

pfnLockCb

pfnUnlockCb