LPD3DHAL_DRAWPRIMITIVES2CB回调函数 (d3dhal.h)
D3dDrawPrimitives2 函数呈现基元并返回更新的呈现状态。
语法
LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;
DWORD Lpd3dhalDrawprimitives2cb(
LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}
参数
unnamedParam1
pdp [in]
指向一个 D3DHAL_DRAWPRIMITIVES2DATA 结构,该结构包含驱动程序呈现一个或多个基元所需的信息。
返回值
D3dDrawPrimitives2 返回以下回调代码之一:
言论
D3dDrawPrimitives2 必须在 Microsoft Direct3D 驱动程序中实现。
驱动程序必须执行以下作:
- 确保由 pdp 处D3DHAL_DRAWPRIMITIVES2DATA结构 dwhContext 成员指定的上下文句柄有效。
- 检查是否正在翻转到与上下文关联的绘图图面。 如果绘图图面涉及翻转,驱动程序应将 ddrval D3DHAL_DRAWPRIMITIVES2DATA 成员设置为DDERR_WASSTILLDRAWING并返回DDHAL_DRIVER_HANDLED。
- 通过将 dwCommandOffset D3DHAL_DRAWPRIMITIVES2DATA 成员中的字节数添加到 lpDDCommandS D3DHAL_DRAWPRIMITIVES2DATA点成员的命令缓冲区中,确定第一个 D3DHAL_DP2COMMAND 结构的位置。
- 确定顶点缓冲区中第一个顶点的位置。 仅当顶点缓冲区中存在数据时,才应执行此作;也就是说,收到 D3DDP2OP_Xxx 命令令牌时(令牌D3DDP2OP_LINELIST_IMM或D3DDP2OP_TRIANGLEFAN_IMM除外)。 这两个作代码指示顶点数据会立即在命令流中传递,而不是在顶点缓冲区中传递。 因此,假设顶点缓冲区中存在数据,如果顶点缓冲区位于用户内存中,则第一个顶点 dwVertexOffset 字节写入 lpVertices 指向的缓冲区。 否则,驱动程序应将 dwVertexOffset 应用于与 lpDDVertex 点 DD_SURFACE_LOCAL 结构关联的内存。 dwVertexOffset、lpVertices,lpDDVertex 是D3DHAL_DRAWPRIMITIVES2DATA的成员。
- 检查D3DHAL_DRAWPRIMITIVES2DATA的 dwVertexType 成员,以确保驱动程序支持请求的 FVF。 如果存在以下任一条件,驱动程序应失败调用:
- 未指定顶点坐标;也就是说,如果未设置D3DFVF_XYZRHW。
- 指定法则;也就是说,如果设置了D3DFVF_NORMAL。
- 设置了任何保留D3DFVF_RESERVED x 位。
- 按顺序处理命令缓冲区中的所有命令。 对于每个D3DHAL_DP2COMMAND结构,驱动程序应执行以下作:
- 如果命令D3DDP2OP_RENDERSTATE,请处理命令缓冲区中后续 wStateCount D3DHAL_DP2RENDERSTATE 结构,并更新每个呈现状态结构的驱动程序状态。 设置D3DHALDP2_EXECUTEBUFFER标志时,驱动程序还应反映 lpdwRStates 指向的数组的状态更改。wStateCount 和 lpdwRStates 是D3DHAL_DRAWPRIMITIVES2DATA的成员。
- 如果命令D3DDP2OP_TEXTURESTAGESTATE,请处理命令缓冲区中后续 wStateCount D3DHAL_DP2TEXTURESTAGESTATE 结构,更新与每个纹理状态结构的指定纹理阶段关联的驱动程序的纹理状态。
- 如果命令D3DDP2OP_VIEWPORTINFO,请处理命令缓冲区中后面的 D3DHAL_DP2VIEWPORTINFO 结构,更新存储在驱动程序的内部呈现上下文中的视区信息。
- 如果命令D3DDP2OP_WINFO,请处理命令缓冲区中后面的 D3DHAL_DP2WINFO 结构,更新存储在驱动程序的内部呈现上下文中的 w 缓冲信息。
- 否则,在命令缓冲区中处理遵循 D3DDP2OP_Xxx 基元呈现命令的 D3DHAL_DP2Xxx 基元结构。
- 如果命令未知,请调用运行时的 D3dParseUnknownCommand 回调。 运行时使用 GUID_D3DParseUnknownCommandCallback GUID 向驱动程序的 DdGetDriverInfo 回调提供此回调。
如果驱动程序必须失败 D3dDrawPrimitives2,则它应填写 dwErrorOffset 成员D3DHAL_DRAWPRIMITIVES2DATA,并将偏移量填充到命令缓冲区中,其中可以找到第一个未经处理的D3DHAL_DP2COMMAND。
对于使用 DirectX 8.0 和更高接口编写的应用程序,以下注释无效,因为此类应用程序不再使用当前顶点缓冲区的概念(即,顶点数据不再通过 lpDDVertex D3DHAL_DRAWPRIMITIVES2DATA 成员传入)。 因此,使用这些应用程序时,驱动程序的 D3dDrawPrimitives2 函数绝不会导致从顶点缓冲区呈现停止,即使缓冲区是隐式或显式的,并且存在未完成的锁。
如果驱动程序与 DirectX 8.0 运行时一起使用,则驱动程序在从隐式当前顶点缓冲区呈现时应停止,以防止同步问题和导致损坏。 此外,DirectX 8.0 运行时调用驱动程序的 D3dDrawPrimitives2 函数,以便更频繁地从锁定的显式当前顶点缓冲区呈现,因此性能会降低。 下面是用于 DirectX 8.0 运行时的驱动程序的停止解决方法:
-
驱动程序在呈现用户内存基元(由D3DHALDP2_USERMEMVERTICES标识)和从隐式当前顶点缓冲区进行呈现时应停止,前提是它不重命名缓冲区(未设置D3DHALDP2_SWAPVERTEXBUFFER)。
以下示例显示当 D3dDrawPrimitives2 应在隐式当前顶点缓冲区上停止时:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, 0); // Stall
以下示例显示当 D3dDrawPrimitives2 不应在隐式当前顶点缓冲区上停止时:
DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
如果运行时设置D3DHALDP2_REQCOMMANDBUFSIZE标志,则不需要驱动程序停止。 巧合的是,当 DirectX 8.0 运行时最常从锁定的显式当前顶点缓冲区呈现时,它还会设置D3DHALDP2_REQCOMMANDBUFSIZE。 因此,驱动程序可以在从锁定的显式当前顶点缓冲区呈现时检测到D3DHALDP2_REQCOMMANDBUFSIZE时不停止性能。
以下示例演示 D3dDrawPrimitives2 应在显式当前顶点缓冲区上停止时:
DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
以下示例演示 D3dDrawPrimitives2 不应在显式当前顶点缓冲区上停止时:
DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
要求
要求 价值 目标平台 桌面 标头 d3dhal.h (包括 D3dhal.h) 另请参阅