同一表面 Blits
许多 UI 操作(例如滚动)需要将图像数据从图像的一部分传输到另一部分。 此功能添加了对复制操作的支持,其中源矩形和目标矩形位于同一图像或资源中。 在源矩形和目标矩形重叠的情况下,实现和驱动程序必须正确处理这种情况。 DirectX 9 DDI 已经要求这样做,WDDM 1.2 中需要所有硬件。 此方法可显著提高关键 UI 方案的性能。
功能定义与核心作用
同一表面 blits(也称为同资源块传输)允许在同一图像或图形资源(如纹理、缓冲区)内部,直接从一个矩形区域(源)复制像素数据到另一个矩形区域(目标)。这一操作的关键在于:
无需创建中间资源:传统跨资源复制需要临时存储,而同一表面 blits 直接在原资源内操作。
支持重叠区域:源和目标区域可以部分或完全重叠(例如滚动时内容向上移动,目标区域覆盖源区域的一部分),驱动需保证数据完整性。
重叠区域处理的挑战与实现
当源和目标矩形重叠时,直接复制可能导致数据损坏(如覆盖未复制的源数据)。为此,驱动和硬件需实现以下机制:
隐式临时缓存:驱动可能在内部自动创建临时缓冲区,先将源数据暂存后再写入目标区域。
智能复制顺序:硬件可能按特定方向(如从下到上复制垂直滚动的重叠区域)避免数据覆盖问题。
依赖硬件加速:现代 GPU 的 DMA 引擎或专用指令可直接处理此类操作,确保高效且正确。
与历史版本(如 DirectX 9 DDI)的对比
DirectX 9 DDI:虽要求驱动支持重叠区域复制,但硬件支持非强制,部分旧硬件可能依赖软件模拟,导致性能损失。
WDDM 1.2:强制所有硬件原生支持,确保统一的性能优化,消除兼容性差异。
性能提升机制
减少资源切换开销:无需绑定多个资源或切换渲染目标,降低 API 调用和驱动状态管理成本。
内存带宽优化:同一资源内复制可能利用 GPU 内部缓存或本地内存,减少与系统内存的交互。
并行化能力:硬件加速的 blits 操作可与其他图形任务并行执行,提升 GPU 利用率。
实际应用场景与优势
UI 滚动:窗口或列表滚动时,直接复用现有图像数据,避免重绘整个界面。
游戏与动画:精灵动画、平铺地图的局部更新可通过高效 blits 实现。
视频处理:帧内局部区域的特效处理(如平移、放大)更高效。
对开发者与用户体验的影响
开发者透明性:DirectX API(如 ID3D12GraphicsCommandList::CopyTextureRegion)封装了细节,开发者无需额外适配。
性能敏感场景优化:开发者可主动利用此特性,避免不必要的资源拷贝,降低延迟。
用户体验提升:更流畅的 UI 交互(如丝滑滚动)、更快的渲染响应速度。
WDDM 1.2 的同一表面 blits 特性通过硬件强制的同资源高效复制,解决了 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