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(&region);
	wl_list_for_each(output, &ec->output_list, link) 
		if (output->destroying)
			continue;

		pixman_region32_intersect(&region, &ev->transform.boundingbox,
					  &output->region);

		e = pixman_region32_extents(&region);
		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(&region);
	// 分配output
	ev->output = new_output;
	// 记录mask
	ev->output_mask = mask;

	weston_surface_assign_output(ev->surface);

  • 根据上述代码处理,选择最大显示区域的output,作为primary output。当有两个output(两个屏幕时)根据上面的图中信息,mask处理如下
  1. output0的id为0, 1左移0位,得到1。然后与0做 | 运算。最终 mask为 0001(二进制)
  2. output1的 id为1,1左移1位,等到2.然后与 0001 做| 运行。最终mask为 0011(二进制)。
  3. 同理,如果有四个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多屏显示的主要内容,如果未能解决你的问题,请参考以下文章

WaylandWeston多屏显示

RK3588多屏拼接显示技术案例

RK3588多屏拼接显示技术案例

RK3588多屏拼接显示技术案例

Citrix Xendesktop发布Centos7之修改Linux VDA多屏支持

WaylandWeston启动流程分析