这里是SunshineBooming,GPU公司一枚小小的Driver工程师,主要工作是写DirectX12 Driver,我会持续更新这个DX12 Spec系列,可能比较冷门,但是都是干货和工作中的心得体会,有任何GPU相关的问题都可以在评论区互动,知无不言:

DirectX12 Spec 总目录

目录

  • 1. Command List
    • 1.1 基本概念
    • 1.2 Direct Command List & Bundle
  • 2. Command Allocator
  • 3. Command Queue
  • 4. 小结
  • 5. API
    • 5.1 Command Allocator
    • 5.2 Command Queue
    • 5.3 Command List
    • 5.4 小结

1. Command List

1.1 基本概念

  • What Command List?
    A command list is a set of commands which the GPU executes,展开说,就是DX12向GPU下发命令不是立即执行的,所有通过API给GPU下发的命令,都会缓存到Command List中,最后再通过API下发执行Command List这样一个命令,执行之前缓存的所有命令。
  • Why Command List
    答案是提升硬件效率,CPU将所有Command缓存起来集中发送到GPU,是优于DX10/11那种随时下发执行方式(Immediate Context)。

1.2 Direct Command List & Bundle

  • Direct Command List: A direct command list corresponds to a command buffer which the GPU can execute, and dose not inherit any GPU state. Aka transient command Lists(TCLs)
  • Bundle: A bundle can be executed only directly via a direct command list and inherit all GPU state. Aka persistent command lists(PCLs).
  • 怎么理解Bundle
    Direct Command List容易理解,就是可以普通的,GPU可以直接执行的Command列表
    Bundle其实也好理解,我们在重复渲染每一帧画面的时候,发现有一些基本命令是可以重复使用的,我们把这些重复使用的命令打包成一个Bundle,让编译器预编译成GPU可以直接执行的命令,这样可以提升硬件效率。

2. Command Allocator

  • Command allocator corresponds to the underlying allocations in which GPU commands are stored.
    前文提到了,Command需要缓存到Command List中的,这个缓存区域就是Command Allocator,这个其实对应于GPU Driver中的Command Pool,是事先分配好的一块GPU Memory(一般Size可以动态增长)。

3. Command Queue

  • A command queue corresponds to a queue of command lists which the GPU will execute.
    Command Queue类似于一个调度器,如果开发者有多个渲染任务(比如说那种双屏的对战游戏),那么我们可以创建1个Command Queue + 2个Command List,Command List对应2个渲染任务,将其都挂到同一个Command Queue下面进行调度。

4. 小结

  • 可以下图概括Command List、Command Allocator、Command Queue之间的关系。其实总结起来就是:Command List记录Command,Command Allocator分配GPU Memory,Command Queue调度Command List

5. API

5.1 Command Allocator

HRESULT CreateCommandAllocator([in]  D3D12_COMMAND_LIST_TYPE type,REFIID                  riid,[out] void                    **ppCommandAllocator
);
  • 这里主要是用来创建Command Allocator,即存储Command所需要的GPU Memory,给到GPU Driver里面其实就是分配一块Command Buffer内存,一般是64KB对齐、动态增长的。
ID3D12CommandAllocator::Reset()
  • 重置Command Allocator对应的GPU Memory,需要注意的是,对应的Command List需要处于close状态,即结束Record Command过程,否则Reset Command Allocator会返回Runtime错误。

5.2 Command Queue

HRESULT CreateCommandQueue(const D3D12_COMMAND_QUEUE_DESC *pDesc,REFIID                         riid,void                           **ppCommandQueue
);
typedef struct D3D12_COMMAND_QUEUE_DESC {D3D12_COMMAND_LIST_TYPE   Type;INT                       Priority;D3D12_COMMAND_QUEUE_FLAGS Flags;UINT                      NodeMask;
} D3D12_COMMAND_QUEUE_DESC;
  • 这里要注意的点就是Command List&Queue&Allocator三者创建的时候,需要Type保持一致,要不然Command List与Command Allocator关联、Command Queue调度Command List时DX12 Runtime都会报错,当然报错的信息打印也都非常清晰。

5.3 Command List

HRESULT CreateCommandList([in]           UINT                    nodeMask,[in]           D3D12_COMMAND_LIST_TYPE type,[in]           ID3D12CommandAllocator  *pCommandAllocator,[in, optional] ID3D12PipelineState     *pInitialState,[in]           REFIID                  riid,[out]          void                    **ppCommandList
);
  • 创建完Command Allocator后,可以创建Command List并与之关联。
  • 这里要注意的点就是Command List&Queue&Allocator三者创建的时候,需要Type保持一致,要不然Command List与Command Allocator关联、Command Queue调度Command List时DX12 Runtime都会报错。
ID3D12GraphicsCommandList::Close()
  • 结束Command List的Record状态,在进入到Close状态之后,Command List才能提交给Command Queue执行。
  • 需要注意的是,Command List不能进行Close->Close的重复设置,否则Runtime会报错。
