The if/switch statement is bound to grow with more types and subtypes. Pull this out into its own funcion to make things more manageable and readable. Signed-off-by: Harry Wentland <harry.wentland@xxxxxxx> --- drivers/gpu/drm/vkms/vkms_composer.c | 48 ++++++++++++++++------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 9493bdb1ba3f..25b786b49db0 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -164,6 +164,31 @@ static void apply_lut(const struct vkms_crtc_state *crtc_state, struct line_buff } } +static void apply_colorop(struct pixel_argb_u16 *pixel, struct drm_colorop *colorop) +{ + /* TODO is this right? */ + struct drm_colorop_state *colorop_state = colorop->state; + + if (colorop->type == DRM_COLOROP_1D_CURVE) { + switch (colorop_state->curve_1d_type) { + case DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF: + pixel->r = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->r, LUT_RED); + pixel->g = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->g, LUT_GREEN); + pixel->b = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->b, LUT_BLUE); + break; + case DRM_COLOROP_1D_CURVE_SRGB_EOTF: + pixel->r = apply_lut_to_channel_value(&srgb_eotf, pixel->r, LUT_RED); + pixel->g = apply_lut_to_channel_value(&srgb_eotf, pixel->g, LUT_GREEN); + pixel->b = apply_lut_to_channel_value(&srgb_eotf, pixel->b, LUT_BLUE); + break; + default: + DRM_DEBUG_DRIVER("unkown colorop 1D curve type %d\n", colorop_state->curve_1d_type); + break; + } + } + +} + static void pre_blend_color_transform(const struct vkms_plane_state *plane_state, struct line_buffer *output_buffer) { struct drm_colorop *colorop = plane_state->base.base.color_pipeline; @@ -180,26 +205,9 @@ static void pre_blend_color_transform(const struct vkms_plane_state *plane_state if (!colorop_state) return; - for (size_t x = 0; x < output_buffer->n_pixels; x++) { - struct pixel_argb_u16 *pixel = &output_buffer->pixels[x]; - - if (colorop->type == DRM_COLOROP_1D_CURVE && - colorop_state->bypass == false) { - switch (colorop_state->curve_1d_type) { - case DRM_COLOROP_1D_CURVE_SRGB_INV_EOTF: - pixel->r = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->r, LUT_RED); - pixel->g = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->g, LUT_GREEN); - pixel->b = apply_lut_to_channel_value(&srgb_inv_eotf, pixel->b, LUT_BLUE); - break; - case DRM_COLOROP_1D_CURVE_SRGB_EOTF: - default: - pixel->r = apply_lut_to_channel_value(&srgb_eotf, pixel->r, LUT_RED); - pixel->g = apply_lut_to_channel_value(&srgb_eotf, pixel->g, LUT_GREEN); - pixel->b = apply_lut_to_channel_value(&srgb_eotf, pixel->b, LUT_BLUE); - break; - } - } - } + for (size_t x = 0; x < output_buffer->n_pixels; x++) + if (!colorop_state->bypass) + apply_colorop(&output_buffer->pixels[x], colorop); colorop = colorop->next; } -- 2.44.0