window显示驱动开发—支持 DXGI DDI(三)

发布于:2025-06-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

Direct3D 版本 11.1 DXGI 函数

本部分介绍为 Microsoft Direct3D 版本 11.1 运行时添加的用户模式显示驱动程序实现的 Microsoft DirectX 图形基础结构 (DXGI) 函数。 Direct3D 11.1 随 Windows 8 一起引入。

当运行时调用 CreateDevice (D3D10) 时,用户模式显示驱动程序 DLL 导出 OpenAdapter10_2 函数,并通过 D3D10_2DDI_ADAPTERFUNCS 结构的成员提供指向适配器特定函数的指针。

驱动程序在调用用户模式显示驱动程序的特定于适配器的 CreateDevice (D3D10) 函数时,通过 DXGI1_2_DDI_BASE_FUNCTIONS 结构的成员提供指向 Direct3D 版本 11.1 DXGI 函数的 指针。

1. 版本背景与核心升级

Direct3D 11.1 随 Windows 8 引入,其 DXGI DDI 扩展主要增强:

  • 异构渲染支持:改进多引擎(3D/计算/复制)协同
  • HDR与宽色域:新增色彩空间管理接口
  • 低延迟呈现:支持帧延迟控制(如 DXGI1_2_DDI_PRESENT_FLAGS)
  • 交换链多样化:包括窗口化无撕裂模式

2. 驱动初始化流程

(1) 适配器级注册 (OpenAdapter10_2)
需实现 D3D10_2DDI_ADAPTERFUNCS 函数表:

// 在驱动入口点注册
HRESULT OpenAdapter10_2(D3D10DDIARG_OPENADAPTER* pOpenData) {
    pOpenData->pAdapterFuncs_2->pfnCalcPrivateDeviceSize = MyCalcPrivateDeviceSize;
    pOpenData->pAdapterFuncs_2->pfnCreateDevice = MyCreateDevice_11_1;
    // ...其他必要函数
    return S_OK;
}

(2) 设备创建时提供DXGI 1.2 DDI
在 CreateDevice 中填充 DXGI1_2_DDI_BASE_FUNCTIONS:

static const DXGI1_2_DDI_BASE_FUNCTIONS dxgi1_2_funcs = {
    .pfnPresent = MyPresentDXGI_11_1,
    .pfnGetGammaCaps = MyGetGammaCaps_11_1,
    .pfnSetDisplayMode = MySetDisplayMode_11_1,
    .pfnSetResourcePriority = MySetResourcePriority_11_1,
    // 新增11.1专有函数
    .pfnCheckMultiplaneOverlaySupport = MyCheckOverlaySupport,
    .pfnPresentMultiplaneOverlay = MyPresentOverlay
};
*pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions = (DXGI_DDI_BASE_FUNCTIONS*)&dxgi1_2_funcs;

3. 关键新增函数实现

(1) 多平面覆盖 (Multiplane Overlay)
用于硬件加速视频/UI合成:

BOOL APIENTRY MyCheckOverlaySupport(
    DXGI_DDI_ARG_CHECKMULTIPLANEOVERLAYSUPPORT* pSupport
) {
    // 检查硬件是否支持指定格式的覆盖层
    return (pSupport->Format == DXGI_FORMAT_NV12) ? TRUE : FALSE;
}

HRESULT APIENTRY MyPresentOverlay(
    DXGI_DDI_ARG_PRESENTMULTIPLANEOVERLAY* pOverlay
) {
    // 配置硬件覆盖层引擎
    ConfigureOverlayPlane(pOverlay->PlaneIndex, &pOverlay->Transform);
    return S_OK;
}


(2) HDR元数据控制

void APIENTRY MySetHDRMetaData(
    DXGI_DDI_ARG_SETHDRMETADATA* pMetaData
) {
    // 传递ST.2086元数据到显示控制器
    WriteHDRMetaData(
        pMetaData->hMonitor,
        pMetaData->Type,
        &pMetaData->MetaData
    );
}

(3) 低延迟呈现

HRESULT APIENTRY MyPresentDXGI_11_1(
    DXGI_DDI_ARG_PRESENT* pPresent
) {
    if (pPresent->Flags.LowLatency) {
        // 跳过队列直接提交到显示引擎
        SubmitImmediateFlip(pPresent->hSurface);
    } else {
        // 常规呈现路径
        QueueStandardPresent(pPresent->hSurface);
    }
    return S_OK;
}

4. 硬件特性报告

通过 DXGI1_2_DDI_BASE_CALLBACKS 扩展能力查询:

typedef struct DXGI1_2_DDI_BASE_CALLBACKS {
    DXGI_DDI_BASE_CALLBACKS;
    PFNDDXGIDDI_GETMULTIPLANEOVERLAYCAPS pfnGetMultiplaneOverlayCaps;
    PFNDDXGIDDI_CHECKVIDEOPROCESSORFORMAT pfnCheckVideoProcessorFormat;
} DXGI1_2_DDI_BASE_CALLBACKS;

5. 软件回退路径

若硬件不支持某些11.1特性:

HRESULT MyCreateDevice_11_1(/*...*/) {
    if (!CheckFeatureSupport(D3D11_1_FEATURE)) {
        pCreateData->DXGIBaseDDI.pDXGIDDIBaseFunctions = 
            &dxgi_legacy_funcs; // 回退到基础DXGI DDI
    }
}

6. 调试与验证

  • DXGI 调试工具:使用 DXGI_DEBUG_DDI 层捕获1.2调用
  • PIX for Windows:分析多平面覆盖层合成流程
  • ETW日志:追踪 PresentMultiplaneOverlay 调用频率

关键设计原则:

  • 保持向后兼容,未实现的11.1函数应返回 DXGI_DDI_UNSUPPORTED
  • 所有新增函数必须线程安全
  • 优先使用硬件加速路径(如覆盖层引擎)

网站公告

今日签到

点亮在社区的每一天
去签到