PFND3DDDI_CREATERESOURCE2回调函数 (d3dumddi.h)

创建资源。 由 Windows 显示驱动程序模型 (WDDM) 1.2 及更高版本的用户模式显示驱动程序实现。

语法

PFND3DDDI_CREATERESOURCE2 Pfnd3dddiCreateresource2;

HRESULT Pfnd3dddiCreateresource2(
  [in] HANDLE hDevice,
       D3DDDIARG_CREATERESOURCE2 *unnamedParam2
)
{...}

参数

[in] hDevice

显示设备的句柄 (用于创建资源的图形上下文) 。

unnamedParam2

pResource2 [in, out]

指向描述所创建资源的 D3DDDIARG_CREATERESOURCE2 结构的指针。

返回值

返回 S_OK 或相应的错误结果。 WDDM 1.3 及更高版本的 Direct3D 级别 9 驱动程序必须返回以下错误代码:

返回代码 说明
E_INVALIDARG D3DDDIARG_CREATERESOURCE2 。Flagsmember 设置了 CaptureBuffer 标志值,并且资源超出了驱动程序可以支持的内容。

注解

CreateResource2 的调用可以包含图面列表。 pResource2 参数指定的D3DDDIARG_CREATERESOURCE2结构的 SurfCount 成员指定要创建的图面数(包括 MIP 映射级别)。 例如,256x256x9 纹理 MIP 贴图资源包含 9 个图面的列表,其中 SurfCount 成员和 MIP 贴图级别数都设置为 9。 包含 9 个 MIP 映射级别的多维数据集地图应将 MIP 映射级别数设置为 9, 将 SurfCount 设置为 54。 三面交换链应将 SurfCount 设置为 3,MIP 映射级别数应设置为 0。 请注意,MIP 映射级别数始终小于或等于 SurfCount 中的值。

为了响应 CreateResource2 调用,用户模式显示驱动程序可以调用 pfnAllocateCb 函数来创建一个或多个内存分配。 用户模式显示驱动程序必须确定是必须为每个图面创建多个分配、为所有图面创建一个分配,还是每个图面创建一个分配。 有关分配的详细信息,请参阅 视频内存管理和 GPU 计划

注意 驱动程序的 CreateResource2 函数不需要在返回之前调用 pfnAllocateCb ;相反,驱动程序可以延迟分配创建。
 
注意 仅当资源的所有分配都是在 对 pfnAllocateCb 的单个调用中以原子方式进行的时,才能共享资源。
 
D3DDDIARG_CREATERESOURCE2 结构中的 hResource 成员是用于标识资源的句柄。 用户模式显示驱动程序应存储在 CreateResource2 调用中传递的 hResource 值,并使用 Microsoft Direct3D 运行时在 CreateResource2 调用返回时可以使用的另一个值覆盖该值。 换句话说,在对运行时的调用中,用户模式显示驱动程序使用传递给 CreateResource2hResource 值;例如,在调用用户模式显示驱动程序 (例如,在调用 SetTextureSetStreamSource 函数) 时,运行时使用从 CreateResource2 返回的 hResource。 请注意,每个图面没有显式句柄;如果图面必须单独引用 (例如在调用 Blt 函数时) ,则它由句柄和索引引用。 索引标识资源中的图面。 索引与D3DDDIARG_CREATERESOURCE2的 pSurfList 成员中包含的数组中图面的索引相同。

(hDevice) 和进程,多个设备可以共享资源。 运行时通过在 D3DDDIARG_CREATERESOURCE2 的 Flags 成员中设置 SharedResource 位字段标志来指定共享资源。 如果设置了此位字段标志,则用户模式显示驱动程序必须遵守对共享资源的以下限制:

  • 用户模式显示驱动程序可以分别调用 pfnAllocateCbpfnDeallocateCb 函数。
  • 用户模式显示驱动程序在最初创建资源后无法为资源创建其他分配,同样,只能在资源本身被销毁时销毁资源分配。
  • 为通过调用驱动程序的 CreateResource2 或 OpenResource 函数创建或打开的共享资源调用用户模式显示驱动程序的 DestroyResource 函数时,驱动程序必须将 D3DDDICB_DEALLOCATE 结构的 hResource 成员设置为非 NULL,并将 D3DDDICB_DEALLOCATENumAllocations 成员设置为零,以销毁或关闭资源。 也就是说,与共享资源关联的分配不能单独销毁或关闭;必须在对 pfnDeallocateCb 的一次调用中以原子方式销毁或关闭资源。
  • 对于资源类型 (,分配数必须一致,也就是说,创建相同资源类型的另一个进程应) 生成相同的分配数量和类型。 此外,这些资源不允许重命名。
在 D3DDDI_RESOURCEFLAGS2 结构中指定的位字段标志在 D3DDDIARG_CREATERESOURCE2Flags 成员中传递。
注意 无需指定任何标志即可创建资源。 与此类资源关联的图面可能会被锁定,并且可能是位块传输 (位) 操作中的源或目标。 但是,此类表面不能用于任何其他内容。
 
注意 普通表面与纹理或独立呈现目标区分开来,没有 纹理 位字段标志。 例如, 位字段标志的存在指示独立呈现目标,而缺少此标志则表示呈现目标是后台缓冲区。
 
注意为了确保对运行时的更改不会中断现有驱动程序,驱动程序不得在调用其 CreateResource2 函数时使用以下D3DDDIARG_CREATERESOURCE2结构的保留成员来影响驱动程序的行为:
  • Flags 成员的未定义位是保留的。
  • 如果未在标志中设置 位字段 标志,则保留 RefreshRateOutput 成员。
  • 如果未在 Flags 中设置 RenderTargetDecodeRenderTargetVideoProcessRenderTarget 位字段标志,则保留 MultisampleTypeMultisampleQuality 成员。
  • 如果未在 Flags 中设置 VertexBuffer 位字段标志,则保留 Fvf 成员。
  • 如果未在 Flags 中设置 TextureCubeMapVolume 位字段标志,则保留 MipLevels 成员。
 
有关创建和销毁资源的详细信息,请参阅 处理资源创建和销毁

对于系统内存资源,如果系统内存正确对齐以便图形处理单元直接访问,则显示微型端口驱动程序可以选择围绕系统内存包装分配 (GPU) 。 在使用 dxgkDdiCreateAllocation 函数创建分配时,显示微型端口驱动程序通过在 DXGK_ALLOCATIONINFO 结构的 Flags 成员中设置 ExistingSysMem 标志来包装系统内存中的分配。 如果显示微型端口驱动程序无法围绕系统内存包装分配或包装失败,则驱动程序仍应成功创建资源并使用 CPU 访问资源。

如果运行时请求创建顶点或索引缓冲区,并且用户模式显示驱动程序由于内存不足 ((例如,) 缺少硬件支持)以外的原因而无法创建缓冲区,则驱动程序必须失败并 出现D3DERR_NOTAVAILABLE

要求

要求
最低受支持的客户端 Windows 8
最低受支持的服务器 Windows Server 2012
目标平台 桌面
标头 d3dumddi.h (包括 D3dumddi.h)

另请参阅

Blt

D3DDDIARG_CREATERESOURCE2

D3DDDI_RESOURCEFLAGS2

DXGK_ALLOCATIONINFO

DxgkDdiCreateAllocation

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb