D3DDDICB_LOCKFLAGS 结构 (d3dukmdt.h)
D3DDDICB_LOCKFLAGS结构标识如何锁定分配。
语法
typedef struct _D3DDDICB_LOCKFLAGS {
union {
struct {
UINT ReadOnly : 1;
UINT WriteOnly : 1;
UINT DonotWait : 1;
UINT IgnoreSync : 1;
UINT LockEntire : 1;
UINT DonotEvict : 1;
UINT AcquireAperture : 1;
UINT Discard : 1;
UINT NoExistingReference : 1;
UINT UseAlternateVA : 1;
UINT IgnoreReadSync : 1;
UINT Reserved : 21;
};
UINT Value;
};
} D3DDDICB_LOCKFLAGS;
成员
ReadOnly
一个 UINT 值,该值指定是否只能从中读取锁定的分配。 设置此成员等效于设置 32 位 Value 成员 (0x00000001) 的第一位。
WriteOnly
一个 UINT 值,该值指定锁定的分配是否只能写入。 设置此成员等效于设置 32 位 Value 成员 (0x00000002) 的第二位。
DonotWait
一个 UINT 值,该值指定视频内存管理器是否应等待锁定分配。 如果设置了此成员,则内存管理器对 pfnLockCb 的调用失败,D3DERR_WASSTILLDRAWING如果图形硬件正在使用分配。
设置此成员等效于设置 32 位 Value 成员 (0x00000004) 的第三位。
IgnoreSync
一个 UINT 值,该值指定视频内存管理器是否应检查图形硬件是否正在使用分配。 如果设置了此成员,则内存管理器不应检查。
IgnoreSync 只能使用可放置在光圈段中的分配进行设置。 当图形适配器不支持缓存一致性时,不能使用重排分配或缓存分配来设置它。
设置此成员等效于设置 32 位 Value 成员 (0x00000008) 的第四位。
LockEntire
一个 UINT 值,该值指定是否锁定整个分配区域,而不仅仅是一个子区域。
设置此成员等效于设置 32 位 Value 成员 (0x00000010) 的第五位。
DonotEvict
一个 UINT 值,该值指定视频内存管理器是否应逐出分配,以便锁定成功。 如果设置了此成员,内存管理器不应逐出分配。 如果必须逐出分配来处理锁定请求,内存管理器将无法调用 pfnLockCb 并D3DERR_NOTAVAILABLE。 当所有去重光圈都用完时,可能需要逐出。
设置此成员等效于设置 32 位 Value 成员 (0x00000020) 的第六位。
AcquireAperture
一个 UINT 值,该值指定视频内存管理器是否应调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数,以便为分配设置一个不显眼的光圈。
在未设置 AcquireAperture 的情况下锁定的分配无法使用 AcquireAperture 集再次锁定。
如果分配只能位于光圈段中,则无法设置 AcquireAperture。
设置此成员等效于设置 32 位 Value 成员 (0x00000040) 的第七位。
Discard
一个 UINT 值,该值指定视频内存管理器是否可以重命名或多次缓冲分配。 有关重命名分配的详细信息,请参阅 请求重命名分配。
对于固定分配、主分配或共享分配,忽略放弃。
设置此成员等效于设置 32 位 Value 成员 (0x00000080) 的第 8 位。
NoExistingReference
一个 UINT 值,该值指定用户模式显示驱动程序当前是否未在其命令缓冲区中排队,以引用正在锁定的任何分配实例。 在视频内存管理器仅使用 Discard 标志失败锁定请求后,驱动程序应使用 NoExistingReference 成员,并在驱动程序将其当前命令缓冲区刷新到内核后使用。 驱动程序应结合使用 NoExistingReference 和 Discard。
设置此成员等效于设置 32 位 Value 成员 (0x00000100) 的第 9 位。
UseAlternateVA
一个 UINT 值,该值指定显示微型端口驱动程序是否可以锁定分配位于与分配的当前段位置不同的物理地址,或者与以前分配的内存占用量不同的物理地址。 指定此标志后,显示微型端口驱动程序可以在调用 DxgkDdiAcquireSwizzlingRange 函数) 中更新 DXGKARG_ACQUIRESWIZZLINGRANGE 结构的 RangeSize 和 CPUTranslatedAddress 成员,更新分配可通过 (访问的物理地址范围的基址和大小。 指定此标志后,视频内存管理器会尝试分配新的虚拟地址来处理锁定请求,而不是使用分配支持存储虚拟地址。 但是,如果视频内存管理器无法分配新的虚拟地址,则锁定请求将失败。
此标志还用于锁定当前位于非 AGP 光圈段中的重排或平铺分配。 在此类型的锁定中,视频内存管理器将备用虚拟地址映射到可以动态取消重排或直到动态显示的物理地址范围,然后将内存访问重定向到系统内存页。
当首次使用 UseAlternateVA 锁定分配时,视频内存管理器会创建备用虚拟地址,并在以下方案中释放虚拟地址:
- CPU 无法访问该分配,并且释放重排范围供另一个分配重复使用。
- CPU 无法访问分配,并且正在逐出。
- 正在销毁分配。
- 分配在锁定时被逐出后将分页。
不能在共享分配上使用 UseAlternateVA。
使用 UseAlternateVA 集锁定的分配不能再次锁定。
IgnoreReadSync
一个 UINT 值,该值指定视频内存管理器是否应仅等待挂起的图形处理单元 (GPU) 写入操作到分配完成。 如果设置了此成员,则内存管理器不需要等待 GPU 读取操作完成。 也就是说,只要最后一个 GPU 写入操作完成,锁就会返回,即使 GPU 可能仍在从分配中读取数据。
IgnoreReadSync 只能使用可放置在光圈段中的分配进行设置。 当图形适配器不支持缓存一致性时,不能使用重排分配或缓存分配来设置它。
设置此成员等效于设置 32 位 Value 成员 (0x00000400) 的第 11 位。
Reserved
此成员为保留成员,应设置为零。 将此成员设置为零等效于将 32 位 Value 成员的剩余 21 位 (0xFFFFF800) 设置为零。
Value
包含在 D3DDDICB_LOCKFLAGS 中的联合成员,可以保存一个标识如何锁定分配的 32 位值。
注解
使用 D3DDDICB_LOCKFLAGS 结构指定如何锁定分配时,必须遵守以下规则:
- 同时指定 ReadOnly 和 WriteOnly 成员无效。
- 如果使用 Discard 成员指定 IgnoreSync 成员,则不起作用。
- 如果使用 Discard 成员指定,则 DonotWait 成员不起作用。
- 同时指定 IgnoreSync 和 AcquireAperture 成员无效。
- 由于指定 UseAlternateVA 成员指示已获取光圈,因此还必须设置 AcquireAperture 成员。
- 无法锁定已停用或提供的分配。 另请参阅 请求重命名分配。
- 仅当分配是在 DXGK_ALLOCATIONINFOFLAGS 结构中设置 CpuVisible 成员创建的时,才能锁定该分配。
- 只有共享分配的所有者 (创建者) 才能锁定它,除非它是 GDI 非托管主分配。
- 必须先解锁已用重排范围锁定的分配,然后才能再次锁定。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows Vista 和更高版本的 Windows 操作系统中可用。 |
标头 | d3dukmdt.h (包括 D3dukmdt.h) |