一、 本周主要工作与解决的问题
1.上周写了个RGB图像旋转的代码,但老师说要用GPU来实现,本周狂补GPU的知识,简单说,GPU是并行运算、CPU是串行运算。所以对于图像旋转来说,采用GPU会更快。然而发现GPU编程不简单啊!Shader language目前主要有3种语言:基于OpenGL的GLSL,基于Direct3D的HLSL,还有NVIDIA公司的Cg 语言。英特尔的GPU编程相关可真没有啊!为什么呢?然后这是我的一些关于
2.下了一些别人写的GPU相关的文章来看,特别是关于图像、视频处理方面,主要有。照我的理解来看,比如说,我们要进行GPU图像处理,那基本上就只要用到顶点着色器,像素着色器用不着。因为毕竟只是对原本图像的数据进行处理。
3.了解了下NV12与YV12图像格式,.主要是了解其它数据排列的格式;
4.提出旋转变换 GPU 渲染主要思路,详见;
1.项目中的一个surface或image表示的是显存中的一帧是吧?也就是说整个项目基本上都是在GPU上来完成的,包括编解码、后处理等?
老师回复:是, 主要的对象是一个surface.
2.GPU编程方面英特尔是否有什么资料呢?网上完全搜不到关于英特尔GPU相关的。
老师回复:记得曾经给过, 下面链接是 Programmer's Reference Manuals (PRM)https://01.org/linuxgraphics/documentation/driver-documentation-prms 我们的driver(2D/3D/video)就是根据这个文档写的。
老师回复:GPU 可以处理的对象不仅限于RGBA, 特别是thread, 很多可以由用户控制。在
video中,处理的颜色空间主要是YUV
老师回复:就是这样的,如果没有scaling, 可以直接用data port读取pixel, 否则要用
sampler (牵涉到插值,HW可以帮助完成)
5.驱动里的rendering(i965_render.c 和 i965_output_dri.c)部分其实已经支持rotation,程序里是哪个函数呢?我看了好几次,发现都没找到接口函数?
老师回复:这里是用3D pipeline 去实现的,所以只要把texture坐标变换一下就可以了, 可以参考 i965_fill_vertex_buffer()。6.旋转变换GPU渲染主要包括以下几个步骤:
1) 设置 1 个输入纹理;
2) 对输入纹理进行纹理采样;(这里是否就是surface?)
3) 设置变换矩阵; 4) 在顶点着色器中,将输入顶点与变换矩阵相乘;老师回复:这个不需要考虑, 当你看到一个VA surface时,可以认为数据已经上传到
graphics memory里了。
老师回复:可以这样做,不过要和其他的部分整合在一起。
5) 输出图像数据;(直接输出到帧缓冲区,还要输出到内存不?)
老师回复:输出也是一个VA surface. 你可以在测试例子中调用vaPutSurface()显示, 这样比
较直观。这个思路是否是正确呢?
7.libva和libva-intel-driver都切换到staging 分支,关于rotation的接口在staging分支上。这话不太理解,之前确实对GIT没怎么用过。
老师回复:libva/libva-intel-driver都有两个主要的branch, 一个是master,另一个是
staging. Master上的都是稳定的接口,而staging上都是正在开发的接口
老师回复:在va_vpp.h, 你可以查rotation.
因篇幅问题不能全部显示,请点此查看更多更全内容