[PATCH v7 1/9] drm/format-helper: Add drm_fb_blit_from_r1 and drm_fb_fill

Thomas Zimmermann tzimmermann at suse.de
Tue Jan 23 12:56:50 UTC 2024


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.

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,
>>
> 

-- 
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/20240123/ecdd0f59/attachment-0001.sig>


More information about the dri-devel mailing list