D3DHAL_DP2TEXBLT结构 (d3dhal.h)
当 D3dDrawPrimitives2 响应D3DDP2OP_TEXBLT命令令牌时,D3DHAL_DP2TEXBLT结构用于纹理 blts。
语法
typedef struct _D3DHAL_DP2TEXBLT {
DWORD dwDDDestSurface;
DWORD dwDDSrcSurface;
POINT pDest;
RECTL rSrc;
DWORD dwFlags;
} D3DHAL_DP2TEXBLT;
成员
dwDDDestSurface
指定目标纹理的句柄。
dwDDSrcSurface
指定源纹理的句柄。
pDest
指定应执行 blt 的目标点,即目标图面(dwDDDestSurface)中的点以开始 blt。 这些 x 和 y POINT 结构的成员在屏幕坐标中指定。
rSrc
指定要在源纹理中点亮的矩形,即源图面(dwDDSrcSurface) 中的源矩形从中 blt。
dwFlags
保留供系统使用。
言论
D3dCreateSurfaceEx 回调为纹理创建小整数句柄,这些纹理可用作纹理的源纹理和目标纹理。
D3DHAL_DP2TEXBLT结构与D3DDP2OP_TEXBLT命令流令牌一起使用,以通知驱动程序执行从源纹理到目标纹理的 blt作。 纹理也可以是立方环境图。 驱动程序应将源纹理中由 rSrc 指定的矩形复制到目标纹理中由 pDest 指定的位置。 目标纹理和源纹理由驱动程序在创建纹理期间收到通知的句柄标识。 如果驱动程序能够管理纹理,则目标句柄可能是 0。 这向驱动程序指示,它应将纹理预加载到视频内存中(或硬件有效纹理从何处)。 在这种情况下,驱动程序可以忽略 rSrc,pDest。
请注意,对于 MIP 映射的纹理,D3dDrawPrimitives2 命令流中只插入一个D3DDP2OP_TEXBLT指令。 在这种情况下,驱动程序应将筛选纹理中存在的所有 MIP 地图级别。 可以通过在每个级别将 rSrc 和pDest 除以 2 来获取 MIP 映射子层中复制的区域。
源纹理和目标纹理可能包含不同数量的 MIP 地图级别。 在这种情况下,驱动程序应会提升公共级别。 例如,如果 256x256 源纹理具有 8 个 MIP 地图级别,并且目标为具有 6 个级别的 64x64 纹理,则驱动程序应从源中筛选 6 个相应级别。 驱动程序可以期望目标纹理的顶级 MIP 级别的维度始终小于或等于源纹理的顶级 MIP 级别的维度。
请注意,源和目标句柄始终引用顶级图面,从不引用任何 MIP 映射子级别。 由于应用程序中出现错误,目标纹理可能包含额外的 MIP 地图级别。 例如,源 256x256 纹理可能包含五个级别,但目标 256x256 纹理可能包含 8 个级别。 驱动程序应安全地处理此情况,但预计不会生成正确的结果。 由于旧应用程序兼容性问题,Direct3D 不会阻止此类源/目标纹理对传递到驱动程序。
驱动程序可以期望源纹理和目标纹理的像素格式相同,通常,指定的 blt 可以安全地执行。 除了上述单例之外,驱动程序不应看到任何无法执行 blt 的情况。
如果驱动程序想要从系统内存执行异步 blts 到视频内存,则它应实现 DirectDraw HAL 调用 GetSysmemBltStatus,否则可能会出现不一致。
对于 TexBlt,驱动程序不需要执行任何同步,因为始终按正确的顺序发出 TexBlts 以及呈现命令。 在此之前,驱动程序必须正确处理 DirectDraw blt 修改了任何 Direct3D 上下文中呈现命令所引用的任何纹理时的情况。 当存在多个上下文时,Direct3D 不会发出 TexBlts。 这意味着驱动程序编写器可以省略 TexBlt 代码路径中的同步代码(但仍需要同步 blts)。
示例
以下伪代码演示如何为连续 MIP 级别计算子类,以便从 MIP 级别 i 到 MIP 级别 i + 1:
rect.left >>= 1;
rect.top >>= 1;
DWORD right = (rect.right + 1) >> 1;
DWORD bottom = (rect.bottom + 1) >> 1;
rect.right = ((right - rect.left) < 1) ?
(rect.left + 1) : (right);
rect.bottom = ((bottom - rect.top ) < 1) ?
(rect.top + 1) : (bottom);
要求
要求 | 价值 |
---|---|
标头 | d3dhal.h (包括 D3dhal.h) |
另请参阅
D3DDP2OP_TEXBLT