Navigation Menu

Skip to content

Commit

Permalink
[display] Flush cached brightness when adjustment fails. Fixes JB#47229
Browse files Browse the repository at this point in the history
In devices which use kms/drm (such as Sony Xperia 10) all adjustment
attempts made while display is not ready get ignored and brightness
gets reset on compositor change. The mce side brightness value caching
is not prepared to handle this kind of situation, which easily leads
to display staying dimmer than expected due to cached value getting
out of sync with reality.

Flush cached brightness value on adjustment failures.

Update cached brightness value only after successful adjustments.

Add helper functions for performing common tasks.

As the logic still makes adjustment attempts in situations where they
are not going to be accepted by drm drivers, tweak logging to reduce
noise from  adjustment failures a bit.

Signed-off-by: Simo Piiroinen <simo.piiroinen@jollamobile.com>
  • Loading branch information
spiiroin committed Sep 11, 2019
1 parent c2a74a1 commit 1beea73
Showing 1 changed file with 52 additions and 30 deletions.
82 changes: 52 additions & 30 deletions modules/display.c
Expand Up @@ -472,10 +472,12 @@ static void mdy_hbm_rethink(void);
* ------------------------------------------------------------------------- */

#ifdef ENABLE_HYBRIS
static void mdy_brightness_set_level_hybris(int number);
static bool mdy_brightness_set_level_hybris(int number);
#endif
static void mdy_brightness_set_level_default(int number);
static bool mdy_brightness_set_level_default(int number);
static int mdy_brightness_normalize_level(int number);
static void mdy_brightness_set_level(int number);
static void mdy_brightness_forget_level(void);

static void mdy_brightness_fade_continue_with_als(fader_type_t fader_type);
static void mdy_brightness_force_level(int number);
Expand Down Expand Up @@ -2625,7 +2627,7 @@ static output_state_t mdy_brightness_level_output =
*
* @param number brightness value; after bounds checking
*/
static void (*mdy_brightness_set_level_hook)(int number) = mdy_brightness_set_level_default;
static bool (*mdy_brightness_set_level_hook)(int number) = mdy_brightness_set_level_default;

/** Is hardware driven display fading supported */
static gboolean mdy_brightness_hw_fading_is_supported = FALSE;
Expand Down Expand Up @@ -2705,49 +2707,67 @@ static gboolean mdy_orientation_change_is_activity = MCE_DEFAULT_ORIENTATION_CHA
static guint mdy_orientation_change_is_activity_setting_id = 0;

/** Set display brightness via sysfs write */
static void mdy_brightness_set_level_default(int number)
static bool mdy_brightness_set_level_default(int number)
{
mce_write_number_string_to_file(&mdy_brightness_level_output, number);
return mce_write_number_string_to_file(&mdy_brightness_level_output, number);
}

#ifdef ENABLE_HYBRIS
/** Set display brightness via libhybris */
static void mdy_brightness_set_level_hybris(int number)
static bool mdy_brightness_set_level_hybris(int number)
{
mce_hybris_backlight_set_brightness(number);
return mce_hybris_backlight_set_brightness(number);
}
#endif

/** Helper for normalizing brightness to supported range
*
* @param number brightness value
*
* @return brightness value capped to supported range
*/
static int mdy_brightness_normalize_level(int number)
{
if( number < 0 )
number = 0;
else if (number > mdy_brightness_level_maximum )
number = mdy_brightness_level_maximum;
return number;
}

/** Helper for updating backlight brightness with bounds checking
*
* @param number brightness in 0 to mdy_brightness_level_maximum range
*/
static void mdy_brightness_set_level(int number)
{
int minval = 0;
int maxval = mdy_brightness_level_maximum;

/* If we manage to get out of hw bounds values from depths
* of pipelines and state machines we could end up with
* black screen without easy way out -> clip to valid range */
if( number < minval ) {
mce_log(LL_ERR, "value=%d vs min=%d", number, minval);
number = minval;
}
else if( number > maxval ) {
mce_log(LL_ERR, "value=%d vs max=%d", number, maxval);
number = maxval;
int value = mdy_brightness_normalize_level(number);
if( value != number )
mce_log(LL_ERR, "level=%d -> %d", number, value);

if( mdy_brightness_level_cached != value ) {
if( mdy_brightness_set_level_hook(value) ) {
mdy_brightness_level_cached = value;
mce_log(LL_DEBUG, "level: %d", mdy_brightness_level_cached);
}
else if( mdy_brightness_level_cached != -1 ) {
mdy_brightness_level_cached = -1;
mce_log(LL_WARN, "level: %d", mdy_brightness_level_cached);
}
}
else
mce_log(LL_DEBUG, "value=%d", number);
}

if( mdy_brightness_level_cached != number ) {
mdy_brightness_level_cached = number;
mdy_brightness_set_level_hook(number);
/** Helper for flushing cached backlight brightness value
*/
static void mdy_brightness_forget_level(void)
{
if( mdy_brightness_level_cached != -1 ) {
mdy_brightness_level_cached = -1;
mce_log(LL_DEBUG, "level: %d", mdy_brightness_level_cached);
}

// TODO: we might want to power off fb at zero brightness
// and power it up at non-zero brightness???
}

/** Helper for boosting mce scheduling priority during brightness fading
Expand Down Expand Up @@ -3150,8 +3170,10 @@ static void mdy_brightness_set_fade_target_ex(fader_type_t type,
}

/* Set up fade start and end brightness levels */
mdy_brightness_fade_start_level = mdy_brightness_level_cached;
mdy_brightness_fade_end_level = new_brightness;
mdy_brightness_fade_start_level =
mdy_brightness_normalize_level(mdy_brightness_level_cached);
mdy_brightness_fade_end_level =
mdy_brightness_normalize_level(new_brightness);

/* If the - possibly adjusted - transition time is so short that
* only couple of adjustments would be made, do an immediate
Expand Down Expand Up @@ -8152,7 +8174,7 @@ static void mdy_stm_step(void)
*/
int brightness = mdy_brightness_level_cached;
mce_log(LL_WARN, "forced brightness sync to: %d", brightness);
mdy_brightness_level_cached = -1;
mdy_brightness_forget_level();
if( brightness > 0 )
mdy_brightness_set_level(brightness - 1);
mdy_brightness_set_level(brightness);
Expand Down Expand Up @@ -8222,7 +8244,7 @@ static void mdy_stm_step(void)
* the display while making exit -> we need to
* invalidate cached backlight brightness level
* and possibly power up the display again */
mdy_brightness_level_cached = -1;
mdy_brightness_forget_level();
}
mdy_stm_trans(STM_LEAVE_POWER_ON);
break;
Expand Down Expand Up @@ -8401,7 +8423,7 @@ static void mdy_stm_step(void)

if( mdy_stm_compositor_availability_changed ) {
if( !mdy_compositor_is_available() )
mdy_brightness_level_cached = -1;
mdy_brightness_forget_level();
mdy_stm_trans(STM_LEAVE_LOGICAL_OFF);
break;
}
Expand Down

0 comments on commit 1beea73

Please sign in to comment.