电子说
drm 给 GPU 发送硬件命令时,会将命令放置在一个环形缓冲区,显卡将会从这个环形缓冲区取命令执行。它的工作原理基于一个循环队列,数据存放在一个环装区域。CPU 会将命令从队列尾插入,GPU 会从队头取数据,队头和队尾在不断地更新中。这个环形缓冲区存放在 GTT 内存中,以便显卡可以访问到。
CPU 和 GPU 将各自维护一些数据结构来保证环形缓冲区的正确工作。这些 数据结构有缓冲区的基地址,缓冲区大小,写指针和读指针。其中写指针和读指针分别指向 CPU 将要写入命令的地址和 GPU 将要读取命令的地址。当这一次的读取命令或者写入命令结束之后,这两个指针都会往前移动。当指针到达队列的末尾时,将会移到队列的头部继续执行。如果我们不加处理的话,就可能会发生读指针读取了没有写入新命令的地址, 或者是写指针把命令写到了命令还没有被 处理的区域。
因而当 CPU 写入命令时,它应该通知 GPU。而 GPU 在读取命令之后,应该通知 CPU。通知操作借由写 CPU 中的读指针副本和 GPU 中的写指针副本完成。环形缓冲区示意图如下图。
初始阶段,读指针和写指针指向同一区域,随着程序的运行,读指针和写指针可能会再次相遇,这时有可能是队列空,也有可能是队列满,为了避免二义性,我们避免发生队列满的情况,总在队列将满时,将命令流装入新的缓冲区。那么驱动要时时监控着缓冲区的操作,当队列空时停止读取,当队列将满时,将读操作挂起。
全部0条评论
快来发表一下你的评论吧 !