[PATCH v7 1/9] drm/format-helper: Add drm_fb_blit_from_r1 and drm_fb_fill
Jocelyn Falempe
jfalempe at redhat.com
Tue Jan 23 14:56:38 UTC 2024
On 23/01/2024 13:56, Thomas Zimmermann wrote:
> Hi,
>
> FYI for points 1 and 2, I'm typing up a patchset that introduces
> drm_pixmap for the source buffer. I'll post it when I have something ready.
Thanks, I didn't have time to look into this yet.
Best regards,
--
Jocelyn
>
> Best regards
> Thomas
>
> Am 19.01.24 um 11:58 schrieb Thomas Zimmermann:
>> 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,
>>>
>>
>
More information about the dri-devel
mailing list