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
防范指向 DXGALLOCATION 的 ExistingSysMem 指针,该指针为 MemRotated
内核必须防范用户模式锁定现有 DXGALLOCATION 的情况,并使用生成的 CPU 指针创建 ExistingSysMem 标准分配。 如果 DXGALLOCATION VAD MEM_ROTATE,即如果分配可能位于 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) |