D3DKMT_CREATEALLOCATIONFLAGS 结构 (d3dkmthk.h)
D3DKMT_CREATEALLOCATIONFLAGS 是位字段的结构,指定如何在调用 D3DKMTCreateAllocation 函数时创建分配。
语法
typedef struct _D3DKMT_CREATEALLOCATIONFLAGS {
UINT CreateResource : 1;
UINT CreateShared : 1;
UINT NonSecure : 1;
UINT CreateProtected : 1;
UINT RestrictSharedAccess : 1;
UINT ExistingSysMem : 1;
UINT NtSecuritySharing : 1;
UINT ReadOnly : 1;
UINT CreateWriteCombined : 1;
UINT CreateCached : 1;
UINT SwapChainBackBuffer : 1;
UINT CrossAdapter : 1;
UINT OpenCrossAdapter : 1;
UINT PartialSharedCreation : 1;
UINT Zeroed : 1;
UINT WriteWatch : 1;
UINT StandardAllocation : 1;
UINT ExistingSection : 1;
UINT AllowNotZeroed : 1;
UINT PhysicallyContiguous : 1;
UINT NoKmdAccess : 1;
UINT SharedDisplayable : 1;
UINT NoImplicitSynchronization : 1;
#if ...
UINT Reserved : 9;
#elif
UINT Reserved : 10;
#elif
UINT Reserved : 11;
#elif
UINT Reserved : 13;
#elif
UINT Reserved : 14;
#elif
UINT Reserved : 16;
#elif
UINT Reserved : 21;
#else
UINT Reserved : 26;
#endif
} D3DKMT_CREATEALLOCATIONFLAGS;
成员
CreateResource
指定是否创建特定于设备的资源。 如果设置 CreateShared,还必须设置 CreateResource。
CreateShared
指定是否创建跨所有设备共享的资源。 如果设置 CreateShared,还必须设置 CreateResource。 有关使用 CreateShared 的详细信息,请参阅备注部分。
NonSecure
指定是否创建可由任何进程打开的分配。 如果设置了 NonSecure ,安全和非安全进程可以打开分配。
CreateProtected
此成员为保留成员,应设置为零。 从 Windows 7 开始受支持。
RestrictSharedAccess
指定是否创建在所有设备之间共享但有一些限制的资源。 从 Windows 7 开始受支持。
ExistingSysMem
此成员为保留成员,应设置为零。 从 Windows 7 开始受支持。 ExistingSysMem 的限制如下:
不能同时为同一分配设置 ExistingSystemMem 和 ExistingSection。 已设置 ExistingSysMem ,还必须设置 StandardAllocation 。
ExistingSysMem 必须正确对齐。 D3D 运行时提供给内核的现有系统内存缓冲区必须是页对齐且页大小的倍数,否则内核无法调用 D3DKMTCreateAllocation。
当内核创建D3DKMDT_STANDARDALLOCATION_GDISURFACE类型的标准分配时:
运行时提供现有系统缓冲区的大小。 使用此大小,内核使用以下 KMD 正确理解的参数创建 GDISURFACE 类型的标准分配:
D3DKMDT_GDISURFACEDATA::Width = Size of ExistingSysMem buffer D3DKMDT_GDISURFACEDATA::Height = 1 D3DKMDT_GDISURFACEDATA::Format = D3DDDIFMT_UNKNOWN D3DKMDT_GDISURFACEDATA::Type = D3DKMDT_GDISURFACE_TEXTURE_CROSSADAPTER
防止指向 MemRotated 的 DXGALLOCATION 的 ExistingSysMem 指针
内核必须防范用户模式锁定现有 DXGALLOCATION 并使用生成的 CPU 指针创建 ExistingSysMem 标准分配的情况。 如果MEM_ROTATE DXGALLOCATION VAD,则此情况无效,即如果分配可能位于 VRAM 中。 内核在使用 ExistingSysMem 调用创建标准分配中执行以下步骤:
- MemSecure ExistingSysMem 指针。
- VirtualQuery 内存。 如果属性包含MEM_ROTATE则调用失败。
- 仅当释放此分配以防止内存在内核后面更改时,才会释放 MemSecure。
NtSecuritySharing
指定分配是否与 NT 句柄共享,这意味着它没有对资源的全局 D3DKMT_HANDLE 内核模式句柄。
如果 NtSecuritySharing 设置为 1 (TRUE) :
- 分配是使用 D3DKMTShareObjects 函数共享的,但对资源没有全局 D3DKMT_HANDLE 句柄。
- CreateShared 必须设置为 1。
有关使用 NtSecuritySharing 的详细信息,请参阅备注部分。 从 Windows 8 开始受支持。
ReadOnly
指定是否只能从中读取分配。 从 Windows 8 开始受支持。
CreateWriteCombined
此成员为保留成员,应设置为零。 从 Windows 8 开始受支持。
CreateCached
此成员为保留成员,应设置为零。 从 Windows 8 开始受支持。
SwapChainBackBuffer
此成员为保留成员,应设置为零。 从 Windows 8 开始受支持。
CrossAdapter
如果已设置,则指示资源是共享 的跨适配器资源。
OpenCrossAdapter
如果已设置,则指示通过打开交叉适配器资源来创建资源。 从用户模式创建分配时,无法使用。 从 Windows 8.1 (WDDM 1.3) 开始受支持。
PartialSharedCreation
指定是否将分配创建为部分共享分配。 从 Windows 8.1 (WDDM 1.3) 开始受支持。
Zeroed
[out]使用零页完成分配时设置。 从 Windows 8 (WDDM 1.3) 开始受支持。
WriteWatch
[in]指示是否在启用写监视的情况下创建分配。 从 Windows 8.1 (WDDM 1.3) 开始受支持。
StandardAllocation
[in]设置后,指示 Dxgkrnl 使用 pStandardAllocation 而不是 pPrivateDriverData 创建标准分配。 如果设置了 StandardAllocation,则必须同时设置 ExistingSysMem 或 ExistingSection (但不能同时设置) 。 此外,创建 StandardAllocation 时,还必须设置 CreateShared 和 CrossAdapter 标志。 从 Windows 10 版本 1709 开始支持 (WDDM 2.3) 。
ExistingSection
[in]设置后,指示 Dxgkrnl 使用 hSection) (节句柄,而不是 (pSystemMem) 的系统内存指针。 不能同时为同一分配设置 ExistingSystemMem 和 ExistingSection。 如果已设置 ExistingSection ,还必须设置 StandardAllocation 。 从 Windows 10 版本 1709 开始支持 (WDDM 2.3) 。
AllowNotZeroed
[in]指示可以在不将页面归零的情况下创建分配。 从 Windows 10 版本 1903 开始支持 (WDDM 2.6) 。
PhysicallyContiguous
[in]指示分配必须在物理上是连续的。 从 Windows 10 版本 2004 开始支持 (WDDM 2.7) 。
NoKmdAccess
[in]指示 KMD 未收到有关分配的通知。 从 Windows 10 版本 2004 开始支持 (WDDM 2.7) 。
SharedDisplayable
指示分配是共享的可显示资源。 从 Windows 11 (WDDM 3.0) 开始受支持。
NoImplicitSynchronization
Reserved
从 Windows 8 开始受支持。
此成员为保留成员,应设置为零。
注解
必须先创建使用 D3DKMTShareObjects 函数共享的对象,并设置 NtSecuritySharing 标志值。 此标志值在 D3DKMT_CREATEALLOCATIONFLAGS、 D3DKMT_CREATEKEYEDMUTEX2_FLAGS和 D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS 结构中可用。
驱动程序应遵循以下有关 D3DKMT_CREATEALLOCATIONFLAGS 共享标志的准则:
- 如果未共享分配,请将 CreateShared 和 NtSecuritySharing 设置为 0。
- 如果分配与 D3DKMT_HANDLE 数据类型共享,请设置 CreateShared = 1 和 NtSecuritySharing = 0。
- 如果分配与 NT 句柄共享到进程 (,并且没有全局 D3DKMT_HANDLE 内核模式句柄到资源) ,请将 CreateShared = 1 和 NtSecuritySharing = 1。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista |
标头 | d3dkmthk.h (包括 D3dkmthk.h) |