window显示驱动开发—平铺资源支持

以下参考主题介绍如何在用户模式显示驱动程序中实现此功能:

  • 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功能测试