SylixOS嵌入式操作系统|论坛

 找回密码
 注册
搜索
查看: 11484|回复: 0
打印 上一主题 下一主题

Vivante GCXX系列GPU驱动工作原理简介

[复制链接]

6

主题

18

帖子

173

积分

版主

Rank: 7Rank: 7Rank: 7

积分
173
跳转到指定楼层
楼主
发表于 2017-6-7 17:33:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、FrameBuffer简介
    SylixOS下将显示设备抽象为一个文件,一般为/dev/fb0、/dev/fb1等,通过对fb设备文件的操作就可以直接操作显示设备。本质就是读写显示设备的“显示区域,也就是一块内存区域,只要将要在屏幕上显示的数据准备好,然后填入这块区域,显示控制器就能在屏幕上显示图像,这块“显示区域”就叫做FramBuffer。如下图所示:

    假设屏幕的分辨率为1024*600,单个像素的颜色数据用RGBA表示,也就是一个像素颜色用4字节表示,那么这个屏幕的FramBuffer大小为1024*600*4字节,也就是2400KB。

二、Vivante GPU渲染原理简介   
    1.将GPU需要计算的原始数据准备好
    2.启动GPU计算
    3.得到计算结果,这个结果就是一帧屏幕图像数据
    4.将第3步的得到的数据拷贝到FramBuffer,这样GPU渲染的一帧图像就在显示设备上显示出来了


三、Vivante GPU驱动工作原理   
    1.Contex Buffer
        GPU在启动渲染前需要设置其状态,也就是渲染环境,这些设置命令专门存放buffer中,这个buffer叫做contex buffer。如果GPU的渲染环境需要改变,就需要重新填写contex buffer中的内容。
    2.Command Buffer
        在设置好contex buffer后,就可以让GPU做渲染(计算)工作了,这些渲染指令也被放在专门的buffer中,这个buffer叫做command buffer。
    3.Command queue
        GPU除了设置状态和渲染指令外,还有一些控制类指令,类似于CPU的CALL、JMP等,通过这些控制指令来控制contex buffer和command buffer,这些指令同样被放在专门的buffer中,这个buffer叫做command queue。

    4.GPU的event同步机制
        当GPU的渲染工作完成后,会执行一条event指令,这条event指令是事先被填在command queue中的。event指令可以表示0~29共30个event,当执行event指令后,GPU会产生中断,中断程序通过读取GPU的中断状态寄存器,就可以知道发生的是哪个event的中断,从而执行相应的处理程序。


    如上图所示,GPU从command queue开始执行指令,link指令相当于一条跳转指令,跳到contex buffer中执行设置GPU环境的指令,设置好环境后接着又通过link指令跳转到command buffer中执行渲染指令,渲染指令执行完后再次通过link指令跳回command queue,然后执行event命令,GPU产生中断,CPU处理中断相关内容。最后的link/wait指令让GPU处于等待状态,直到有新的指令可以执行。
四、驱动中event管理简介
1.空闲event控制块链表

每个event信息都是存放在一个event控制块中的,驱动初始化的时候会生成固定个数的event控制块,然后将这些event控制块构造成一个单向链表。如果有event信息产生,就从链表中取出一个控制块,将event信息填写进去。如下图所示,一个这样的控制块就叫做一个record。








2.Event queue
    每个record都有一个类型,相同类型的record会被链在一起,然后通过一个event queue来管理。驱动里共维护了30个这样的event queue,正好和GPU的event指令表示的范围相吻合。如下图:


五、Command queue执行流程分析
1.command queue初始化
    初始化很简单,就是在command queue中添加了wait/link指令。wait指令的作用是让GPU空闲n个周期,link指令指向的是command queue中wait指令的地址,这样就形成了一个“闭环”,GPU就不会跑飞了,如下图所示:


2.在context buffer中添加link指令
    context buffer中的link指令指向command buffer首地址。如下图


3.再次添加wait/link指令


4.在command buffer中添加link指令
    command buffer中的link指向command queue中的wait指令地址,如下图所示:
5.将command queue中此时第一个wait指令改成link指令
    command queue中改完后的link指令指向context buffer首地址,从此刻开始,GPU就跳转到context buffer中运行了。如下图:
6.在command queue中添加event指令
7.再次添加wait/link指令
8.将此时command queue中的第一个wait指令改成link指令
    command queue中改完后的link指向command queue中的event指令地址,如下图所示:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
SylixOS官方讨论群:32537017
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|Acoinfo Inc. All Rights Reserved. ( 京ICP备15059934号

GMT+8, 2024-11-21 18:51 , Processed in 0.034337 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表