android fence sync

android fence sync是android中引入的一个同步的机制,主要用在display的graphic buffer的同步管理上,可以让对buffer的操作可以并行执行以减少时间。
在BufferQueue中每个buffer都有一个对应的fence fd,他对应了一个fence object,它表明有角色在操作这块buffer,当fence object变为siganled状态的时候,表明这块buffer已经没有再被操作了。
可以简单的把fence理解为一把锁,当它active的时候表明了对buffer的控制,当它为signaled状态时候,表明不再控制buffer,每个需要使用buffer的角色,在使用前都要检查这把锁是否signaled了才能进行安全的操作,否则就要等待。

sync framework的3个重要元素
sync_timeline:
sync的timeline,timeline最终具体的hardware去支持,简单来说可以把timeline看做是一个counter。
sync_pt:sync point,它是sync timeline上的某个点(可以看做是counter的某个值),每个sync point都属于某一个sync timeline。sync point有active,signaled,error3个状态,初始是active状态,之后会变为signaled或者error状态。
sync_fence:sync fence是由一组sync point构成的,这些sync point可以属于不同的sync timeline。(由一组point形成的栏,还是很形象的)

kernel对于sync支持
/dev/sync

sync机制是由/dev/sync来提供支持的。sync device除了提供fence的ioctl接口之外,还提供给了下面3个接口:
sync_timline_create(struct sync_timeline_ops*op,int size,char*name)
sync_pt_create(sync_timeline*parent,int size)
sync_fence_create(char*name,sync_pt*pt)
从这3个api里面可以看出来,sync是不能直接使用,就是前面所说的需要使用sync机制的hardware去提供支持:
具体的hardware需要提供一组sync_timeline_ops去创建sync_timeline
sync_pt的创建,由具体的hardware去设定size来申请内存,用以保存扩展的信息。

/dev/sw_sync
android提供了一个software sync device来提供具体的sync支持:
sw_sync_timeline_create(),使用sync_timeline_create()来创建一个sw_sync_timeline。
sw_sync_pt_creat(),调用sync_pt_create()创建出一个sync_pt。
sw_sync_timeline_inc(),让timeline increate,这样会signal掉timline上point(value)。
这些接口可以在kernel中直接使用,user层也可以通过操作/dev/sw_sync来建立software sync object。


sync_fence的创建和使用
Kernel层面创建的fence

//初始化
int val = 0; //sync pt的值。
struct    sync_timeline* timeline = sw_sync_timeline_create("test-timeline");
......
......
//创建pt和fence
struct sync_pt * pt = sw_sync_pt_create(timeline,*val);
val++;//改变sync pt的值,这样创建出来的sync_pt就会不一样。
struct sync_fence* fence = sync_fence_create("test-fence", pt);
//绑定fd。这个fd可以返回给user层操作。
int fencefd = get_unused_fd();
sync_fence_install(fence,fencefd);
......
......
//inc timeline,会让对应的sync pt释放,也就是对应的fence释放掉。
sw_sync_timeline_inc(timeline, 1);
fence对应的fd在传递到user层之后,我们可以通过操作fd来操作fence了。

user层面使用fence
android层面提供了一组sync的接口来使用fence做同步,在/system/core/libsync下。

//初始化
int val = 0;
int timeline_fd =  sw_sync_timeline_create();
......
......
//创建同步的fence,包含了创建sync pt。
int fencefd = sw_sync_fence_create(timeline_fd, "test-fence", val);
val++;
......
......
//fence fd 可以进行merge,wait等操作
......
......
//释放fence。
sw_sync_timeline_inc(timeline_fd,1);

fence主要有2个操作:
merge操作,将多个fence merge到一个fd中去,这样fence就变为对应多个sync_pt。
wait操作,在user层调用函数sync_wait(),这个函数是等待fence对应的所有的sync_pt从active变为siganled的状态。
注意fence在操作完毕后,要把对应的fd close掉才行。

android中提供了class Fence,该类使用fence的fd来构造,封装了merge和wait的函数,并且会在析构的时候关闭fd,尽量使用这个类来操作fence。


-------------------------------------------

by sky

你可能感兴趣的:(android,display)