2016-06-22 71 views
1

我需要在没有X11的Linux下在屏幕上绘制光标(鼠标指针)。这适用于嵌入式系统,其中所有其他绘图直接在帧缓冲区中发生(/dev/fb0)。需要在Linux framebuffer中绘制光标

  1. 我目前正在查看的GUI库不提供任何游标支持。
  2. 我可以自己做blitting,但我担心外观和性能,部分原因是我似乎无法与vsync同步(FBIO_WAITFORVSYNC)。
  3. 我知道几乎所有的图形芯片都支持硬件游标,但DirectFB已经死了,libdrm需要X11,Mesa也是如此。

What is hardware cursor and how does it work?,在OP声称已与ioctl调用实现这一点,说明它很简单,但拒绝提供进一步的细节,因为他的代码是专有的。我知道FBIO_CURSOR,但它似乎是非标准的,并且在我的3.10.0内核上总是返回EINVAL

在没有X11的情况下绘制帧缓冲光标的正确方法是什么?

+0

乔希,你知道吗?我今晚自己遇到了这个。 FBIO_CURSOR没什么特别。 –

+0

@Stéphane请参阅我刚发布的答案。 –

回答

1

我最终滚动了我自己的光标支持,因为看起来内核支持取决于特定的视频驱动程序支持。表演结束了伟大的我的目的。下面是我所做的:

  • 打开的/ dev/FB0帧缓冲,调整vinfo根据需要,mmap帧缓冲,并malloc两个缓冲区大小相同的帧缓冲。其中一个缓冲区是我所有绘图发生的后台缓冲区。另一个是我的“光标”缓冲区,其中绘制了光标。
  • 打开相应的/ dev/input/eventX准备读取鼠标事件。
  • 定义一个“刷新”函数,以在任何东西被拖入后台缓冲区或每当有鼠标活动时调用。
  • poll与一个合理的超时鼠标事件。我使用了500毫秒的超时时间,并将其放在pthread之内,这样它的性能开销就很小。
  • “刷新”功能memcpy“IES后台缓存到指针缓冲器,并提请在它上面的光标。 (I擦除掩码比特光标下,绘制光标位,如每图像here。)光标缓冲器然后memcpy“编入帧缓冲。我使用两个互斥锁来保护刷新功能以获得更好的性能,我在获取第一个数据之前先将后台缓冲区复制到游标缓冲区,并在绘制游标后释放它,在获取第二个游标之前先获取第二个游标,然后释放它。复制指针缓冲器的帧缓冲这提高做大量的真快图纸明显时表现)

对我的一些决定有几个原因:。

  • 写入到帧缓冲区是相当快的,但是读取速度要慢得多,因此使用常规的malloc'ed内存的后退和光标缓冲区。
  • memcpy比我能写的任何东西都快,而且是线程安全的。
  • 对帧缓冲区的并发访问很慢,大概是因为memcpy在尝试访问当前正在使用的区域时会锁定区域和块。这就是为什么我使用两个互斥锁来保护从后台缓冲区到游标缓冲区以及从游标缓冲区到帧缓冲区的副本。
  • poll0超时相当于使用大量CPU周期的紧密循环,因此使用非零超时。但poll只要输入有活动就会返回,所以响应很好。

在我的硬件,我没有找到一个可用的方式与垂直消隐(一些ioctl的显然是无操作的)进行同步,但上述方法没有表现出特别的撕裂。是的,这种方法使用两个屏幕外缓冲区,每个屏幕缓冲区在我的1920 x 1080 16位/像素屏幕上都需要4 MB,但它非常简单,足以满足我的需求。