• 热门专题

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

作者:迈克老狼2012  发布日期:2012-03-21 21:07:07
Tag标签:Directx11教程  D3D11管线  
  •    从本章开始,我们暂停coding,先来了解一下D3D11的pipeline。


         从前面的教程中,我们知道,要通过D3D11画一个三角形,我们需要做以下步骤:

     

    定义顶点缓冲
    定义索引缓冲
    绑定顶点和索引缓冲到管线
    编译shader代码
    设定shader参数
    绑定shader到pipeline
    执行drawindex,开始画三角形
     


          我们做这些步骤都是通过D3D11API函数实现,包括创建资源(比如顶点缓冲),设置状态(比如深度模版状态),调用draw函数等。D3D runtime会跟踪我们设置的状态,验证其有效性,验证shader链接库等等,然后把这些状态全部传送给UMD,从某种程度上来说,我们可以把D3D runtime看成一个wrapper,是应用程序和UMD之间的接口。

     

         UMD(user mode driver),是指用户模式driver,它其实就是一些动态链接库(dll),完全运行在cpu端,它的主要功能包括:

    shader编译,shader代码最终会被编译成硬件相关的代码,传输到video memory中,shader参数会被传输到video memory中的const buffer中。

     


        UMD能实现一定的内存管理功能,比如创建纹理命令,为纹理分配空间等等(UMD管理的内存主要是GPU能够访问的system memory以及CPU能够直接访问的video memory,这些内存都称作remote memory);调度system memory和mapped video memory之间的传输;转化应用程序所有的状态以及drawing操作成硬件理解的方式(一般是一定格式的packet,通过UMD中硬件抽象层转化为硬件相关的packet,packet类型主要包括硬件寄存器设置packet,drawcall packet等等),然后写入command buffer(或称作DMA buffer),这些buffer先被拷贝到remote buffer,最终会被传送到gpu端的indirect ring buffer。

     

         根据顶点缓冲和索引缓冲创建时候的格式,顶点缓冲和索引缓冲会被UMD直接放入video memory(设置格式为直接创建在video memory中,类似opengl中的vbo)或者延迟载入(创建在system memory中),在gpu实际读取时候,才传入video memory。

     

         我们知道,纹理图像通常是线性格式,而在gpu中我们通常使用z tile格式,在UMD我们并不会进行纹理的地址转化,而是根据传入的参数把特定tile mode传入gpu,gpu会根据tile mode进行纹理的swizzle操作。z order 相关知识可以看wiki页http://en.wikipedia.org/wiki/Z-order_curve

     

          GPU厂商都愿意把更多的功能写入UMD,因为其仅是一个dll,容易调试、可以实现多线程操作(比如一个线程编译shader,一个线程处理纹理),而且即使UMD崩溃了,也不会引起系统蓝屏,因为它和我们普通的应用程序没有本质区别。


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

     

           在多个应用程序使用GPU的情况下,KMD通过slice time分时操作来管理应用程序。比如在一个时间片内一个app进行物理内存操作,另一个时间片内另一个app初始化GPU,设置显示模式等,在不同app间切换时,就需要context switch,响应中断等。

     

          对版权保护的视频内容,KMD会在player和GPU之间建立特殊的path,防止用户模式的代码dump视频内容。

          现在KMD都是thin的,它最重要的功能是管理硬件使用的command buffer,UMD使用的remote buffer就是有KMD负责分配的。Indirect ring buffer也是KMD分配的,它位于video memory中,最终会被传输到GPU的command processor单元。

     

          现在KMD都是thin的,它最重要的功能是管理硬件使用的command buffer,UMD使用的remote buffer就是有KMD负责分配的。Indirect ring buffer也是KMD分配的,它位于video memory中,最终会被传输到GPU的command processor单元。


          下面是我手画的一个简单示意图:

     


     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规