Commit 34101080 authored by Alex Hung's avatar Alex Hung Committed by Simon Ser
Browse files

drm/colorop: Add multiplier type



This introduces a new drm_colorop_type: DRM_COLOROP_MULTIPLIER.

It's a simple multiplier to all pixel values. The value is
specified via a S31.32 fixed point provided via the
"MULTIPLIER" property.

Reviewed-by: default avatarSimon Ser <contact@emersion.fr>
Signed-off-by: default avatarAlex Hung <alex.hung@amd.com>
Reviewed-by: default avatarDaniel Stone <daniels@collabora.com>
Reviewed-by: default avatarMelissa Wen <mwen@igalia.com>
Reviewed-by: default avatarSebastian Wick <sebastian.wick@redhat.com>
Signed-off-by: default avatarSimon Ser <contact@emersion.fr>
Link: https://patch.msgid.link/20251115000237.3561250-41-alex.hung@amd.com
parent 16e0f785
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -801,6 +801,9 @@ static void drm_atomic_colorop_print_state(struct drm_printer *p,
	case DRM_COLOROP_CTM_3X4:
		drm_printf(p, "\tdata blob id=%d\n", state->data ? state->data->base.id : 0);
		break;
	case DRM_COLOROP_MULTIPLIER:
		drm_printf(p, "\tmultiplier=%llu\n", state->multiplier);
		break;
	default:
		break;
	}
+4 −0
Original line number Diff line number Diff line
@@ -728,6 +728,8 @@ static int drm_atomic_colorop_set_property(struct drm_colorop *colorop,
		state->bypass = val;
	} else if (property == colorop->curve_1d_type_property) {
		state->curve_1d_type = val;
	} else if (property == colorop->multiplier_property) {
		state->multiplier = val;
	} else if (property == colorop->data_property) {
		return drm_atomic_color_set_data_property(colorop, state,
							  property, val);
@@ -753,6 +755,8 @@ drm_atomic_colorop_get_property(struct drm_colorop *colorop,
		*val = state->bypass;
	else if (property == colorop->curve_1d_type_property)
		*val = state->curve_1d_type;
	else if (property == colorop->multiplier_property)
		*val = state->multiplier;
	else if (property == colorop->size_property)
		*val = colorop->size;
	else if (property == colorop->data_property)
+33 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ static const struct drm_prop_enum_list drm_colorop_type_enum_list[] = {
	{ DRM_COLOROP_1D_CURVE, "1D Curve" },
	{ DRM_COLOROP_1D_LUT, "1D LUT" },
	{ DRM_COLOROP_CTM_3X4, "3x4 Matrix"},
	{ DRM_COLOROP_MULTIPLIER, "Multiplier"},
};

static const char * const colorop_curve_1d_type_names[] = {
@@ -325,6 +326,37 @@ int drm_plane_colorop_ctm_3x4_init(struct drm_device *dev, struct drm_colorop *c
}
EXPORT_SYMBOL(drm_plane_colorop_ctm_3x4_init);

/**
 * drm_plane_colorop_mult_init - Initialize a DRM_COLOROP_MULTIPLIER
 *
 * @dev: DRM device
 * @colorop: The drm_colorop object to initialize
 * @plane: The associated drm_plane
 * @return zero on success, -E value on failure
 */
int drm_plane_colorop_mult_init(struct drm_device *dev, struct drm_colorop *colorop,
				struct drm_plane *plane)
{
	struct drm_property *prop;
	int ret;

	ret = drm_plane_colorop_init(dev, colorop, plane, DRM_COLOROP_MULTIPLIER);
	if (ret)
		return ret;

	prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC, "MULTIPLIER", 0, U64_MAX);
	if (!prop)
		return -ENOMEM;

	colorop->multiplier_property = prop;
	drm_object_attach_property(&colorop->base, colorop->multiplier_property, 0);

	drm_colorop_reset(colorop);

	return 0;
}
EXPORT_SYMBOL(drm_plane_colorop_mult_init);

static void __drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop,
							struct drm_colorop_state *state)
{
@@ -415,6 +447,7 @@ static const char * const colorop_type_name[] = {
	[DRM_COLOROP_1D_CURVE] = "1D Curve",
	[DRM_COLOROP_1D_LUT] = "1D LUT",
	[DRM_COLOROP_CTM_3X4] = "3x4 Matrix",
	[DRM_COLOROP_MULTIPLIER] = "Multiplier",
};

const char *drm_get_colorop_type_name(enum drm_colorop_type type)
+16 −0
Original line number Diff line number Diff line
@@ -144,6 +144,13 @@ struct drm_colorop_state {
	 */
	enum drm_colorop_curve_1d_type curve_1d_type;

	/**
	 * @multiplier:
	 *
	 * Multiplier to 'gain' the plane. Format is S31.32 sign-magnitude.
	 */
	uint64_t multiplier;

	/**
	 * @data:
	 *
@@ -271,6 +278,13 @@ struct drm_colorop {
	 */
	struct drm_property *curve_1d_type_property;

	/**
	 * @multiplier_property:
	 *
	 * Multiplier property for plane gain
	 */
	struct drm_property *multiplier_property;

	/**
	 * @size_property:
	 *
@@ -329,6 +343,8 @@ int drm_plane_colorop_curve_1d_lut_init(struct drm_device *dev, struct drm_color
					struct drm_plane *plane, uint32_t lut_size);
int drm_plane_colorop_ctm_3x4_init(struct drm_device *dev, struct drm_colorop *colorop,
				   struct drm_plane *plane);
int drm_plane_colorop_mult_init(struct drm_device *dev, struct drm_colorop *colorop,
				struct drm_plane *plane);

struct drm_colorop_state *
drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop);
+11 −0
Original line number Diff line number Diff line
@@ -931,6 +931,17 @@ enum drm_colorop_type {
	 * | B |   | 8  9  10 12 |   | B |
	 */
	DRM_COLOROP_CTM_3X4,

	/**
	 * @DRM_COLOROP_MULTIPLIER:
	 *
	 * enum string "Multiplier"
	 *
	 * A simple multiplier, applied to all color values. The
	 * multiplier is specified as a S31.32 via the MULTIPLIER
	 * property.
	 */
	DRM_COLOROP_MULTIPLIER,
};

/**