以下参考主题介绍如何在用户模式显示驱动程序中实现此功能:
- PFND3DWDDM1_3DDI_CHECKMULTISAMPLEQUALITYLEVELS
- PFND3DWDDM1_3DDI_COPYTILEMAPPINGS
- PFND3DWDDM1_3DDI_COPYTILES
- PFND3DWDDM1_3DDI_GETMIPPACKING
- PFND3DWDDM1_3DDI_RELOCATEDEVICEFUNCS
- PFND3DWDDM1_3DDI_RESIZETILEPOOL
- PFND3DWDDM1_3DDI_TILEDRESOURCEBARRIER
- PFND3DWDDM1_3DDI_UPDATETILEMAPPINGS
- PFND3DWDDM1_3DDI_UPDATETILES
- D3DWDDM1_3DDI_CHECK_MULTISAMPLE_QUALITY_LEVELS_FLAG
- D3DWDDM1_3DDI_D3D11_OPTIONS_DATA1
- D3DWDDM1_3DDI_DEVICEFUNCS
- D3DWDDM1_3DDI_TILE_COPY_FLAG
- D3DWDDM1_3DDI_TILE_MAPPING_FLAG
- D3DWDDM1_3DDI_TILE_RANGE_FLAG
- D3DWDDM1_3DDI_TILE_REGION_SIZE
- D3DWDDM1_3DDI_TILED_RESOURCE_COORDINATE
- D3DWDDM1_3DDI_TILED_RESOURCES_SUPPORT_FLAG
- 常量值) D3D10_2DDICAPS_TYPE (D3DWDDM1_3DDICAPS_D3D11_OPTIONS1
- ) D3D10_DDI_FILTER (D3DWDDM1_3DDI_FILTER_XXX 常量值
- ) D3D10_DDI_RESOURCE_MISC_FLAG (D3DWDDM1_3DDI_RESOURCE_MISC_TILED 和 D3DWDDM1_3DDI_RESOURCE_MISC_TILE_POOL 常量值
- D3D10DDIARG_CREATEDEVICE (pWDDM1_3DeviceFuncs 成员)
- D3D11DDIARG_CREATEDEFERREDCONTEXT (pWDDM1_3ContextFuncs 成员
一、核心能力声明
1.1 设备初始化配置
// 在D3D11DDIARG_CREATEDEVICE中设置
pCreateData->pWDDM1_3DeviceFuncs = &MyWDDM1_3DeviceFuncs;
// 能力报告结构
D3DWDDM1_3DDI_D3D11_OPTIONS_DATA1 caps = {0};
caps.TiledResourcesTier = D3DWDDM1_3DDI_TILED_RESOURCES_TIER_2;
caps.SupportsExtendedTiledResources = TRUE;
二、平铺资源操作函数表
classDiagram
class D3DWDDM1_3DDI_DEVICEFUNCS {
+pfnCheckMultiSampleQualityLevels
+pfnCopyTileMappings
+pfnUpdateTileMappings
+pfnResizeTilePool
+pfnTiledResourceBarrier
}
三、关键函数实现
3.1 瓦片映射更新
void APIENTRY UpdateTileMappings(
_In_ HANDLE hDevice,
_In_ const D3DWDDM1_3DDI_UPDATE_TILE_MAPPINGS* pArgs)
{
// 1. 验证参数
if (pArgs->Flags & D3DWDDM1_3DDI_TILE_MAPPING_REBIND) {
FlushGpuCache(hDevice);
}
// 2. 构建页表项
PAGE_TABLE_ENTRY entries[MAX_TILE_COUNT];
for (UINT i = 0; i < pArgs->TileRegionSize.NumTiles; ++i) {
entries[i] = BuildPageTableEntry(
pArgs->pTilePoolPageOffsets[i],
pArgs->Flags);
}
// 3. 更新GPU页表
UpdateGpuPageTable(
pArgs->hTiledResource,
pArgs->StartCoordinate,
entries,
pArgs->TileRegionSize);
}
3.2 瓦片数据拷贝
void APIENTRY CopyTiles(
_In_ HANDLE hResource,
_In_ const D3DWDDM1_3DDI_TILED_RESOURCE_COORDINATE* pStart,
_In_ const D3DWDDM1_3DDI_TILE_REGION_SIZE* pSize,
_In_ HANDLE hBuffer,
_In_ UINT64 BufferOffset,
_In_ UINT Flags)
{
// 处理SWIZZLE模式拷贝
if (Flags & D3DWDDM1_3DDI_TILE_COPY_SWIZZLED) {
PerformSwizzledCopy(
hResource, pStart, pSize,
hBuffer, BufferOffset);
} else {
// 线性拷贝路径
PerformLinearCopy(...);
}
}
四、内存管理
4.1 瓦片池创建
属性 | Tier 1要求 | Tier 2增强 |
---|---|---|
最大尺寸 | 128MB | 4GB |
对齐要求 | 64KB | 64KB |
CPU访问 | 仅限映射更新 | 支持直接读写 |
4.2 资源标志位处理
// 在D3D10DDIARG_CREATERESOURCE中检查
if (pArgs->MiscFlags & D3DWDDM1_3DDI_RESOURCE_MISC_TILED) {
pArgs->pTileInfo = &MyTileLayout;
pArgs->NumTiles = CalculateTileCount(pArgs->pDesc);
}
五、多采样质量校验
HRESULT APIENTRY CheckMultiSampleQualityLevels(
_In_ D3D10DDI_HDEVICE hDevice,
_In_ DXGI_FORMAT Format,
_In_ UINT SampleCount,
_In_ UINT Flags,
_Out_ UINT* pNumQualityLevels)
{
// Tier 2需支持标准格式的16xMSAA
if (Flags & D3DWDDM1_3DDI_CHECK_MSAA_16X_REQUIRED) {
if (!IsStandardFormat(Format)) {
return E_INVALIDARG;
}
*pNumQualityLevels = 4; // 必须≥4级质量
return S_OK;
}
// 常规处理...
}
六、调试支持
6.1 ETW事件追踪
EventWriteTILE_MAPPING_UPDATE(
hResource,
pArgs->StartCoordinate.Subresource,
pArgs->TileRegionSize.NumTiles);
6.2 WinDbg扩展命令
!tiledres 0x1234 // 查看平铺资源状态
!tilepool // 瓦片池内存分析
七、版本兼容矩阵
功能 | WDDM 1.3要求 | WDDM 2.0+变更 |
---|---|---|
部分驻留纹理 | Tier 1必需 | Tier 2默认 |
瓦片池跨进程共享 | 不支持 | 支持 |
硬件保护资源 | 可选 | 必需 |
实现检查清单:
实现所有WDDM1.3新增DDI函数指针
处理D3DWDDM1_3DDI_TILED_RESOURCES_SUPPORT_FLAG
支持至少Tier 1级别的平铺资源
通过D3D11_TILED_RESOURCES功能测试