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.
Unified · Split
| @@ -801,6 +801,9 @@ static void drm_atomic_colorop_print_state(struct drm_printer *p, · 800 unmodified lines | |||
| 801 | case DRM_COLOROP_CTM_3X4: | 801 | case DRM_COLOROP_CTM_3X4: |
| 802 | drm_printf(p, "\tdata blob id=%d\n", state->data ? state->data->base.id : 0); | 802 | drm_printf(p, "\tdata blob id=%d\n", state->data ? state->data->base.id : 0); |
| 803 | break; | 803 | break; |
| 804 | case DRM_COLOROP_MULTIPLIER: | ||
| 805 | drm_printf(p, "\tmultiplier=%llu\n", state->multiplier); | ||
| 806 | break; | ||
| 804 | default: | 807 | default: |
| 805 | break; | 808 | break; |
| 806 | } | 809 | } |
| @@ -728,6 +728,8 @@ static int drm_atomic_colorop_set_property(struct drm_colorop *colorop, · 727 unmodified lines | |||
| 728 | state->bypass = val; | 728 | state->bypass = val; |
| 729 | } else if (property == colorop->curve_1d_type_property) { | 729 | } else if (property == colorop->curve_1d_type_property) { |
| 730 | state->curve_1d_type = val; | 730 | state->curve_1d_type = val; |
| 731 | } else if (property == colorop->multiplier_property) { | ||
| 732 | state->multiplier = val; | ||
| 731 | } else if (property == colorop->data_property) { | 733 | } else if (property == colorop->data_property) { |
| 732 | return drm_atomic_color_set_data_property(colorop, state, | 734 | return drm_atomic_color_set_data_property(colorop, state, |
| 733 | property, val); | 735 | property, val); |
| @@ -753,6 +755,8 @@ drm_atomic_colorop_get_property(struct drm_colorop *colorop, · 19 unmodified lines | |||
| 753 | *val = state->bypass; | 755 | *val = state->bypass; |
| 754 | else if (property == colorop->curve_1d_type_property) | 756 | else if (property == colorop->curve_1d_type_property) |
| 755 | *val = state->curve_1d_type; | 757 | *val = state->curve_1d_type; |
| 758 | else if (property == colorop->multiplier_property) | ||
| 759 | *val = state->multiplier; | ||
| 756 | else if (property == colorop->size_property) | 760 | else if (property == colorop->size_property) |
| 757 | *val = colorop->size; | 761 | *val = colorop->size; |
| 758 | else if (property == colorop->data_property) | 762 | else if (property == colorop->data_property) |
| @@ -66,6 +66,7 @@ static const struct drm_prop_enum_list drm_colorop_type_enum_list[] = { · 65 unmodified lines | |||
| 66 | { DRM_COLOROP_1D_CURVE, "1D Curve" }, | 66 | { DRM_COLOROP_1D_CURVE, "1D Curve" }, |
| 67 | { DRM_COLOROP_1D_LUT, "1D LUT" }, | 67 | { DRM_COLOROP_1D_LUT, "1D LUT" }, |
| 68 | { DRM_COLOROP_CTM_3X4, "3x4 Matrix"}, | 68 | { DRM_COLOROP_CTM_3X4, "3x4 Matrix"}, |
| 69 | { DRM_COLOROP_MULTIPLIER, "Multiplier"}, | ||
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 71 | static const char * const colorop_curve_1d_type_names[] = { | 72 | 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 · 253 unmodified lines | |||
| 325 | } | 326 | } |
| 326 | EXPORT_SYMBOL(drm_plane_colorop_ctm_3x4_init); | 327 | EXPORT_SYMBOL(drm_plane_colorop_ctm_3x4_init); |
| 327 | 328 | ||
| 329 | /** | ||
| 330 | * drm_plane_colorop_mult_init - Initialize a DRM_COLOROP_MULTIPLIER | ||
| 331 | * | ||
| 332 | * @dev: DRM device | ||
| 333 | * @colorop: The drm_colorop object to initialize | ||
| 334 | * @plane: The associated drm_plane | ||
| 335 | * @return zero on success, -E value on failure | ||
| 336 | */ | ||
| 337 | int drm_plane_colorop_mult_init(struct drm_device *dev, struct drm_colorop *colorop, | ||
| 338 | struct drm_plane *plane) | ||
| 339 | { | ||
| 340 | struct drm_property *prop; | ||
| 341 | int ret; | ||
| 342 | |||
| 343 | ret = drm_plane_colorop_init(dev, colorop, plane, DRM_COLOROP_MULTIPLIER); | ||
| 344 | if (ret) | ||
| 345 | return ret; | ||
| 346 | |||
| 347 | prop = drm_property_create_range(dev, DRM_MODE_PROP_ATOMIC, "MULTIPLIER", 0, U64_MAX); | ||
| 348 | if (!prop) | ||
| 349 | return -ENOMEM; | ||
| 350 | |||
| 351 | colorop->multiplier_property = prop; | ||
| 352 | drm_object_attach_property(&colorop->base, colorop->multiplier_property, 0); | ||
| 353 | |||
| 354 | drm_colorop_reset(colorop); | ||
| 355 | |||
| 356 | return 0; | ||
| 357 | } | ||
| 358 | EXPORT_SYMBOL(drm_plane_colorop_mult_init); | ||
| 359 | |||
| 328 | static void __drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop, | 360 | static void __drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop, |
| 329 | struct drm_colorop_state *state) | 361 | struct drm_colorop_state *state) |
| 330 | { | 362 | { |
| @@ -415,6 +447,7 @@ static const char * const colorop_type_name[] = { · 84 unmodified lines | |||
| 415 | [DRM_COLOROP_1D_CURVE] = "1D Curve", | 447 | [DRM_COLOROP_1D_CURVE] = "1D Curve", |
| 416 | [DRM_COLOROP_1D_LUT] = "1D LUT", | 448 | [DRM_COLOROP_1D_LUT] = "1D LUT", |
| 417 | [DRM_COLOROP_CTM_3X4] = "3x4 Matrix", | 449 | [DRM_COLOROP_CTM_3X4] = "3x4 Matrix", |
| 450 | [DRM_COLOROP_MULTIPLIER] = "Multiplier", | ||
| 418 | }; | 451 | }; |
| 419 | 452 | ||
| 420 | const char *drm_get_colorop_type_name(enum drm_colorop_type type) | 453 | const char *drm_get_colorop_type_name(enum drm_colorop_type type) |
| @@ -144,6 +144,13 @@ struct drm_colorop_state { · 143 unmodified lines | |||
| 144 | */ | 144 | */ |
| 145 | enum drm_colorop_curve_1d_type curve_1d_type; | 145 | enum drm_colorop_curve_1d_type curve_1d_type; |
| 146 | 146 | ||
| 147 | /** | ||
| 148 | * @multiplier: | ||
| 149 | * | ||
| 150 | * Multiplier to 'gain' the plane. Format is S31.32 sign-magnitude. | ||
| 151 | */ | ||
| 152 | uint64_t multiplier; | ||
| 153 | |||
| 147 | /** | 154 | /** |
| 148 | * @data: | 155 | * @data: |
| 149 | * | 156 | * |
| @@ -271,6 +278,13 @@ struct drm_colorop { · 121 unmodified lines | |||
| 271 | */ | 278 | */ |
| 272 | struct drm_property *curve_1d_type_property; | 279 | struct drm_property *curve_1d_type_property; |
| 273 | 280 | ||
| 281 | /** | ||
| 282 | * @multiplier_property: | ||
| 283 | * | ||
| 284 | * Multiplier property for plane gain | ||
| 285 | */ | ||
| 286 | struct drm_property *multiplier_property; | ||
| 287 | |||
| 274 | /** | 288 | /** |
| 275 | * @size_property: | 289 | * @size_property: |
| 276 | * | 290 | * |
| @@ -329,6 +343,8 @@ int drm_plane_colorop_curve_1d_lut_init(struct drm_device *dev, struct drm_color · 52 unmodified lines | |||
| 329 | struct drm_plane *plane, uint32_t lut_size); | 343 | struct drm_plane *plane, uint32_t lut_size); |
| 330 | int drm_plane_colorop_ctm_3x4_init(struct drm_device *dev, struct drm_colorop *colorop, | 344 | int drm_plane_colorop_ctm_3x4_init(struct drm_device *dev, struct drm_colorop *colorop, |
| 331 | struct drm_plane *plane); | 345 | struct drm_plane *plane); |
| 346 | int drm_plane_colorop_mult_init(struct drm_device *dev, struct drm_colorop *colorop, | ||
| 347 | struct drm_plane *plane); | ||
| 332 | 348 | ||
| 333 | struct drm_colorop_state * | 349 | struct drm_colorop_state * |
| 334 | drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop); | 350 | drm_atomic_helper_colorop_duplicate_state(struct drm_colorop *colorop); |
| @@ -931,6 +931,17 @@ enum drm_colorop_type { · 930 unmodified lines | |||
| 931 | * | B | | 8 9 10 12 | | B | | 931 | * | B | | 8 9 10 12 | | B | |
| 932 | */ | 932 | */ |
| 933 | DRM_COLOROP_CTM_3X4, | 933 | DRM_COLOROP_CTM_3X4, |
| 934 | |||
| 935 | /** | ||
| 936 | * @DRM_COLOROP_MULTIPLIER: | ||
| 937 | * | ||
| 938 | * enum string "Multiplier" | ||
| 939 | * | ||
| 940 | * A simple multiplier, applied to all color values. The | ||
| 941 | * multiplier is specified as a S31.32 via the MULTIPLIER | ||
| 942 | * property. | ||
| 943 | */ | ||
| 944 | DRM_COLOROP_MULTIPLIER, | ||
| 934 | }; | 945 | }; |
| 935 | 946 | ||
| 936 | /** | 947 | /** |