1 Direct3D 11设备介绍

Direct3D设备可以用来创建和释放对象,渲染图元,与图形驱动和硬件通信。Direct3D 11将设备分离为一个创建资源的设备(device)对象的对象和一个执行渲染的设备环境(device-context)对象。这种划分的设计目的是为了支持多线程之便。

1.1 设备

设备用来创建资源和枚举显示适配器支持的功能。在Direct3D 11中,设备对象由ID3D11Device接口创建。

每个应用程序必须至少有一个设备,大多数应用程序只创建一个设备。通过调用D3D11CreateDevice或者D3D11CreateDeviceAndSwapChain并指定D3D_DRIVER_TYPE标志为一个硬件驱动创建设备。根据功能需求,每个设备可以使用一个或多个设备环境。

1.1.1 由D3D11CreateDevice创建设备对象

HRESULT D3D11CreateDevice(
__in    IDXGIAdapter *pAdapter,
__in    D3D_DRIVER_TYPE DriverType,
__in    HMODULE Software,
__in    UINT Flags,
__in    const D3D_FEATURE_LEVEL *pFeatureLevels,
__in    UINT FeatureLevel,
__in    UINT SDKVersion,
__out   ID3D11Device **ppDevice,
__out   D3D_FEATURE_LEVEL *pFeatureLevel,
__out   ID3D11DeviceContext **ppImmediateContext
);
  • pAdapter: 指向用来创建设备的显示适配器的指针。NULL表示使用默认的适配器
  • DriverType: 指定驱动类型,常用的有D3D_DRIVER_TYPE_HARDWARE,使用硬件驱动
  • Software: 实现软件光栅器的DLL的句柄。如果DriverType是D3D_DRIVER_TYPE_SOFTWARE,Software不能为NULL
  • Flags: 运行时层标记
  • pFeatureLevels:指向D3D特性等级数组的指针,如果为NULL,则使用默认的特性等级数组:

{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_1,
}

  • FeatureLevel: pFeatureLevels中的元素个数
  • SDKVersion: SDK版本,使用D3D11_SDK_VERSION
  • ppDevice: 返回指向创建的设备对象的指针的地址
  • pFeatureLevel: 返回pFeatureLevels数组中第一个测试成功的特性等级
  • ppImmediateContext:返回指向创建的设备环境的指针的地址

1.1.2 由D3D11CreateDeviceAndSwapChain创建设备对象

HRESULT D3D11CreateDeviceAndSwapChain(
__in    IDXGIAdapter *pAdapter,
__in    D3D_DRIVER_TYPE DriverType,
__in    HMODULE Software,
__in    UINT Flags,
__in    const D3D_FEATURE_LEVEL *pFeatureLevels,
__in    UINT FeatureLevel,
__in    UINT SDKVersion,
__in    const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
__out   IDXGISwapChain **ppSwapChain,
__out   ID3D11Device **ppDevice,
__out   D3D_FEATURE_LEVEL *pFeatureLevel,
__out   ID3D11DeviceContext **ppImmediateContext
);

D3D11CreateDeviceAndSwapChain比D3D11CreateDevice多了两个参数。

  • pSwapChainDesc: 指向交换链描述的指针,
  • ppSwapChain: 指向创建的交换链对象的指针的地址
typedef struct DXGI_SWAP_CHAIN_DESC {DXGI_MODE_DESC   BufferDesc;DXGI_SAMPLE_DESC SampleDesc;DXGI_USAGE       BufferUsage;UINT             BufferCount;HWND             OutputWindow;BOOL             Windowed;DXGI_SWAP_EFFECT SwapEffect;UINT             Flags;
} DXGI_SWAP_CHAIN_DESC;
  • BufferDesc: 描述后缓冲的显示模式
  • SampleDesc: 描述多重采样参数
  • BufferUsage: 描述表面的用法和CPU访问后缓冲的操作。后缓冲用于着色器输入或渲染对象输出
  • BufferCount: 缓冲区个数,包括前缓冲
  • OutputWindow: 输出窗口句柄,不能为NULL
  • Windowed: true表示窗口模式,false表示全屏模式
  • SwapEffect: 枚举类型。描述了提交表面后处理缓冲区内容的可选方法
  • Flags: 枚举类型。描述交换链的行为
typedef struct DXGI_MODE_DESC {UINT                     Width;UINT                     Height;DXGI_RATIONAL            RefreshRate;DXGI_FORMAT              Format;DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;DXGI_MODE_SCALING        Scaling;
} DXGI_MODE_DESC, *LPDXGI_MODE_DESC;

显示模式描述

  • Width: 分辨率宽
  • Height: 分辨率高
  • RefreshRate: 结构类型。描述刷新频率
  • Format: 结构类型。描述显示模式
  • ScanlineOrdering: 枚举类型。描述扫描线绘制模式
  • Scaling: 枚举类型。描述缩放模式

