WaylandWeston多屏显示
Posted 林多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WaylandWeston多屏显示相关的知识,希望对你有一定的参考价值。
Weston多屏显示
- Weston默认支持多屏显示(比如前屏+后屏)
- output对象可以理解为逻辑上的一块屏幕,对于DRM,其信息通过drmModeGetResources接口获得。
- View结构体中有两个成员用来 记录output信息,一个保存output对象的引用来作为primary output,一个用来记录当前View显示的output信息。
struct weston_view
// 省略
/*
* The primary output for this view.
* Used for picking the output for driving internal animations on the
* view, inheriting the primary output for related views in shells, etc.
*/
struct weston_output *output;
/*
* A more complete representation of all outputs this surface is
* displayed on.
*/
uint32_t output_mask;
- weston_view_assign_output函数负责给view分配output对象。
static void
weston_view_assign_output(struct weston_view *ev)
struct weston_compositor *ec = ev->surface->compositor;
struct weston_output *output, *new_output;
pixman_region32_t region;
uint32_t max, area, mask;
pixman_box32_t *e;
new_output = NULL;
max = 0;
mask = 0;
pixman_region32_init(®ion);
wl_list_for_each(output, &ec->output_list, link)
if (output->destroying)
continue;
pixman_region32_intersect(®ion, &ev->transform.boundingbox,
&output->region);
e = pixman_region32_extents(®ion);
area = (e->x2 - e->x1) * (e->y2 - e->y1);
// 计算mask
if (area > 0)
mask |= 1u << output->id;
// 选择output
if (area >= max)
new_output = output;
max = area;
pixman_region32_fini(®ion);
// 分配output
ev->output = new_output;
// 记录mask
ev->output_mask = mask;
weston_surface_assign_output(ev->surface);
- 根据上述代码处理,选择最大显示区域的output,作为primary output。当有两个output(两个屏幕时)根据上面的图中信息,mask处理如下
- output0的id为0, 1左移0位,得到1。然后与0做 | 运算。最终 mask为 0001(二进制)
- output1的 id为1,1左移1位,等到2.然后与 0001 做| 运行。最终mask为 0011(二进制)。
- 同理,如果有四个output,那么mask的值为 1111(二进制)。
- 合成部分的处理:关于多屏合成处理,其实是单屏幕绝大部分是一样的。只是多了一些,要显示的output的判断。
- weston_surface_schedule_repaint: 重绘操作,surface commit和 surface damage都会触发这个函数。
/**
* \\param surface The surface to be repainted
*
* Marks the output(s) that the surface is shown on as needing to be
* repainted. See weston_output_schedule_repaint().
*/
WL_EXPORT void
weston_surface_schedule_repaint(struct weston_surface *surface)
struct weston_output *output;
wl_list_for_each(output, &surface->compositor->output_list, link)
// 比如 output->id 为 0 output_mask为 0001
// 下面的 判断,就会通过。进而触发选定的output进行repaint
if (surface->output_mask & (1u << output->id))
weston_output_schedule_repaint(output);
以上是关于WaylandWeston多屏显示的主要内容,如果未能解决你的问题,请参考以下文章