Directx11教程(13) D3D11管线(1)

原文: Directx11教程(13) D3D11管线(1)

      从本篇教程开始,咱们暂停代码的学习,先来了解一下D3D11的管线,这些管线不涉及具体的硬件,而是着重于理解可以支持D3D11的管线实现。html

参考资料:windows

http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/api

经过前面的教程,咱们知道,要用D3D11画一个三角形,咱们须要作如下步骤:多线程

 

image

       这些步骤大体分为四个阶段,初始化阶段,数据装配阶段,shader执行阶段,以及合并输出阶段。这些步骤最终会在D3D11硬件设备上上执行。架构

     咱们知道,显卡都有驱动程序,也就是driver,经过driver,windows系统才能和显卡硬件进行交互,完成渲染任务。app

     一般显卡(GPU)的driver有D3D driver和OpenGL driver。 因为微软各代D3D 之间并不彻底兼容,因此D3D driver有分为D3D9 driver,D3D10 driver,D3D11 driver,  D3D12 driver 等等。wordpress

image

 

     首先是咱们的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,可能就要在这个特殊处理层中进行一些补救操做。针对某些特殊软件的优化就放在特殊软件处理层中处理,好比某些跑分程序。

image

     在UMD和KMD之间还有DXGI,这是微软的DirectX图形基础架构,它的设计主要是进行一些底层的操做,它能够看做是KMD的运行库,如今微软把愈来愈多的底层管理放入到了DXGI中。好比显存管理,commandbuffer的调度,同步操做,present后缓冲到前缓冲,显示器的管理等等。3D应用程序也能够直接访问DXGI一部分功能,好比枚举系统中使用的显卡。

 

      KMD( kernel mode driver),是指Kernel模式driver,KMD负责直接和硬件打交道,可能在系统中有多个UMD实例,但KMD只能有一个。一旦KMD崩溃,操做系统可能会出现蓝屏错误,KMD主要功能包括:

一、在多个应用程序使用GPU的状况下,KMD经过slice time分时操做来管理应用程序。

    好比在一个时间片内一个app进行物理内存操做,另外一个时间片内另外一个app初始化GPU,设置显示模式等,在不一样app间切换时,就须要context switch,响应中断等。

二、ASCI的初始化,一套driver会对应多代的显卡,ASIC这儿就是指不一样代的显卡,它们可能架构不一样,KMD要针对当前的硬件,选择合适的ASCI设置。

3. 电源管理,GPU内存资源的分配,回收。

4. command buffer提交到GPU硬件,以便GPU硬件开始buffer中的packet。

下图为d3d11 api和driver的交互框图,从中咱们能够清晰的理解D3d api如何转化为硬件的packet,并被提交到硬件引擎的ring buffer。

        image
相关文章
相关标签/搜索