drm/ast: Move cursor format conversion into helper function

Move the format conversion of the cursor framebuffer into the new
helper ast_cursor_plane_get_argb4444(). It returns a buffer in system
memory, which the atomic_update handler copies to video memory.

The returned buffer is either the GEM buffer itself, or a temporary
copy within the plane in ARGB4444 format.

As a small change, list supported formats explicitly in the switch
statement. Do not assume ARGB8888 input by default. The cursor
framebuffer knows its format, so should we.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Link: https://patch.msgid.link/20251126094626.41985-2-tzimmermann@suse.de
This commit is contained in:
Thomas Zimmermann
2025-11-26 10:40:08 +01:00
parent e85e9ccf3f
commit 1e759ed22a

View File

@@ -181,6 +181,38 @@ static int ast_cursor_plane_helper_atomic_check(struct drm_plane *plane,
return 0;
}
static const u8 *ast_cursor_plane_get_argb4444(struct ast_cursor_plane *ast_cursor_plane,
struct drm_shadow_plane_state *shadow_plane_state,
const struct drm_rect *clip)
{
struct drm_plane_state *plane_state = &shadow_plane_state->base;
struct drm_framebuffer *fb = plane_state->fb;
u8 *argb4444 = NULL;
switch (fb->format->format) {
case DRM_FORMAT_ARGB4444:
argb4444 = shadow_plane_state->data[0].vaddr;
break;
case DRM_FORMAT_ARGB8888:
{
struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
IOSYS_MAP_INIT_VADDR(ast_cursor_plane->argb4444),
};
unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
AST_HWC_PITCH,
};
drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
shadow_plane_state->data, fb, clip,
&shadow_plane_state->fmtcnv_state);
argb4444 = argb4444_dst[0].vaddr;
}
break;
}
return argb4444;
}
static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
struct drm_atomic_state *state)
{
@@ -205,29 +237,13 @@ static void ast_cursor_plane_helper_atomic_update(struct drm_plane *plane,
*/
if (drm_atomic_helper_damage_merged(old_plane_state, plane_state, &damage)) {
u8 *argb4444;
const u8 *argb4444 = ast_cursor_plane_get_argb4444(ast_cursor_plane,
shadow_plane_state,
&damage);
switch (fb->format->format) {
case DRM_FORMAT_ARGB4444:
argb4444 = shadow_plane_state->data[0].vaddr;
break;
default:
argb4444 = ast_cursor_plane->argb4444;
{
struct iosys_map argb4444_dst[DRM_FORMAT_MAX_PLANES] = {
IOSYS_MAP_INIT_VADDR(argb4444),
};
unsigned int argb4444_dst_pitch[DRM_FORMAT_MAX_PLANES] = {
AST_HWC_PITCH,
};
if (argb4444)
ast_set_cursor_image(ast, argb4444, fb->width, fb->height);
drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
shadow_plane_state->data, fb, &damage,
&shadow_plane_state->fmtcnv_state);
}
break;
}
ast_set_cursor_image(ast, argb4444, fb->width, fb->height);
ast_set_cursor_base(ast, dst_off);
}