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的限制如下:

  • ExistingSystemMemExistingSection 不能为同一分配设置。 已设置 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,还必须设置 ExistingSysMemExistingSection(但不能同时设置两者)。 此外,创建 StandardAllocation时,还必须设置 CreateSharedCrossAdapter 标志。 从 Windows 10 版本 1709(WDDM 2.3)开始支持。

ExistingSection

[in]设置时,指示 Dxgkrnl 使用节句柄(hSection),而不是系统内存指针(pSystemMem)。 ExistingSystemMemExistingSection 不能为同一分配设置。 如果设置了 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_CREATEALLOCATIONFLAGSD3DKMT_CREATEKEYEDMUTEX2_FLAGSD3DDDI_SYNCHRONIZATIONOBJECT_FLAGS 结构中可用。

驱动程序应遵循有关 D3DKMT_CREATEALLOCATIONFLAGS 共享标志的以下准则:

  • 如果未共享分配,请将 CreateSharedNtSecuritySharing 设置为 0。
  • 如果分配与 D3DKMT_HANDLE 数据类型共享,请设置 CreateShared = 1,NtSecuritySharing = 0。
  • 如果将分配与进程 NT 句柄共享(并且没有资源全局 D3DKMT_HANDLE 内核模式句柄),请将 CreateShared = 1,NtSecuritySharing = 1。

要求

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

另请参阅

D3DKMTCreateAllocation

D3DKMT_CREATEALLOCATION