Directx11教程(13) D3D11管线(1)
从本篇教程开始,我们暂停代码的学习,先来了解一下D3D11的管线,这些管线不涉及具体的硬件,而是着重于理解能够支持D3D11的管线实现。
参考资料:
http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/
通过前面的教程,我们知道,要用D3D11画一个三角形,我们需要做以下步骤:

这些步骤大致分为四个阶段,初始化阶段,数据装配阶段,shader执行阶段,以及合并输出阶段。这些步骤最终会在D3D11硬件设备上上执行。
我们知道,显卡都有驱动程序,也就是driver,通过driver,windows系统才能和显卡硬件进行交互,完成渲染任务。
通常显卡(GPU)的driver有D3D driver和OpenGL driver。 由于微软各代D3D 之间并不完全兼容,所以D3D driver有分为D3D9 driver,D3D10 driver,D3D11 driver, D3D12 driver 等等。

首先是我们的3D应用程序, 它通过调用D3D11 API函数,实现创建资源(比如顶点缓冲),设置状态(比如深度模版状态),调用drawIndex函数等等。
D3D运行库会跟踪我们设置的状态,验证函数的参数是否正确,验证shader代码以及shader链接库, 编译shader(把shader从原始的HLSL编译成DX ASM, dx的汇编格式shader),另外它还有内存管理以及设备管理的功能。DX运行库的会把应用程序的调用最终传送到用户模式driver(UMD)中,从某种程度上来说,我们可以把DX运行库看成一个包装器,它是应用程序和UMD之间的接口。
UMD(user mode driver)是指用户模式driver,它其实就是一些动态链接库(dll),完全运行在cpu端。GPU厂商都愿意把更多的功能写入UMD,因为其仅是一个dll,容易调试、可以实现多线程操作(比如一个线程编译shader,一个线程处理纹理),即使UMD崩溃了,也不会引起系统蓝屏,因为它和我们普通的应用程序没有本质区别。
UMD主要功能:编译shader(把DX ASM编译成特殊的IL,中间语言,再编译成对应硬件的机器码),转化应用程序的状态设置和drawcall到硬件识别的packet,并把packet放入到command buffer,另外UMD也有一些内存管理功能,比如虚拟地址管理。
UMD最终会产生GPU中各个引擎的workload,比如图形引擎,视频编解码引擎,DMA引擎,computer引擎等等,这些workload都以command buffer的形式传到KMD中,再传给相应的硬件引擎,让它们去做这些工作。
在UMD中,BLT操作管理是处理2D功能,主要就是buffer操作,比如stretch blt,color buffer clear,msaa resolve,内存copy等待。地址库决定memory的布局,比如tile mode,对齐方式,swizzle操作等待。
UMD中还有特殊硬件处理层和特殊软件处理层,因为现在driver都是统一架构的,一套driver驱动不同代的显卡,所以UMD中特殊硬件处理层就是对特殊硬件进行一些操作,比如某代显卡有bug,可能就要在这个特殊处理层中进行一些补救操作。针对某些特殊软件的优化就放在特殊软件处理层中处理,比如某些跑分程序。

在UMD和KMD之间还有DXGI,这是微软的DirectX图形基础架构,它的设计主要是进行一些底层的操作,它可以看作是KMD的运行库,现在微软把越来越多的底层管理放入到了DXGI中。比如显存管理,commandbuffer的调度,同步操作,present后缓冲到前缓冲,显示器的管理等等。3D应用程序也可以直接访问DXGI一部分功能,比如枚举系统中使用的显卡。
KMD( kernel mode driver),是指Kernel模式driver,KMD负责直接和硬件打交道,可能在系统中有多个UMD实例,但KMD只能有一个。一旦KMD崩溃,操作系统可能会出现蓝屏错误,KMD主要功能包括:
1、在多个应用程序使用GPU的情况下,KMD通过slice time分时操作来管理应用程序。
比如在一个时间片内一个app进行物理内存操作,另一个时间片内另一个app初始化GPU,设置显示模式等,在不同app间切换时,就需要context switch,响应中断等。
2、ASCI的初始化,一套driver会对应多代的显卡,ASIC这儿就是指不同代的显卡,它们可能架构不同,KMD要针对当前的硬件,选择合适的ASCI设置。
3. 电源管理,GPU内存资源的分配,回收。
4. command buffer提交到GPU硬件,以便GPU硬件开始buffer中的packet。
下图为d3d11 api和driver的交互框图,从中我们可以清晰的理解D3d api如何转化为硬件的packet,并被提交到硬件引擎的ring buffer。

