一、 本周主要工作与解决的问题
1.最近一直在看PRM,看得还是不是有理解,然后因为换了个电脑,又得重装linux,这次改成Unbuntu,然后就配置各种工具、函数了。
static void i965_fill_vertex_buffer( VADriverContextP ctx, float tex_coords[4], /* [(u1,v1);(u2,v2)] */(surface 的左上角和右上角) float vid_coords[4] /* [(x1,y1);(x2,y2)] */(enclosing region的左上角和右下角) ) { struct i965_driver_data * const i965 = i965_driver_data(ctx); float vb[12]; enum { X1, Y1, X2, Y2 }; static const unsigned int g_rotation_indices[][6] = { [VA_ROTATION_NONE] = { X2, Y2, X1, Y2, X1, Y1 },(右下角-》左下角-》左上角) [VA_ROTATION_90] = { X2, Y1, X2, Y2, X1, Y2 },(顺时针旋转90度,此时(x2,Y1)变为右下角,) [VA_ROTATION_180] = { X1, Y1, X2, Y1, X2, Y2 }, [VA_ROTATION_270] = { X1, Y2, X1, Y1, X2, Y1 }, }; const unsigned int * const rotation_indices = g_rotation_indices[i965->rotation_attrib->value]; vb[0] = tex_coords[rotation_indices[0]]; /* bottom-right corner */ vb[1] = tex_coords[rotation_indices[1]]; vb[2] = vid_coords[X2]; vb[3] = vid_coords[Y2]; vb[4] = tex_coords[rotation_indices[2]]; /* bottom-left corner */ vb[5] = tex_coords[rotation_indices[3]]; vb[6] = vid_coords[X1]; vb[7] = vid_coords[Y2]; vb[8] = tex_coords[rotation_indices[4]]; /* top-left corner */ vb[9] = tex_coords[rotation_indices[5]]; vb[10] = vid_coords[X1]; vb[11] = vid_coords[Y1]; dri_bo_subdata(i965->render_state.vb.vertex_buffer, 0, sizeof(vb), vb); }
原本想在这个函数的基础上来改,但还是出了点儿问题。。
二、之前给的老师的一个答复
关于GPU编程: 你可以选择用OpenCL, 下面是Intel平台上的一个OpenCL的一个开源实现 http://wiki.freedesktop.org/www/Software/Beignet/ 不过基于以下考虑目前libva-intel-driver并没有调用OpenCL. 1. 会造成libva-intel-driver 依赖于OpenCL 2. libva 与 OpenCL之间的接口没有定义好,不能共享GPU内存,做不到零拷贝,效率可能会比较低。 所以在libva-intel-driver里用的都是比较底层的方法 给你的PRM是关于Intel GPU的编程接口,比较底层,OpenCL, libva 还有3D驱动都是基于该文档实现的。 前面说过,你可以基于一个3D pipeline来做这个事情,如果前面状态都设置正确,在PS thread里可以得到 每一个pixel的正确位置。把原始图像当成一个贴图,通过设置正确的贴图坐标就可以实现旋转。 也可以用media pipeline来做,每个media thread 都是通过一个MEDIA_OBJECT命令发起的,MEDIA_OBJECT命令 是基于块的。可以把块的左上角坐标当成参数传给每个thread, 通过这个方法就能处理整个surface了。
随写:本周因为华为来学校招人了,唉。报错了岗位,应该报软件开发工程师的,选了算法工程师,有一个问题答不上来,一个答得不好,其它的都还可以,终面也发挥不错。不过,最后估计可能还是要跪了。。。。技术面表现太差了。