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

发布于:2025-06-27 ⋅ 阅读:(13) ⋅ 点赞:(0)

Direct3D 版本 11.2 DXGI 函数

本部分中的参考页介绍由用户模式显示驱动程序实现的 Microsoft DirectX 图形基础结构 (DXGI) 函数,这些功能是为 Microsoft Direct3D 版本 11.2 运行时添加的。 Direct3D 11.2 随 Windows 8.1 一起引入。

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

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

PFNDDXGIDDI_PRESENT_MULTIPLANE_OVERLAYCB: PFNDDXGIDDI_PRESENTCB

PFNDDXGIDDI_SUBMITPRESENTBLTTOHWQUEUECB: PFNDDXGIDDI_SUBMITPRESENTTOHWQUEUECB

 备注

Direct3D 11.2 运行时支持的其他 DXGI 函数包含在 用户模式驱动程序实现的多平面覆盖函数部分中。

 1. 版本背景与核心升级

Direct3D 11.2 随 Windows 8.1 引入,其 DXGI DDI 扩展聚焦:

  • 多平面覆盖增强:支持更复杂的混合场景(如HUD+视频+3D场景)
  • 硬件队列优化:新增 SubmitPresentBltToHwQueue 提升Blit效率
  • 显示缩放控制:系统级缩放比例管理(如高DPI显示)

2. 驱动初始化流程

(1) 适配器级注册 (OpenAdapter10_2)
需扩展 D3D10_2DDI_ADAPTERFUNCS 以支持11.2能力查询:

HRESULT OpenAdapter10_2(D3D10DDIARG_OPENADAPTER* pOpenData) {
    pOpenData->pAdapterFuncs_2->pfnGetSupportedVersions = MyGetDDIVersions;
    // ...其他标准函数
}

(2) 设备创建时提供DXGI 1.3 DDI
填充 DXGI1_3_DDI_BASE_FUNCTIONS 结构:

static const DXGI1_3_DDI_BASE_FUNCTIONS dxgi1_3_funcs = {
    .pfnPresent = MyPresentDXGI_11_2,
    // 继承11.1函数...
    // 新增11.2专有函数
    .pfnSubmitPresentBltToHwQueue = MySubmitBltToQueue,
    .pfnReclaimResources = MyReclaimResources
};

3. 关键新增函数实现

(1) 多平面覆盖增强

// 多平面覆盖配置回调(由DWM调用)
HRESULT APIENTRY MyPresentMultiplaneOverlayCB(
    DXGI_DDI_ARG_PRESENT_MULTIPLANE_OVERLAY* pOverlayData
) {
    // 支持每平面独立旋转和混合
    for (UINT i = 0; i < pOverlayData->NumPlanes; i++) {
        ConfigureOverlayPlane(
            pOverlayData->pPlanes[i].PlaneIndex,
            &pOverlayData->pPlanes[i].Transform,
            pOverlayData->pPlanes[i].BlendMode
        );
    }
    return S_OK;
}

(2) 硬件队列提交优化

void APIENTRY MySubmitBltToQueue(
    DXGI_DDI_ARG_SUBMITPRESENTBLTTOHWQUEUE* pBltData
) {
    // 直接提交到硬件Blit引擎队列
    QueueBltCommand(
        pBltData->hSrcResource,
        pBltData->hDstResource,
        &pBltData->BltRect,
        pBltData->ColorSpace
    );
}

(3) 资源回收通知

HRESULT APIENTRY MyReclaimResources(
    DXGI_DDI_ARG_RECLAIMRESOURCES* pReclaimData
) {
    // 标记资源可被GPU内存管理器回收
    for (UINT i = 0; i < pReclaimData->NumResources; i++) {
        MarkResourceAsReclaimable(pReclaimData->phResources[i]);
    }
    return S_OK;
}

4. 硬件特性报告

通过 DXGI1_3_DDI_BASE_CALLBACKS 扩展:

typedef struct DXGI1_3_DDI_BASE_CALLBACKS {
    DXGI1_2_DDI_BASE_CALLBACKS;
    PFNDDXGIDDI_GETSCALINGRECTS pfnGetScalingRects;
    PFNDDXGIDDI_CHECKSCALINGSUPPORT pfnCheckScalingSupport;
} DXGI1_3_DDI_BASE_CALLBACKS;

5. 显示缩放控制

BOOL APIENTRY MyCheckScalingSupport(
    DXGI_DDI_ARG_CHECKSCALINGSUPPORT* pSupport
) {
    // 报告硬件支持的缩放比例范围
    pSupport->MinScaling = 50;   // 最小50%
    pSupport->MaxScaling = 400;  // 最大400%
    return TRUE;
}

6. 调试与验证

Direct3D调试层:启用 D3D11_2DDI_DEBUG 捕获参数错误

GPUView:分析 SubmitPresentBltToHwQueue 执行时序

PIX:捕获多平面覆盖层的混合效果

关键设计原则:

多平面覆盖必须支持至少8个同时活动的平面

硬件队列提交应避免CPU-GPU同步点

缩放控制需与桌面DPI设置联动


网站公告

今日签到

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