1.2设备环境

一个设备环境包含了设备使用的环境或配置。确切的说,设备环境用来设置管线状态,并使用资源生成渲染命令。Direct3D 11实现了两种设备环境,一种是及时渲染,另一种是延迟渲染;两种环境对象都由ID3D11DeviceContext接口实现。

1.3即时环境

即时环境即直接由驱动渲染。即时环境可以从GPU检索数据,每个设备只能有一个即时环境。即时环境可以用来立即渲染一个命令列表。

有两种获得即时环境的方法:

  • 通过调用D3D11CreateDevice或D3D11CreateDeviceAndSwapChain
  • 通过调用ID3D11Device::GetImmediateContext

1.4延迟环境

延迟环境将GPU命令记录到一个命令列表。延迟环境主要用于多线程,而对于单线程的应用是不需要的。延迟环境一般由辅助线程使用而不是主线程。当创建一个延迟环境时,不会继承即时环境的任何状态。

为获得延迟环境,可以通过调用ID3D11Device::CreateDeferredContext.

任何环境(即时或者延迟)都可以用于任何线程,只要保证每个线程每次只用一个环境。

1.5关于线程

Direct3D 11和之前版本Direct3D在线程模型上的不同:

所有ID3D11Device接口的方法都是线程自由(free-threaded)的。所谓线程自由是指多个线程同时调用函数是安全的。

  • 所有ID3D11DeviceChild的派生接口(ID3D11Buffer, ID3D11Query等)都是线程自由的。
  • Direct3D 11将资源创建和渲染分离为两个接口。Map, Unmap, Begin, End和GetData由ID3D11DeviceContext实现,因为ID3D11Device定义了很严格的操作顺序。ID3D11Resource和ID3D11Asynchronous接口的方法也是线程自由的。
  • ID3D11DeviceContext的方法不是线程自由的,即,它们需要单线程。每次只有一个线程可以安全的调用它的任何方法(Draw, Copy, Map等)。
  • 一般的,线程自由减少了同步元操作的次数和持续时间。使用同步的应用程序保存很长时间,这会直接影响程序所能达到的并发程度。

ID3D10Device接口方法没有设计成线程自由的。ID3D10Device实现了所有的创建和渲染功能(跟Direct3D 9中的ID3D9Device一样)。Map和Unmap在ID3D10Resource的派生接口中实现。Begin, End和GetData在ID3D10Asynchronous的派生接口中实现。

2软件层

Direct3D 11的运行时由层构成,包括核层的基础功能及外层的可选创建和辅助开发功能。该部分介绍每个层的功能。

一般的,层增加功能,但不改变现有的行为。例如,不管调试层是否实例化,核函数的返回值都是一样的,虽然调试层的实例化会带来额外的调试输出。

层的创建是在创建设备时,通过调用D3D11CreateDevice或D3D11CreateDeviceAndSwapChain并提供一个或多个D3D11_CREATE_DEVICE_TYPE值。

2.1 核层

核层是默认存在的;只提供很少的API和设备驱动间的映射,减少高频率调用的开销。由于核层对性能的重要性,它只执行重要的验证。其他的层是可选的。

2.2 调试层

调试层提供了大量的附件参数和一致性验证(比如检验着色器连接和资源绑定,检验参数一致性和报告错误描述)。

要创建支持调试层的设备,必须安装DirectX SDK(来获得D3D11SDKLayers.dll),然后再调用D3D11CreateDevice或D3D11CreateDeviceAndSwapChain时指定D3D11_CREATE_DEVICE_DEBUG标记。注意运行具有调试层的应用程序会很慢。

3 创建交换链

因为创建Direct3D设备时可以不创建交换链。为了创建交换链,检索得到用来创建device的factory是必须的。
可以通过GetParent得到dxgiDevice对象的父对象dxgiAdapter,进一步得到dxgiAdapter对象的父对象dxgiFactory。接口继承关系图为:

图:该图来源自DXSDK\Documentation\DirectX9\windows_graphics.chm

用QueryInterface索引到device对象上的指向IDXGIDevice对象的指针,__uuidof(*ppParent)用来得到接口的GUID标识。

void mCreateSwapChain()
{ID3D11Device *device = 0;DXGI_SWAP_CHAIN_DESC sd;IDXGIDevice *dxgiDevice = 0;//通过检索IDXGIDevice接口的GUID,返回device对象上的指向IDXGIDevice接口的指针device->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice);IDXGIAdapter *dxgiAdapter = 0;//得到dxgiDevice对象的父对象dxgiAdapterdxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter);IDXGIFactory *dxgiFactory = 0;//得到dxgiAdapter对象的父对象dxgiFactorydxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory);IDXGISwapChain *swapChain;dxgiFactory->CreateSwapChain(device, &sd, &swapChain);dxgiDevice->Release();dxgiAdapter->Release();dxgiFactory->Release();
}

