The Linux framebuffer interface has at least four different sets of APIs for rendering to the screen. Here they are mapped against the some important fbdev client “applications”.
|Description||Linux console||fbdev X server||mplayer, fbi, some others|
|fb_write and fb_read||passes a buffer to copy to/from user||no||no||no|
|image_blit, fillrect, copyarea||blit passes buffer to copy||yes||no||no|
|mmap||assuming writes go directly to device||no||yes||yes|
|mmap||with extra ioctl to report damage||no||no||no|
A “no” in the above table means the client application will fail if that’s the only API option supported by the kernel framebuffer driver.
udlfb supports all four, with some limitations (e.g. defio is required to support mmap without damage reports).
The custom displaylink X server is the only client today which supports the last option, which is the most performant option on indirect displays (like USB displays) – and hopefully will become a standard interface as it’s useful in many cases.
Unfortunately for the DisplayLink udlfb framebuffer, each API has different constraints it places on the driver. Those constraints aren’t easily met all at once for a driver rendering to USB. AFAICT, it looks like the driver actually needs to figure out what kind of client it’s dealing with, and assume that client will stick to that sub-set of the API. That seems to be a safe assumption for the major fbdev apps today, but betting on something like this is always ugly.