Windows 8包括 Microsoft DirectX 功能改进,使开发人员、最终用户和系统制造商受益。
功能改进在以下几个方面:
- 像素格式 (5551、565、4444) :在低功耗硬件配置下,DirectX 应用程序的性能更高。
- 双精度着色器功能:高级着色器模型性能改进,使你可以在 GPU 上执行更多操作,而无需占用 CPU。
- 独立于目标的光栅化:适用于 Direct2D 应用程序的高性能抗锯齿路径。
- 无覆盖和丢弃:使用基于磁贴的呈现器的移动平台和电源约束设备上的 Microsoft Direct3D 11.1 应用程序具有更高的性能。
- 每个阶段的 UAV:添加了在 DirectX 11.1 硬件上所有着色器阶段启用着色器调试的功能。
- 支持立体 3D) (纹理数组的跨进程共享:为启用立体 3D 提供基础。
- 具有多样本抗别名示例访问的无序访问视图:使 Direct3D 11 应用程序可以实现高质量的呈现算法,而无需为大量样本分配内存。
- 逻辑操作:对延迟着色技术的改进。
- 改进了对常量缓冲区的控制:为游戏开发人员提供高效的缓冲区管理。
像素格式 (5551、565、4444)
为了更好地支持使用 DirectX 的低功率配置中的图形,Windows 8的 Direct3D 中必须支持来自 DXGI_FORMAT 枚举的以下 DirectX 9 像素格式:
- DXGI_FORMAT_B5G6R5_UNORM
- DXGI_FORMAT_B5G5R5A1_UNORM
- DXGI_FORMAT_B4G4R4A4_UNORM
这些附加格式在 DirectX 应用程序中的低功率硬件上提供了更高的性能。 到目前为止,所有 GPU 都支持这些格式。 下表描述了对这些格式的所需支持,具体取决于硬件功能级别。
所需的格式支持取决于硬件功能级别
功能 | 功能级别9_x | 功能级别 10.0 | 功能级别 10.1 | 功能级别 11+ |
---|---|---|---|---|
类型化缓冲区 | 否 | 必需 | 必需 | 必需 |
输入装配器顶点缓冲区 | 否 | 可选 | 可选 | 可选 |
Texture1D | 否 | 必需 | 必需 | 必需 |
Texture2D | 必需 | 必需 | 必需 | 必需 |
Texture3D | 否 | 必需 | 必需 | 必需 |
TextureCube | 必需 | 必需 | 必需 | 必需 |
着色器 ld* | 否 | 必需 | 必需 | 必需 |
带有筛选) 的着色器示例* ( | 必需 | 必需 | 必需 | 必需 |
着色器集合4 | 否 | 否 | 否 | 必需 |
Mipmap | 必需 | 必需 | 必需 | 必需 |
Mipmap 自动生成 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
RenderTarget | 565 必需,4444、5551 为否 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
可混合的 RenderTarget | 565 必需,4444、5551 为否 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
UAV 类型化存储 | 否 | 否 | 否 | 可选 |
CPU 可锁定 | 必需 | 必需 | 必需 | 必需 |
4x MSAA | 可选 | 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
8x MSAA | 可选 | 可选 | 可选 | 565 必需,4444、5551 可选 |
其他 MSAA 示例计数 | 可选 | 可选 | 可选 | 可选 |
多重采样解析 | 如果 MSAA 支持 565) ,则为必需 (,4444、5551 不支持 | 如果 MSAA 支持 565) ,则为必需 (,对于 4444、5551 为可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
多重采样加载 | 否 | 如果 MSAA 支持 565) ,则为必需 (,对于 4444、5551) 可选 | 565 必需,4444、5551 可选 | 565 必需,4444、5551 可选 |
双精度着色器功能
在 Windows 8 中,支持双精度的 Windows 显示驱动程序模型 (WDDM) 1.2 驱动程序还必须在所有着色器阶段支持高级着色器模型 5 中的其他双精度浮点指令。 说明如下:
- 双精度倒数
- 双精度除法
- 双精度融合乘加
由于运行时可以将这些指令直接传递给驱动程序,因此实现可以优化其性能,或者将它们作为硬件中的专用单一指令实现。
注意 若要使用这些功能,开发人员必须确保它们在 WDDM 1.2 或更高版本驱动程序上以双精度支持 (D3D11_FEATURE_DOUBLES) FEATURE_LEVEL_11或更高版本运行。
绝对差异之和
图像处理是新式设备中的关键应用程序。 常见的操作是模式匹配或搜索。 视频编码操作通常搜索匹配的方块 (通常为 8x8 或 16x16) ,图像识别算法搜索由位掩码标识的更常规的形状。 为了提高这些方案的性能,Microsoft 高级着色器语言 (HLSL) 在所有着色器阶段中为着色器模型 5.0 添加了一个新的内部函数。 此内部 msad4 () 对应于并生成一组掩码的绝对差异之和, (MSAD) 着色器 IL 中的指令。 所有 WDDM 1.2 及更高版本的驱动程序都必须直接在硬件中支持此指令,或作为一组其他指令 (模拟) 。
注意 理想情况下,应实现 MSAD 指令,以便溢出导致饱和,而不是包装行为。 请注意,溢出行为未定义。
开发人员必须检查,以确保他们在 WDDM 1.2 或更高版本驱动程序上使用 FEATURE_LEVEL_11 或更高版本运行才能使用此功能。 开发人员不得依赖于溢出 (即高于 65535) 的累积值的结果准确性。
与目标无关的光栅化 (TIR)
独立于目标的光栅化 (TIR) 为涉及结构化图形的高质量抗锯齿的 Direct2D 使用方案提供高性能抗锯齿路径。 TIR 使 Direct2D 能够将光栅化步骤从 CPU 移动到 GPU,同时保留 Direct2D 抗锯齿语义和质量。 使用此功能,软件层可以评估大量子像素样本位置的覆盖范围,但仅分配少量样本所需的内存。 这提供了使用 GPU 进行呈现但保留 CPU 呈现实现的图像质量的性能优势。 这允许将单个样本广播到多样本抗锯齿呈现目标的多个样本。
SampleCount =1 (limited TIR on 10, 10.1 & 11)
Direct3D 10.0 - Direct3D 11.0 硬件 (和功能级别 10_0 - 11_0) 支持将 ForcedSampleCount 设置为 1 (和呈现目标视图的任何样本计数) 以及描述的限制 (例如,无深度/模具) 。
对于 10_0、10_1 和 11_0 硬件, D3D11_1_DDI_RASTERIZER_DESC。ForcedSampleCount 设置为 1,无法将线条呈现配置为 2-三角形 (基于四边形) 的模式 (即 ,MultisampleEnable 状态不能设置为 true) 。 11_1 硬件不存在此限制。 请注意, MultisampleEnable 状态的命名具有误导性,因为它不再与启用多重采样有关;相反,它现在是用于选择线条呈现模式的 AntialiasedLineEnable 的控件之一。
这种有限形式的与目标无关的光栅化( ForcedSampleCount = 1)与 Direct3D 10.0 中存在的模式非常匹配,但由于 API 更改,Direct3D 10.1 和 Direct3D (和特征级别 10_1 和 11_0) 不可用。 在 Direct3D 10.0 中,此模式是中心采样渲染,即使在多重采样抗锯齿 (MSAA) 图面上,当 MultisampleEnable 设置为 false (并且可以通过切换 MultisampleEnable) 来切换。 在 Direct3D 10.1+ 中,尽管名称) , 但 MultisampleEnable 不再影响多重采样 (,并且仅控制线条呈现行为。
无覆盖和放弃
在基于磁贴的延迟呈现 (TBDR) 体系结构上呈现内容
Direct3D 11.1 中的呈现目标现在可以使用一组新的资源 API 来支持放弃行为。 开发人员必须了解此功能,并调用额外的 Discard () 方法,以在 TBDR 体系结构 (更高效地运行,不会对传统图形硬件) 造成任何损失。 这将提高移动平台和使用平铺呈现器的其他受电源限制的设备的性能。
更新 TBDR 体系结构上的资源
由于 TBDR 体系结构通过同一命令缓冲区完成多次传递,因此,在上一次绘制调用期间未修改子资源的一部分时,必须特别小心地通知驱动程序。 在 Direct3DUpdateSubResource 函数上拥有NO_OVERWRITE用法可帮助驱动程序管理以前未对纹理区域进行绘制调用的资源。 这只需告知驱动程序应用程序放弃现有数据或防止其覆盖的意图。 这样就可以更高效地在 TBDR 体系结构上呈现,并且不会在传统桌面硬件上运行它时产生任何处罚。
Direct3D 11 UpdateSubresource () 和 CopySubresourceRegions API 的新变体都更新了 GPU 图面的一部分,提供了一个可在其中指定NO_OVERWRITE或 DISCARD 的附加标志字段。
这些 API 驱动 Direct3D 11.1 设备驱动程序接口 (DDI) 和 Direct3D 9 DDI。 任何 DirectX 9 以上硬件的新驱动程序都需要通过添加此处讨论的标志来支持修改后的 BLT、BUFBLT、VOLBLT 和 TEXBLT DDI。
对于具有 Direct3D 11.1 驱动程序的所有 Direct3D 10+ 硬件,还需要支持这些硬件。
每个阶段的 UAV
在 Microsoft Direct3D 11 中,计算着色器 (UAV) 的无序访问视图数限制为 8 个, (像素着色器) RTV) + UAV (8 个组合 (呈现目标视图。 在 DirectX 11.1 中,可绑定的数量已增加。 对于 DirectCompute,限制现在为 64,对于图形,输出合并时的总绑定总数为 64 (也就是说,图形可以有 64 个减去 RTV) 可能使用的最多 8 个。
可以从任何着色器阶段访问无序访问视图,但仍会从图形管道的总数中得出
在每个着色器阶段添加 UAV 可以向管道添加调试信息。 这种轻松的开发使 Windows 成为编写 GPU 加速应用程序的更理想的平台。
这至少需要 DirectX 11.1 功能级别。
支持立体三维) 的纹理数组 (跨进程共享
尽管 Stereoscopic 3-D 是可选的 WDDM 1.2 系统功能,但所有 WDDM 1.2 设备驱动程序都必须实现底层基础结构,无论它们是否支持 Stereoscopic 3-D 系统功能。
支持) 的 DirectX 10 (或更高版本的图形硬件必须支持纹理数组的跨进程共享。 此功能为启用 Stereoscopic 3-D 提供了基础。 WDDM 1.2 Direct3D DDI 需要支持数组缓冲区作为独立于硬件功能级别的呈现目标。
此要求可确保立体声应用程序在单声道模式下不会出现故障。 例如:即使在系统上未启用立体声的情况下,应用程序也应该能够创建立体声交换链或数组缓冲区作为呈现目标,然后调用 Present。 在这种情况下, (仅显示左侧视图,或者如果设置了 首选的右侧 Microsoft DirectX Graphics Infrastructure (DXGI) 当前标志,则仅) 右视图。
因此,WDDM 1.2 驱动程序 (全图形 & 呈现设备) 必须通过添加对纹理数组的跨进程共享的支持来支持 Direct3D 11 API。 在早期版本中,跨进程共享资源只能是单层图面。 在 Windows 8 中,共享数组的最大大小为两个元素, (这足以用于立体声) 。 有关此要求的详细信息,请参阅 Windows 硬件认证要求中的 Device.Graphics ¦ Stereoscopic3DArraySupport。 其他相关的 Microsoft WindowsWindows Windows HCK 要求包括 Device.Graphics ¦ ProcessingStereoscopicVideoContent 和 Device.Display.Monitor.Stereoscopic3DModes。
具有多示例抗别名示例访问权限的 UAV
Direct3D 11 允许光栅化到无序访问视图, (UAV) 没有呈现目标视图 (RTV) /DSV 绑定。 即使 UAV 可以具有任意大小,实现也可以使用视区/剪刀矩形的像素尺寸来操作光栅器。 DirectX 11 硬件的示例模式仅为单个示例。 DirectX 11.1 硬件规范扩展为允许多个示例。 这是独立于目标的光栅化的一种变体,其中只有 UAV 用于输出。
现在,通过键出 ForcedSampleCount 状态,可以将仅 UAV 渲染与光栅器上的多重采样一起进行,样本模式限制为 0、1、4 和 8, (不是 16,TIR 支持) 。 (UAV 本身在分配方面不是多采样的。) 设置为 0 等效于设置 1 - 单个样本光栅化。
着色器可以通过仅限 UAV 的呈现请求像素频率调用。 但是,请求采样频率调用无效, () 生成未定义的着色结果。 SampleMask 光栅器状态完全不会影响此处的光栅化行为。
DirectX 11.0+ 硬件支持此功能,包括不支持使用 RTV 实现完全 11_1 级别的目标独立光栅化的硬件。 驱动程序可以报告它支持仅限 UAV 的多样本反别名示例访问, (MSAA) 呈现 (意味着 4 和 8 个样本均受支持) 。 所有 DirectX 11+ 硬件都支持 1。 如果硬件可以使用 RTV 执行完全 11_1 目标无关的光栅化 (这需要 16 个样本的支持) ,则需要仅 UAV MSAA 光栅化支持 (这意味着在仅限 UAV 的情况下) 4 个样本和 8 个样本。
此功能使应用程序可以实现高质量的呈现算法,例如分析抗锯齿,而无需为大量样本分配内存。
逻辑操作
允许在输出合并时执行逻辑操作,这样就可以对当前不可能的图像执行一些操作。 例如,可以更高效、更轻松地计算掩码,还可以实现用于 3D 呈现的现代延迟着色技术。
尽管此功能存在于大多数 3D 硬件中,但它目前并不像颜色混合那样普遍。 因此,逻辑操作的配置受到以下限制:
- 在第一个 RT 混合 desc 中使用逻辑操作时,IndependentBlendEnable 必须设置为 false,以便相同的逻辑操作适用于所有 RT。
- 使用逻辑操作时,绑定的所有 RenderTargets 都必须采用 UINT 或 SINT 格式,否则呈现为未定义。
改进了对常量缓冲区的控制
部分常量缓冲区更新
在更新期间,常量缓冲区需要从源到目标的单一副本,以阻止整个缓冲区。 如果只需要更新常量缓冲区的一部分,则写入的偏移量是理想的。 游戏开发人员请求这种随机访问写入常量缓冲区的功能,使恒定缓冲区管理更加自然和高效。 其他缓冲区类型已支持这些功能,并已添加到 WDDM 1.2 驱动程序中的常量缓冲区。
所有具有 Direct3D 11.1 驱动程序的 Direct3D 10+ 硬件都必须支持此功能。 对于开发人员来说,这是在 DirectX 9 硬件上模拟的,因此它适用于所有功能级别。
注意 必须指定 NO_OVERWRITE 或 DISCARD 标志。
偏移常量缓冲区更新
高性能游戏引擎的一个常见需求是收集大量常量缓冲区更新,以便由单独的 Draw\* 调用引用常量,每个调用都需要自己的常量,一次完成所有操作。 通过允许应用程序创建一个大型缓冲区,然后将单个着色器指向其中的区域, (类似于视图,但无需创建整个对象来描述视图) ,即可实现此目的。
现在,可以创建大于单个着色器可寻址的最大常量缓冲区大小的常量缓冲区, (最多 4096 个 16 字节元素 -65kB,其中每个元素是一个四分量的着色器常量) 。 常量缓冲区资源大小现在仅受系统能够处理的内存分配大小限制。
使用 *SetShaderConstants API(如 VSSetShaderConstants)将大于 4096 元素 的常量缓冲区绑定到管道时,着色器看起来好像只有 4096 个元素的大小。
*SetShaderConstantsAPI 的变体 *SetShaderConstants1 允许将“FirstConstant”和“ConstantCount”与绑定一起指定。 当着色器以这种方式访问绑定的常量缓冲区时,它似乎从指定的“FirstConstant”偏移量开始 (其中 1 表示) 16 个字节,并且由 ConstantCount 定义的大小 () 16 字节常量。 这基本上是较大常量缓冲区区域的轻型“视图”。 (FirstConstant 和 ConstantCount 都必须是 16) 的倍数。
对于 Direct3D 10+ 硬件,所有 WDDM 1.2 驱动程序都必须支持此功能。 Direct3D 11 运行时模拟功能级别9_x的相应行为。
Clearview
此功能使实现能够对视频内存资源执行高效的清除操作,在单个 API/DDI 调用中清除多个 rect。 API 包括对定义要清除的资源子集的矩形的支持。 DirectX 9 DDI 支持此功能, (WDDM 1.2) Windows 8驱动程序需要此功能。 此方法可提高二维操作的性能,例如图像处理和 UI 中使用的操作。
可平铺复制标志
可平铺复制操作允许应用程序通知实现图像源和目标是像素对齐的,并且不会参与后续呈现阶段中信息的跨像素交换。 这样,在复制操作期间从缓存图像数据子集中获益的一些实现可显著提高性能。 DirectX 9 DDI 支持此功能, (WDDM 1.2) Windows 8及更高版本的驱动程序都需要此功能。
同一表面 blits
许多 UI 操作(例如滚动)需要将图像数据从图像的一部分传输到另一部分。 此功能添加了对复制操作的支持,其中源矩形和目标矩形位于同一图像或资源中。 在源矩形和目标矩形重叠的情况下,实现和驱动程序必须正确处理这种情况。 DirectX 9 DDI 已经要求这样做,WDDM 1.2 中需要所有硬件。 此方法可显著提高关键 UI 方案的性能。
Direct3D 11.1 DDI
这些函数和结构是针对Windows 8新增或更新的:
- AssignDebugBinary
- CalcPrivateBlendStateSize (D3D11_1)
- ClearView
- DefaultConstantBufferUpdateSubresourceUP (D3D11_1)
- ResourceUpdateSubresourceUP (D3D11_1)
- VsSetConstantBuffers (D3D11_1)
- D3D11_1DDI_D3D11_OPTIONS_DATA
- D3DDDI_BLTFLAGS
- D3DDDI_COPY_FLAGS
- D3DDDIARG_BUFFERBLT1
- D3DDDIARG_DISCARD
- D3DDDIARG_TEXBLT1
- D3DDDIARG_VOLUMEBLT1
- D3DDDICAPS_ARCHITECTURE_INFO
- D3DDDICAPS_SHADER_MIN_PRECISION
- D3DDDICAPS_SHADER_MIN_PRECISION_SUPPORT
- D3DDDICAPS_TYPE