PFND3DDDI_CREATERESOURCE回调函数 (d3dumddi.h)

CreateResource 函数创建资源。

语法

PFND3DDDI_CREATERESOURCE Pfnd3dddiCreateresource;

HRESULT Pfnd3dddiCreateresource(
  HANDLE hDevice,
  D3DDDIARG_CREATERESOURCE *unnamedParam2
)
{...}

参数

hDevice

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

unnamedParam2

pResource [in, out]

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

返回值

CreateResource 返回以下值之一:

返回代码 说明
S_OK 已成功创建资源。
E_OUTOFMEMORY CreateResource 无法为其分配所需的内存才能完成。
D3DERR_NOTAVAILABLE CreateResource 由于无法分配内存以外的原因而无法创建资源。 CreateResourcecan 仅在创建顶点或索引缓冲区时返回此错误。

言论

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

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

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

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

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

新的 CreateResource DDI 与 DdCreateSurface DDI 不同,Microsoft Windows 2000 显示驱动程序模型 方式如下:

  • 在新 CreateResource DDI 中,永远不会显式附加图面。 原子创建将隐含所有附件。
  • 在新的 CreateResource DDI 中,不允许部分创建多维数据集映射。
对于系统内存资源,如果系统内存正确对齐,以便图形处理单元(GPU)直接访问,则显示微型端口驱动程序可以选择将分配包装在系统内存周围。 显示微型端口驱动程序通过在创建 DxgkDdiCreateAllocation 函数创建分配时,在 标志DXGK_ALLOCATIONINFO 成员中设置 ExistingSysMem 标志来包装系统内存中的分配。 如果显示微型端口驱动程序无法围绕系统内存包装分配或包装失败,驱动程序仍应成功创建资源并使用 CPU 访问资源。

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

要求

要求 价值
最低支持的客户端 在 Windows Vista 和更高版本的 Windows作系统中可用。
目标平台 桌面
标头 d3dumddi.h (包括 D3dumddi.h)

另请参阅

Blt

D3DDDIARG_CREATERESOURCE

D3DDDI_DEVICEFUNCS

D3DDDI_RESOURCEFLAGS

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb