适用于 Windows Vista) (Direct3D 9 的功能摘要
本文档专门引用 DirectX 图形的 Windows Vista 扩展。 若要开发适用于 Windows Vista 的 DirectX 功能,必须安装 Windows Vista SDK 和 DirectX SDK。 使用 DirectX for Windows Vista 的应用程序必须使用使用 WDDM 驱动程序 (Windows 设备驱动程序模型) 的硬件,而不是 XPDM (XP Driver Model) ;未实现 WDDM 的驱动程序无法实例化 Windows Vista DirectX 图形接口。
在以下部分之一中了解 Windows Vista 中的新 DirectX 图形功能:
设备现在仅在两种情况下丢失:硬件因挂起而重置时,以及设备驱动程序停止时。 当硬件挂起时,可以通过调用 ResetEx 来重置设备。 如果硬件挂起,纹理内存将丢失。
停止驱动程序后,必须重新创建 IDirect9Ex 对象才能继续呈现。
当演示区域被窗口模式中的另一个窗口遮盖时,或者当全屏应用程序最小化时, PresentEx 将返回S_D3DPRESENTATIONOCCLUDED。 全屏应用程序在收到 WM_ACTIVATEAPP 回调消息时可以恢复呈现。
在早期版本的 DirectX 中,当应用程序遇到模式更改时,恢复的唯一方法是重置设备并重新创建所有视频内存资源和交换链。 现在,使用 DirectX for Windows Vista 时,在模式更改后调用 Reset 不会导致纹理内存表面、纹理和状态信息丢失,并且无需重新创建这些资源。
添加了新的 caps 位 (D3DCREATE_DISABLE_PSGP_THREADING) ,它将禁用软件顶点处理 (swvp) 的多线程处理。 使用此宏为 IDirect3D9::CreateDevice 生成行为标志。
#define D3DCREATE_DISABLE_PSGP_THREADING
有一种新的一位图面格式类型,对于处理文本字形特别有用。 新格式称为 D3DFMT_A1。 一位图面设计为用作每像素纹理,或者用作 ComposeRects 或 ColorFill 生成的呈现目标输出。 图面宽度和高度没有单独的盖帽;实现必须支持 2K 纹素 x 8K 纹素的单一尺寸图面。
一位图面每个纹素有一位;因此,一个表示 (r,g,b,一个像素) 的所有分量都为 1,零表示所有分量都等于 0。 可以将一位图面与以下 API 配合使用:ColorFill、UpdateSurface 和 UpdateTexture。
读取一位图面时,运行时可以执行点采样或卷积筛选。 卷积筛选器可调整 (请参阅 SetConvolutionMonoKernel) 。
一位图面存在一些限制:
- 不支持 Mip 映射
- sRGB 数据不能读取或写入到一位图面。
- 一位图面不能用作顶点纹理或多重采样。
使用 IDirect3DDevice9::UpdateSurface 读取或写入从 IDirect3DDevice9::CreateDepthStencilSurface 或 IDirect3DDevice9::GetDepthStencilSurface 获取的表面的深度/模具数据。
首先,使用 IDirect3DDevice9::CreateOffscreenPlainSurface 创建可锁定的、仅深度或仅模具的表面。 使用以下格式之一:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
其次,在深度/模具缓冲区和新创建的可锁定深度或模具表面之间传输数据。 传输使用 IDirect3DDevice9::UpdateSurface 执行。
当两个图面都是 LOCKABLE 格式或两者都不可锁定时,UpdateSurface 将失败。
传输不存在的数据将导致错误 (例如,从不可锁定的仅深度图面传输到) D3DFMT_S8_LOCKABLE图面。
IDirect3DDevice9::UpdateSurface 的其余限制仍适用。
Direct3D 资源现在可以在设备或进程之间共享。 这适用于任何 Direct3D 资源,包括纹理、顶点缓冲区、索引缓冲区或表面 (,例如呈现目标、深度模具缓冲区或屏幕外普通表面) 。 若要共享,需要在创建时指定用于共享的资源,并在默认池 (D3DPOOL_DEFAULT) 中找到该资源。 创建用于共享的资源后,可以在进程中的设备之间共享,也可以跨进程共享。
若要启用共享资源,资源创建 API 具有额外的句柄参数。 这是指向共享资源的 HANDLE。 在 DirectX 的先前修订中,此参数是 API 签名的一部分,但未使用,必须设置为 NULL。 从 Windows Vista 开始,通过以下方式使用 pSharedHandle:
- 将指针 (pSharedHandle) 设置为 NULL 以不共享资源。 这与 Windows Vista 之前的 DirectX 行为一样。
- 若要创建共享资源,请调用任何资源创建 API, (请参阅下面的) ,其中包含未初始化的句柄 (指针本身不是 null (pSharedHandle != NULL) ,但指针指向 NULL 值 (*pSharedHandle == NULL) ) 。 API 将生成共享资源并返回有效的句柄。
- 若要使用 nonNULL 共享资源句柄打开和访问以前创建的共享资源,请将 pSharedHandle 设置为该句柄的地址。 以这种方式打开以前创建的共享资源后,可以使用 Direct3D 9 或 Direct3D 9Ex API 中返回的接口,就像该接口是该类型的典型资源一样。
资源创建 API 包括 - CreateTexture、 CreateVolumeTexture、 CreateCubeTexture、 CreateRenderTarget、 CreateVertexBuffer、 CreateIndexBuffer、 CreateDepthStencilSurface、 CreateOffscreenPlainSurface、 CreateDepthStencilSurfaceEx、 CreateOffscreenPlainSurfaceEx 和 CreateRenderTargetEx。
使用共享资源存在一些限制。 其中包括:
- 用于打开共享资源的 API 必须与用于创建共享资源的 API 匹配。 例如,如果使用 CreateTexture 创建共享资源,则必须使用 CreateTexture 打开该共享资源;如果使用 CreateRenderTarget 创建共享资源,则必须使用 CreateRenderTarget 打开该共享资源,等等。
- 打开共享资源时,必须指定D3DPOOL_DEFAULT。
- 可锁定的资源 (具有D3DUSAGE_DYNAMIC、顶点缓冲区和索引缓冲区的纹理,例如,) 在共享时可能会遇到性能不佳的问题。 在某些硬件上无法共享可锁定的呈现目标。
- 对跨进程共享资源的引用必须与原始资源具有相同的维度。 跨进程传递句柄时,请包含维度信息,以便可以相同方式创建引用。
- 共享的跨进程图面不提供同步机制。 在预期时,对共享图面的读/写更改可能不会反映引用进程的图面视图。 若要提供同步,请使用事件查询或锁定纹理。
- 只有最初创建共享资源的进程才能锁定它, (任何打开该共享资源的引用的进程都不能将其锁定) 。
- 如果共享资源已锁定,则其他进程无法验证该资源是否可用。
现在可以检查以查看设备是否可以在帧缓冲区混合之前将管道数据转换为 sRGB。 这意味着设备从 sRGB 转换呈现目标值。 若要查看硬件是否支持转换,检查此上限:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
此上限标识在混合之前支持转换为 sRGB 的硬件。 此功能对于从桌面窗口管理器中的 fp16 帧缓冲区 (DWM) 进行高质量渲染非常重要。
在早期版本的 DirectX 中,StretchRect 具有许多限制来容纳不同的驱动程序 (请参阅 IDirect3DDevice9::StretchRect) 。 Windows Vista 基于 Windows 设备驱动程序模型 (WDDM) 构建。 这种新的驱动程序模型更加可靠,并且允许驱动程序处理硬件中的特殊情况。
一般情况下,唯一的剩余限制是,呈现器目标必须已使用呈现器目标使用 (D3DUSAGE_RENDERTARGET) 创建。 如果执行简单复制 (源和 dest 的格式相同、大小相同且) 没有子矩形,则会解除此限制。
在系统内存的使用、分配和删除方面需要更多灵活性的应用程序现在可以从系统内存指针创建纹理。 例如,应用程序可以从 GDI 系统内存位图指针创建 Direct3D 纹理。
需要执行两项操作才能创建此类纹理:
- 分配足够的系统内存来保存纹理图面。 最小字节数为宽度 x 高度 x 每个像素的字节数。
- 将 HANDLE* 参数的系统内存图面指针的地址传递给 IDirect3DDevice9::CreateTexture。
下面是 IDirect3DDevice9::CreateTexture 的函数原型:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
系统内存纹理具有以下限制:
- 纹理间距必须等于纹理宽度乘以每个像素的字节数。
- ) 使用压缩格式 (DXT 格式时,应用程序负责分配正确的大小。
- 仅支持具有单个 mipmap 级别的纹理。
- 传递给 Pool 参数的 CreateTexture 的值必须D3DPOOL_SYSTEMMEM。
- 此 API 将提供的内存包装在纹理中。 在完成此内存分配之前,请不要解除分配此内存。