ID3D12GraphicsCommandList::Reset()
([in]           ID3D12CommandAllocator *pAllocator,[in, optional] ID3D12PipelineState    *pInitialState
);
  • 重置Command List到初始状态,一般Command List状态Init->Record->Close->Submit->Reset这样循环使用。
  • 需要注意的是,Command List在Reset之前必须要进入Close状态,否则Runtime会报错。

5.4 小结

  • 以上列出的都是Command List & Allocator & Queue的一些基本的API,还有更多的API太多了就没有一一列举了。

DirectX12 - Command List(命令列表)相关推荐

  1. php artisan 命令列表

    php  artisan 命令列表 命令获取 上面的翻译内容 命令 说明 备注 php artisan make:resource ? 创建api返回格式化资源 >=5.4版本可用 php ar ...

  2. Command(命令)--对象行为型模式

    Command(命令)–对象行为型模式 一.意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 二.动机 1.在软件构建过程中,& ...

  3. 安装 Git 之后系统自动添加自定义快捷命令列表

    安装 Git 命令之后,Git 会在我们的系统中自动添加了一些快捷命令,比如 git add . 只需要输入ga .即可,以下是支持的快捷命令列表: g=git ga='git add' gaa='g ...

  4. php artisan命令表,php artisan 命令列表

    php  artisan 命令列表 命令获取 上面的翻译内容 命令说明备注 php artisan make:resource ?创建api返回格式化资源>=5.4版本可用 php artisa ...

  5. .NET中的Command(命令)模式

    在Command(命令)模式中,使用对象来表示和封装稍后调用该方法所需的全部信息--这些信息包括方法名.拥有该方法的对象.及参数值.在系列文章".NET中的Command(命令)模式&quo ...

  6. Hadoop端口介绍及各种启动命令列表

    Hadoop端口介绍 9000 namenode的常用端口 给机子 8020 namenode的RPC调用端口(接收Client连接的RPC端口,用于获取文件系统metadata信息) 50070 n ...

  7. linux服务器运维操作命令,Linux服务器运维常用命令列表

    每时每刻,我们都需要参考某种Linux命令列表.也许您是一名服务器系统管理员,正在逐步完成任务,突然间您脑筋急转弯.或者,也许您是通过Linux学习的初学者,这里有一些有用的Linux命令! 1 –查 ...

  8. Ubuntu 20.04.2.0 LTS 下安装Geany 1.36的命令列表

    [命令列表] sudo apt-get install aptitude sudo aptitude install geany sudo aptitude install g++ 依序输入上述三条命 ...

  9. java版tp指令,VAG TP 2.0完整的AT命令列表

    我试图在斯柯达Rapid 2009模型中找到各种ECU的DTC . 我使用的是OBDLink SX(elm 327芯片)和Putty(类似于HyperTerminal) https://jazdw.n ...

  10. linux中list命令,Linux基础命令列表

    命令列表 A alias B bc basename bash -n -x C clock cal cd clear cat /etc/motd /etc/issue -A cp chown chgr ...

最新文章

  1. Android adb常用命令
  2. 05章项目:我的租房网
  3. 管理信息系统 课程设计(2018-6-16)
  4. 单一课和综合课的划分依据_武夷岩茶产地如何划分?
  5. html页面高度设为自动,html – CSS:响应式布局中的高度自动问题
  6. Python ——告白小程序,添加微信号(快来设置你的freestyle吧)
  7. 用 Gearman 分发 PHP 应用程序的工作负载(转载)
  8. java恐怖游戏_分享个经典恐怖游戏系列
  9. 《C++(一)--类》
  10. ansys与solidworks关联失败,将SolidWorks模型导入ansys划分网格总是提示错误
  11. “夏栀的博客”网站一期建站通知贴
  12. Linux命令之压缩gzip
  13. 应用集成——数据库集成与简单实现IoC容器
  14. 信息安全人员关注网站
  15. android surfaceview 背景颜色,android – 设置Surface View的背景颜色
  16. 发布两款超1级能效空调 再次腰斩行业价 苏宁小Biu点燃空调市场
  17. Ubuntu装系统后重启卡死解决办法(超详细)
  18. 89C51单片机数码管显示
  19. 视频转图片-人脸识别-合成视频
  20. 深度强化学习——Dueling-DDQN

热门文章

  1. sfdisk使用详解含实例
  2. 【matlab小技巧】寻找一个向量中最后一个非零元素的位置
  3. Android学习——xUtils框架
  4. 70、基于STM32单片机的蓝牙智能热水器控制系统设计温度温控水温水位检测
  5. QImage缩放后如何提升图片质量
  6. 什么是专家系统?专家系统的一般结构是什么?
  7. 用Power BI 拖拽轻松做销售仪表盘(一次学会条形图,矩形图,折线图,树状图,饼图,切片器)
  8. 服务器推送消息方法总结及实现(java)
  9. L3-001 凑零钱 深搜
  10. File文件创建方法createNewFile