:本文翻译整理自DXSDK文档,参考有Introduction to 3D Game Programming with DirectX 11,MSDN库

转载请注明出处:http://blog.csdn.net/sjb358714/article/details/8639503

DX11——基本概念及初始化流程(一)相关推荐

  1. Android博通BCM libbt-vendor.so 分析蓝牙初始化流程

    一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍. 第二篇:Transp ...

  2. Direct3D 12入门教程之 ---- Direct3D 12初始化流程

    注:以下内容参考自 书籍:<DirectX 12 3D>游戏开发实战, 微软官方的 DirectX样例程序:DirectX-Graphics-Samples, 参见github链接:htt ...

  3. 第七章 frr sysrepo纳管初始化流程分析

    本章节主要是通过分析frr sysrepo纳管实现来讲讲frr-7.5是如何实现对sysrepo的支持.以isis协议纳管实现为例.了解本章节的内容需要先了解前面章节的内容.本章节的内容不会过多重复前 ...

  4. Linux内核网络栈1.2.13-网卡设备的初始化流程

    参考资料 <<linux内核网络栈源代码情景分析>> 网卡设备的初始化 本文主要描述一下网卡设备的整个初始化的过程,该过程主要就是根据设备的硬件信息来获取与传输网络数据,注册相 ...

  5. 开机流程简介--init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

    init 处理系统初始化流程 (/etc/rc.d/rc.sysinit) 还记得上面提到 /etc/inittab 里头有这一句' si::sysinit:/etc/rc.d/rc.sysinit ...

  6. 关于Flutter初始化流程,我必须告诉你的是...

    作者:闲鱼技术-然道 1. 引言 最近在做性能优化的时候发现,在混合栈开发中,第一次启动Flutter页面的耗时总会是第二次启动Flutter页面耗时的两倍左右,这样给人感觉很不好.分析发现第一次启动 ...

  7. OAuth2基本概念和运作流程

    OAuth2基本概念和运作流程 OAuth(开放授权)是一个关于授权的开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方 ...

  8. SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

    我们启动web服务器,在浏览器中输入地址,就可以看到浏览器上输出我们写好的页面.为了更好的理解上面这个过程,你需要学习关于Servlet生命周期的三个阶段,就是所谓的"init-servic ...

  9. 深入分析 Flutter 初始化流程

    在调研 Flutter 动态化方案的时候,需要了解 Flutter 加载 dart 产物的流程,阅读了一部分源码,顺便也读了初始化相关的代码.于是梳理了一遍 Flutter 的初始化流程 flutte ...

最新文章

  1. 新闻更新php html,phphtml 新闻发布系统,运用php+mysql,里面包括数据库和php文件。 Other systems 其他 249万源代码下载- www.pudn.com...
  2. linux grep 基本正则表达式与扩展正则表达式使用解析
  3. python怎么读取文件-python如何读取文件的数据
  4. 微信OAuth2网页授权登陆接口
  5. 个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能...
  6. 7-1 寻找大富翁 (25 分)(思路加详解+两种做法(一种优先队列,一种vector容器))
  7. N - Dragon Balls(并查集+深度的意义
  8. 尝试一种新的生命状态
  9. SSIS工具的ETL过程,全量ETL和增量ETL过程教程
  10. androidstudio打包apk 文件_每天一个小知识——APK瘦身
  11. CSS重新认识(一)
  12. linux 声卡驱动测试,Linux声卡驱动移植和测试
  13. cad怎么查找未闭合_CAD应该怎么测量图形?未封闭、不规则的图形要这样测量
  14. 【渝粤题库】陕西师范大学200101 西方文学 作业(高起专)
  15. 使用Fiddler抓取websocket包-Android
  16. macsv服务器状态,macsv操作员站下装过程及服务器下装过程备课讲稿.pdf
  17. 常用windows XP 系统命令
  18. java 四边形_Java 实例 – 打印平行四边形
  19. #define STATIS_SObj ((struct statis volatile far *) 0x000000)
  20. Excel 中的协方差阵

热门文章

  1. gRPC 在 Go 语言中的安装与简单实践
  2. 由一段音乐想起的生活片段
  3. 8k30视频拼接器方案 - 多接口2x2拼接器实现方法
  4. 解决华为手机EMUI 9之后,GMS无法使用问题
  5. 正版腐蚀怎么进服务器,腐蚀怎么联机 腐蚀搭建服务器图文教程
  6. Android实现异步从网络加载图片列表
  7. python---FlaskAPI基本用法
  8. C# excel转换Json
  9. Inno Setup 制作exe安装包
  10. Google Earth Engine(GEE)——全球建筑物矢量图免费下载Open Buildings V1 Polygons