DXGI是windows系统中用户模式下最底层的图形设备接口.
DXGI 直接与硬件驱动打交道.
DXGI对上提供a common framework for future graphics components.
应用程序可以直接访问DXGI. 或者通过Direct3D的API来访问,这些API帮你与DXGI进行通信.
如果你的应用需要枚举设备或者想要控制数据如何被输出,你可能需要直接与DXGI通信.
Enumerating Adapters 枚举适配器
适配器是一种 计算器软件和硬件能力 的抽象.
通常情况下,你的机器上会有很多适配器. 有一些设备在硬件上实现,有一些在软件上实现.
适配器实现 图形应用程序使用 的功能.
如图, 展示了一个计算机. 两个适配器(video card). 三个输出显示器(output monitor).
当枚举这些硬件时:
IDXGIOutput1: 每个硬件设备上可能有多个输出接口,因此每个接口对应一个Output;
IDXGIAdapter2: 对每一个video card(即便是集显),简单理解为一个硬件设备;
当枚举完成,使用 IDXGIFactory (完成枚举的主控工厂);
如果你想要选择指定的某个video hardware.
推荐对每一个adapter handle 迭代调用:
D3D11CreateDevice or D3D11CreateDeviceAndSwapChain
通过达到某个 feature level 来选择.
Each video card implements a certain level of Microsoft DirectX (DX) functionality depending on the graphics processing units (GPUs) installed.
每个视频卡根据GPU实现某种Level的DX能力.
如 9_1 feature level 被Direct3D 9实现 / 11_0 feature level 被Direct3D 11实现.
对于DX版本 / Shader models / feature levels 都有一个独特的编号系统:
- Direct3D versions use a period; for example, Direct3D 12.0.
- Shader models use a period; for example, shader model 5.1.
- Feature levels use an underscore; for example, feature level 12_0.
Presentation 送显
你的应用的主要任务是: render frames,然后通知DXGI去显示这些帧到输出.
按照某个帧率来送显,可能需要不止两个buffer.
The set of buffers created is called a swap chain
创建的缓冲叫做交换链.
A swap chain has one front buffer and one or more back buffers.
交换链通常需要一个前置缓冲,和一个后者多个后置缓冲.
Create a Swap Chain 创建交换链
In DXGI, a swap chain is tied to a window when the swap chain is created.
在DXGI中,当一个交换链被创建,它会绑定到一个窗口. 这可以节约内存且提高performance.
之前的版本DX,允许改变交换链绑定的窗口.
In DXGI, a swap chain is tied to a rendering device on creation.
在DXGI中,一个交换链被绑定到一个渲染设备?
In DXGI, the swap effects available are DXGI_SWAP_EFFECT_DISCARD and DXGI_SWAP_EFFECT_SEQUENTIAL.
在DXGI中,一个交换效果是 DXGI_SWAP_EFFECT_DISCARD 和 DXGI_SWAP_EFFECT_SEQUENTIAL.
DISCARD 丢弃
SEQUENTIAL 顺序
Care and Feeding of the Swap Chain
TODO: Resize问题
DXGI Responses from DLLMain
由于做项目的时候就遇到了这个问题.
想在DLLMain中初始化DXGI使用DX,却反悔错误.
由于dll被加载和卸载的时机不能被保证.推荐不要在 DllMain 中使用DXGI和DX的方法.
为了防止这个问题:
- If your app’s DllMain function releases its last reference to a DXGI factory, DXGI raises an exception.
- If your app’s DllMain function creates a DXGI factory, DXGI returns an error code.