Directx11教程(13) D3D11管线(1)的更多相关文章
- Directx11教程(53) D3D11管线(8) GS的调度执行
原文:Directx11教程(53) D3D11管线(8) GS的调度执行 在前面的教程中,我们分析了VS-PS的shader管线组合执行过程,本章我们分析一下VS-GS-PS的管线执行 ...
- Directx11教程(18) D3D11管线(7)
原文:Directx11教程(18) D3D11管线(7) 光栅化阶段(RS)之后,将进入PS/OM阶段. 参考外文资料:http://fgiesen.wordpress.com/2011/07/01 ...
- Directx11教程(17) D3D11管线(6)
原文:Directx11教程(17) D3D11管线(6) VS shader输出clip空间的顶点位置及参数信息(比如颜色)到一个FIFO中,之后PA(primitive assembl ...
- Directx11教程(16) D3D11管线(5)
原文:Directx11教程(16) D3D11管线(5) 本章我们学习VS中具体做些什么事情? 首先再看看我们的VS shader代码: Clolor.vs - PixelInputType Col ...
- Directx11教程(15) D3D11管线(4)
原文:Directx11教程(15) D3D11管线(4) 本章我们首先了解一下D3D11中的逻辑管线,认识一下管线中每个stage的含义. 参考资料:http://fgiesen.wordpress ...
- Directx11教程(14) D3D11管线(3)
原文:Directx11教程(14) D3D11管线(3) 现在我们开始学习一些CP(command processor)的知识.参考资料: http://fgiesen.wordpres ...
- Directx11教程(14) D3D11管线(2)
下面我们来了解一些GPU memory的知识,主要参考资料:http://fgiesen.wordpress.com/0211/07/02/a-trip-through-the-graphics-pi ...
- Directx11教程(66) D3D11屏幕文本输出(1)
原文:Directx11教程(66) D3D11屏幕文本输出(1) 在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所 ...
- Directx11教程(43) 纹理映射(13)-动态纹理映射
原文:Directx11教程(43) 纹理映射(13)-动态纹理映射 本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理 ...
随机推荐
- 洛谷P2827 蚯蚓
传送门 pts85/90(90应该是个意外,第一次交是90之后都是85了): 优先队列模拟题意 #include<iostream> #include<cstdio> #inc ...
- qq邮箱问卷,测试不支持form表单
想做个类似苹果调查问卷的: 找到qq邮箱的代码编辑器: 写好我们的网页(h5) <!DOCTYPE html> <html lang="en"> <h ...
- Luogu P1092 虫食算(枚举+剪枝)
P1092 虫食算 题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 4 ...
- 全景还原报错现场 | 应用实时监控 ARMS 上线用户行为回溯功能
随着前端技术日新月异迅猛发展,为了实现更好的前端性能,最大程度提高用户体验,支持单页应用的框架逐渐占领市场,如众所周知的React,Vue等等.但是在单页应用的趋势下,快速定位并解决JS错误却成为一大 ...
- zoj2562 反素数
/* 这题1 <= n <= 1016,暴力肯定是TLM,所以看了大牛求解小于N的反素数的算法,思路大致是这样的: 性质1:一个反素数的质因子一定是从2开始的若干个连续质数. 因此可以枚举 ...
- 闲聊CSS之关于clearfix--清除浮动
一,什么是.clearfix 你只要到Google或者Baidu随便一搜"css清除浮动",就会发现很多网站都讲到"盒子清除内部浮动时可以用到.clearfix" ...
- day38 11-Spring的Bean的属性的注入:对象属性
package cn.itcast.spring3.demo5; public class Person { private String name;//人的名字 private Car2 car2; ...
- 2018-2-13-wpf-PreviewTextInput-在鼠标输入获得-_u0003
title author date CreateTime categories wpf PreviewTextInput 在鼠标输入获得 � lindexi 2018-2-13 17:23:3 +08 ...
- 快速乘O(1)和O(log)
O(1)快速乘来自骆可强:<论程序底层优化的一些方法与技巧> //O(1)快速乘 inline LL quick_mul(LL x,LL y,LL MOD){ x=x%MOD,y=y%MO ...
- CodeVS3958 火车进站
3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路 ...