[PATCH v7 1/9] drm/format-helper: Add drm_fb_blit_from_r1 and drm_fb_fill
Thomas Zimmermann
tzimmermann at suse.de
Fri Jan 19 10:58:38 UTC 2024
Hi
Am 17.01.24 um 17:40 schrieb Jocelyn Falempe:
>
>
> On 17/01/2024 16:06, Thomas Zimmermann wrote:
>> Hi
>>
>> Am 04.01.24 um 17:00 schrieb Jocelyn Falempe:
>>> This is needed for drm_panic, to draw the font, and fill
>>> the background color, in multiple color format.
>>
>> TBH, I don't like this patch at all. It looks like you're
>> reimplementing existing functionality for a single use case;
>> specifically drm_fb_blit().
>>
>> What's wrong with the existing interfaces?
I've spend considerable time to clean up the format-helper code and get
it into shape. It's not there yet, but on its way. So I'd rather prefer
to update the existing code for new use cases. Adding a new interface
for a single use case is something like a leap backwards.
So let's see if we can work out something.
>
> drm_fb_blit() is good to copy a framebuffer to another, but is clearly
> unoptimal to draw font.
1) The framebuffer data structure is only there for historical reasons.
It should be removed from the internal implementation entirely. A first
patch should go into this in any case. It didn't happened so far, as
I've been busy with other work.
2) For the public API, I've long wanted to replace framebuffers with
something more flexible, let's call it drm_pixmap
struct drm_pixmap {
struct drm_format_info *format
unsigned int width, height
unsigned int pitches[DRM_FORMAT_MAX_PLANES]
iomap vaddr[DRM_FORMAT_MAX_PLANES]
};
It's the essence of drm_framebuffer. Let's say there's also an init
helper drm_pixmap_init_from_framebuffer(pix, fb) that sets up
everything. The implementation of drm_fb_blit() would look like this:
drm_fb_blit(...) {
drm_pixmap pix;
drm_pixmap_init_from_framebuffer(pix, fb)
__drm_fb_blit_pixmap( <like drm_fb_blit() but with a pixmap> )
}
That would require some changes to drivers, but it's only simple
refactoring.
3) When looking at your patch, there's
src = font->data + (msg->txt[i] * font->height) * src_stride;
which should be in a helper that sets up the drm_pixmap for a font
character:
drm_pixmap_init_from_char(pixmap, c, font_data)
where 'c' equals msg->txt[i]
The text drawing in the panic handler would do something like
for (msg->txt[i]) {
drm_pixmap_init_from_char(pixmap, ...)
drm_fb_blit_pixmap(...)
}
> It handles xrgb8888 to any rgb format, and I need monochrome to any rgb
> format.
4) You're free to add any conversion to drm_fb_blit(). It's supposed to
handle all available format conversion. With the pixmap-related changes
outlined above and the actual conversion code, I think that would
already put characters on the screen.
> I need to convert foreground and background color to the destination
> format, but using drm_fb_blit() to convert 1 pixel is tedious.
5) I've recently added drm_format_conv_state to the API. It is supposed
to hold state that is required for the conversion process. I
specifically had color palettes in mind. Please use the data structure.
Something like that:
struct drm_format_conv_state {
...
const drm_color_lut *palette;
}
and in the conversion code:
void r1_to_rgb() {
for (x < pixels) {
rgb = state->palette[r1]
}
}
>
> It also requires an additional memory buffer, and do an additional
> memory copy that we don't need at all.
6) That memcpy_to_io() not a big deal. You should pre-allocate that
memory buffer in the panic handler and init the drm_format_conv_state
with DRM_FORMAT_CONV_STATE_INIT_PREALLOCATED().
>
> It also has no way to fill a region with the background color.
7) Please add a separate drm_fb_fill() implementation. If you have a
palette in struct drm_format_conf_state, you can add a helper for each
destination format that takes a drm_color_lut value as input.
This point is probably worth a separate discussion.
>
> The last thing, is if I plan to add YUV support, with this
> implementation, I only need to write one function that convert one
> pixel. Otherwise I would need to add the drm_fb_r1_to_yuvxxx_line() and
> drm_fb_r1_to_yuvxxxx() boilerplate.
8) YUVs are multi-plane formats IIRC. So it's likely a bit more
complicated.And I'm not aware of any current use case for YUV. If the
framebuffer console doesn't support it, the panic helper probably won't
either.
Best regards
Thomas
>
> Best regards,
>
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20240119/54a72e84/attachment-0001.sig>
More information about the dri-devel
mailing list