Commit 0b9eff72 authored by Cristian Ciocaltea's avatar Cristian Ciocaltea Committed by Daniel Stone
Browse files

drm/vkms: Support setting custom background color



Make use of the BACKGROUND_COLOR CRTC property when filling the
background during blending.  It already defaults to solid black.

Since the internal representation of the pixel color in VKMS relies on
16 bits of precision, use the newly introduced DRM_ARGB64_GET{R|G|B}()
helpers to access the individual components of the background color
property, which is compliant with DRM_FORMAT_ARGB16161616.

It's worth noting the alpha component is ignored, hence non-opaque
background colors are not supported.

Reviewed-by: default avatarNícolas F. R. A. Prado <nfraprado@collabora.com>
Tested-by: default avatarDiederik de Haas <diederik@cknow-tech.com>
Reviewed-by: default avatarLouis Chauvet <louis.chauvet@bootlin.com>
Signed-off-by: default avatarCristian Ciocaltea <cristian.ciocaltea@collabora.com>
Link: https://patch.msgid.link/20260303-rk3588-bgcolor-v8-3-fee377037ad1@collabora.com


Signed-off-by: default avatarDaniel Stone <daniels@collabora.com>
parent 4c684596
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -475,8 +475,14 @@ static void blend(struct vkms_writeback_job *wb,
{
	struct vkms_plane_state **plane = crtc_state->active_planes;
	u32 n_active_planes = crtc_state->num_active_planes;

	const struct pixel_argb_u16 background_color = { .a = 0xffff };
	u64 bgcolor = crtc_state->base.background_color;

	const struct pixel_argb_u16 background_color = {
		.a = 0xffff,
		.r = DRM_ARGB64_GETR(bgcolor),
		.g = DRM_ARGB64_GETG(bgcolor),
		.b = DRM_ARGB64_GETB(bgcolor),
	};

	int crtc_y_limit = crtc_state->base.mode.vdisplay;
	int crtc_x_limit = crtc_state->base.mode.hdisplay;
+3 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@

#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_blend.h>
#include <drm/drm_managed.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
@@ -227,6 +228,8 @@ struct vkms_output *vkms_crtc_init(struct drm_device *dev, struct drm_plane *pri

	drm_crtc_enable_color_mgmt(crtc, 0, false, VKMS_LUT_SIZE);

	drm_crtc_attach_background_color_property(crtc);

	spin_lock_init(&vkms_out->lock);
	spin_lock_init(&vkms_out->composer_lock);