Commit 1e759ed2 authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patch.msgid.link/20251126094626.41985-2-tzimmermann@suse.de
parent e85e9ccf
Loading
Loading
Loading
Loading
+39 −23
Original line number Diff line number Diff line
@@ -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,
				};

				drm_fb_argb8888_to_argb4444(argb4444_dst, argb4444_dst_pitch,
							    shadow_plane_state->data, fb, &damage,
							    &shadow_plane_state->fmtcnv_state);
			}
			break;
		}
		if (argb4444)
			ast_set_cursor_image(ast, argb4444, fb->width, fb->height);

		ast_set_cursor_base(ast, dst_off);
	}