1:概述
GPU接收CPU发送的渲染命令,执行相应的计算,渲染命令在CPU和GPU之间传递,由CPU发送给GPU。AMD的GPU有两种命令发送方式,第一种是CPU通过直接写GPU的寄存器,发送相应的渲染命令,对于GPU来说,这种方式是CPU将命令push给自己,然后开始工作,被称为push模式;第二种是系统初始化时CPU在主存上分配一块内存,用作存放GPU的渲染命令,当CPU有渲染需求时就往这块内存写命令并通知GPU读取,这种方式对GPU来说,需要主动去主存上把渲染命令pull过来,然后开始工作,被称为pull模式。通常情况下AMD都建议使用pull模式,只有系统内存不适合pull模式时采用push模式。本文分析的是pull模式,这是linux AMD GPU驱动的工作方式。
2:相关buffer
GPU下有两种buffer: ring buffer, indirect buffer。
- ring buffer:存放写寄存器的命令
- indirect buffer:存放渲染的命令
3:两者关系
当上层应用要传递渲染命令时,会在ring buffer中先放两条写寄存器命令,一个向gpu的IP BASE寄存器中写入indirect buffer 的地址。另一个是向buffer size寄存器中写入大小。这样就会触发GPU去BASE寄存器所指向的位置去取渲染指令执行,直到size大小。 如果在第一个indirect buffer最后又是向BASE寄存器写入地址,SIZE寄存器写入大小。那么GPU会继续执行BASE指向的另一块indirect buffer。