[X10II] [X10III] Color banding in low light conditions

REPRODUCIBILITY: 100%
OS VERSION: 4.0+ (I guess)
HARDWARE: X10II, X10III
UI LANGUAGE: Finnish
REGRESSION: No…?

DESCRIPTION:

In low light conditions, in some views more than others, the Ambience background images get blurred and modified in such way that there’s significant amount of color banding visible. It’s almost as if the screen backlight doesn’t go low enough, so the image must be darkened, resulting in lost color information, especially in the dark end of colors. It is of no harm, but it really sticks in an unpleasing way.

Another “symptom” is the colors looking washed-out, especially noticable in the application drawer.

Or, perhaps the gamma setting is off. I don’t really have the vocabulary to describe it further :sweat_smile:

PRECONDITIONS:

  • Have an X10II or X10III

STEPS TO REPRODUCE:

  • Set theme to red-ish (e.g. Fire)
  • Set brightness to maximum
  • Go to events view (or view a dark photo)
  • See that the image quality is fine
  • Set brightness to minimum

EXPECTED RESULT:

  • Observed image quality doesn’t change

ACTUAL RESULT:

  • Severe degradation in image quality, color banding

MODIFICATIONS:

None.

ADDITIONAL INFORMATION:

I thought it was a quirk in my device with X10II, but because it’s even more severe with X10III, I decided to report it.

I cannot currently test this with Android, because data transfer is still underway.

Edit: The issue seems to have been reported to Sony already, and some users say that it was fixed with Android blob 62.0.A.3.131.

4 Likes

I experienced the same using dark ambiences and open the topmenü, especially when open apps are visible in the app grid. DIdn’t notice this in Android 12.

Confirmed.

REPRODUCIBILITY: 100%
OS VERSION: 4.0.0.64
HARDWARE: X10III
UI LANGUAGE: en_GB
REGRESSION: No…?

MODIFICATIONS:

Custom Theme (Ambience), some non-default colors changed via dconf. Should be unrelated, as any graphic is affected, icons too.

ADDITIONAL INFORMATION:

When brightness is at minimum, all colours are kinda greyish and washed out. Extremely obvious in Events View with a mostly-black wallpaper with some graphic elements, e.g. like this:

1 Like

Sony fixed this for the Android side of things a long time ago. I am not sure how though. Maybe its fixed with special firmware drivers and we need to update them for SFOS or it is fixed somehow via software calibration of the screen when a certain low light condition occurs

3 Likes

So it´s maybe better to update SFOS in the Sony 10iii from Android 12 instead of 11?

No, tested it, makes no difference.

In 10III with black image as background, in low light conditions the background is not black. I tried to take some screenshots to report this but the background appears black in the screenshots. I think the issue is with the display itself, or some device specific driver(?)

In comparison, a XZ3 with similar (see better) screen technology, a black background image appears always black.

@leszek That’s what I was afraid of… Really afraid of… I assumed AOSP blobs would contain the same drivers/firmware Android uses, but if that’s true, it’s one more piece of evidence that’s not the how it goes. Y’all know that they say about assuming :confused:

@pmelas Yeah, it’s not screenshotable, tried that, too :wink:

Found the source for it; it seems the bug was fixed in October 2021 with update 62.0.A.3.131 but this is for Android only, no mention about AOSP… Gosh darn it!

Edit: As of today, the AOSP blob Sailfish uses is the latest version. The last release was back in February, so let’s hope the issue gets fixed soon…

3 Likes

Thanks for the report @direc85. I’ve created an internal bug report about it, and included your additional info about the source. So this is now tagged as “tracked”.

3 Likes

Thank you for these findings!

Temporary workaround is to uncheck Settings | Display | Automatic brightness, set the slider to maximum then to your desired value. This will work until you put phone to sleep again.

Could not reproduce on Xperia 10 II Sailfish OS (my baseband there/I upgraded Android to 59.1.A.2.28) - OLED shows blacks as pitch black there at all times.

2 Likes

Wow. Nice find! So the display and control do work corrently, but it looks like they glitch out at certain situations.

I just tested this (X10III) and can confirm – the color banding is gone after doing the steps mentioned - but only until I lock the screen again.

I can also confirm, these steps work for me as well - but only until turning the screen off.

If you kept it at full brightness, would it then keep on working as desired (no banding) even after locking the screen again?

So a workaround for this would be that Jolla implements some screen colour calibration steps like mentioned above, i.e. if you turn on the screen 1) set background to black, 2) increase brightness to 100% (as background is black no one should notice) and 3) resume to default / user customized level?

I would prefer just setting the brightness to max and back, no need for black screen. Workaround is a workaround, no need to hide it…

I would like to see a button for this in top menu. Then again, setting the brightness to max and back using the slider does the same thing.

I guess creating such a button (e.g. using a patchmanager patch) should be easy enough.

What I’d like to understand though: which condition actually causes this phenomenon to appear? Is it the power saving mode? Is it the screen turning off? is it hitting minimum brightness at some point?

So I have made this:

https://coderus.openrepos.net/pm2/project/patch-brightness-magic

Please test if that works.

3 Likes

I was grabbing some other logs with dmesg when I saw something curious there:

[88480.368490] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.370116] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.562815] [drm:dsi_display_set_mode] [msm-dsi-info]: mdp_transfer_time_us=15666 us
[88480.562822] [drm:dsi_display_set_mode] [msm-dsi-info]: hactive= 1080,vactive= 2520,fps=60
[88480.562871] [drm:dsi_ctrl_isr_configure] [msm-dsi-info]: dsi-ctrl-0: IRQ 385 registered
[88480.574322] dsi_panel_driver_touch_pinctrl_set_state: invalid 'somc_ts_int_active' pinstate
[88480.576128] @@@@ panel power on @@@@
[88480.623313] somc_panel_color_manager: somc_panel_inject_crtc_overrides (786): Override: Already have original funcs! Is setup called twice??
[88480.623413] somc_panel_color_manager: somc_panel_pcc_setup (884): Cannot read uv data: missing command
[88480.623438] somc_panel_color_manager: somc_panel_pcc_setup (888): u,v is flashed 0.
[88480.623458] somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Couldn't apply PCC calibration
[88480.623499] somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Cannot send HSIC calibration
[88480.629626] sec_ts 1-0048: [sec_input] sec_ts_dsi_panel_notifier_cb: power up
[88480.629657] sec_ts 1-0048: [sec_input] sec_ts_start_device
[88480.629677] sec_ts 1-0048: [sec_input] sec_ts_pinctrl_configure: ACTIVE
[88480.629764] (NULL device *): deviceless supply vdd not found, using dummy regulator
[88480.629966] (NULL device *): deviceless supply avdd not found, using dummy regulator
[88480.632094] sec_ts 1-0048: [sec_input] sec_ts_power: on: avdd:on, dvdd:on
[88480.637350] dsi_panel_driver_oled_short_det_handler: VREG_NG interrupt!
[88480.709609] sec_ts 1-0048: [sec_input] sec_ts_wait_for_ready: 09, 00, 10, 00, 00, 00, 00, 00 [0]
[88480.709624] sec_ts 1-0048: [sec_input] sec_ts_start_device: cover open, not send cmd
[88480.709855] sec_ts 1-0048: [sec_input] sec_ts_set_grip_type: re-init grip(0), edh:0, edg:0, lan:0
[88480.710712] sec_ts 1-0048: [sec_input] sec_ts_read_event: STATUS 1d 61 2 2 3 0 0 0
[88480.785047] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.789897] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.866986] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.871167] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88480.887234] droid-hal-init: processing action (ril.ecclist1=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:10)
[88481.947521] sec_ts 1-0048: [sec_input] [P] tID:0 x:587 y:13 z:30 major:7 minor:7 tc:1 type:0 noise:0
[88482.087851] sec_ts 1-0048: [sec_input] [R] tID:0 mc:15 tc:0 lx:608 ly:875 v:0100 cal:A2 id(0,0) p:0 noise:0 lp:(0)
[88483.036012] sec_ts 1-0048: [sec_input] [P] tID:0 x:455 y:906 z:37 major:9 minor:9 tc:1 type:0 noise:0
[88483.218268] sec_ts 1-0048: [sec_input] [R] tID:0 mc:21 tc:0 lx:1079 ly:999 v:0100 cal:A2 id(0,0) p:0 noise:0 lp:(0)
[88483.454417] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.460472] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.484245] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.498568] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.526892] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.540678] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.545438] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.550049] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.564878] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.582789] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88483.780908] set HBM mode=1
[88484.457486] sec_ts 1-0048: [sec_input] [P] tID:0 x:487 y:898 z:41 major:10 minor:10 tc:1 type:0 noise:0
[88484.498480] sec_ts 1-0048: [sec_input] [R] tID:0 mc:2 tc:0 lx:486 ly:899 v:0100 cal:A2 id(0,0) p:0 noise:0 lp:(0)
[88484.529177] set HBM mode=0
[88487.180085] sec_ts 1-0048: [sec_input] sec_ts_dsi_panel_notifier_cb: power down
[88487.180187] (NULL device *): deviceless supply vdd not found, using dummy regulator
[88487.180317] (NULL device *): deviceless supply avdd not found, using dummy regulator
[88487.184514] sec_ts 1-0048: [sec_input] sec_ts_power: off: avdd:on, dvdd:on
[88487.184594] sec_ts 1-0048: [sec_input] sec_ts_pinctrl_configure: SUSPEND
[88487.184613] Entering OFF state from 0
[88487.184616] AOD mode OFF
[88487.397686] @@@@ panel power off @@@@

This is:

  • Unlock using fingerprint
  • Open top menu
  • Swipe brightness from mid, to max, back to mid
  • Lock using power button

The most interesting bit I think:

somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Couldn't apply PCC calibration
somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Cannot send HSIC calibration
...
set HBM mode=1 // Swiped to max brightness / screen reaches max brightness
set HBM mode=0 // Swiped to lower brighness / screen lowers brightness down from max

This is what happens, when I fingerprint-unlock the screen with full brightness, and lock it again:

[88915.948070] [drm:dsi_display_set_mode] [msm-dsi-info]: mdp_transfer_time_us=15666 us
[88915.948077] [drm:dsi_display_set_mode] [msm-dsi-info]: hactive= 1080,vactive= 2520,fps=60
[88915.948124] [drm:dsi_ctrl_isr_configure] [msm-dsi-info]: dsi-ctrl-0: IRQ 385 registered
[88915.959483] dsi_panel_driver_touch_pinctrl_set_state: invalid 'somc_ts_int_active' pinstate
[88915.961236] @@@@ panel power on @@@@
[88916.008562] somc_panel_color_manager: somc_panel_inject_crtc_overrides (786): Override: Already have original funcs! Is setup called twice??
[88916.008614] somc_panel_color_manager: somc_panel_pcc_setup (884): Cannot read uv data: missing command
[88916.008644] somc_panel_color_manager: somc_panel_pcc_setup (888): u,v is flashed 0.
[88916.008670] somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Couldn't apply PCC calibration
[88916.008720] somc_panel_color_manager: somc_panel_colormgr_apply_calibrations: Cannot send HSIC calibration
[88916.015121] sec_ts 1-0048: [sec_input] sec_ts_dsi_panel_notifier_cb: power up
[88916.015162] sec_ts 1-0048: [sec_input] sec_ts_start_device
[88916.015189] sec_ts 1-0048: [sec_input] sec_ts_pinctrl_configure: ACTIVE
[88916.015293] (NULL device *): deviceless supply vdd not found, using dummy regulator
[88916.015673] (NULL device *): deviceless supply avdd not found, using dummy regulator
[88916.017847] sec_ts 1-0048: [sec_input] sec_ts_power: on: avdd:on, dvdd:on
[88916.022780] dsi_panel_driver_oled_short_det_handler: VREG_NG interrupt!
[88916.094287] sec_ts 1-0048: [sec_input] sec_ts_wait_for_ready: 09, 00, 10, 00, 00, 00, 00, 00 [0]
[88916.094302] sec_ts 1-0048: [sec_input] sec_ts_start_device: cover open, not send cmd
[88916.094523] sec_ts 1-0048: [sec_input] sec_ts_set_grip_type: re-init grip(0), edh:0, edg:0, lan:0
[88916.095315] sec_ts 1-0048: [sec_input] sec_ts_read_event: STATUS 1d 61 2 2 3 0 0 0
[88916.198566] set HBM mode=1
[88916.253020] droid-hal-init: processing action (ril.ecclist1=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:10)
[88916.257761] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88916.267108] droid-hal-init: processing action (ril.ecclist=*) from (/usr/libexec/droid-hybris/system/etc/init/ecclist.rc:6)
[88916.827450] healthd: battery l=34 v=3832 t=31.7 h=2 st=2 c=132446 fc=0 cc=8 chg=u
[88917.903470] set HBM mode=0
[88917.919899] rpmh_rsc_send_data: 211 callbacks suppressed
[88917.919903] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.929426] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.929444] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.934501] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.939145] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.943332] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.958085] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88917.980261] qcom_rpmh DRV:apps_rsc TCS Busy, retrying RPMH message send: addr=0x30010
[88918.003702] sec_ts 1-0048: [sec_input] sec_ts_dsi_panel_notifier_cb: power down
[88918.003803] (NULL device *): deviceless supply vdd not found, using dummy regulator
[88918.003930] (NULL device *): deviceless supply avdd not found, using dummy regulator
[88918.008004] sec_ts 1-0048: [sec_input] sec_ts_power: off: avdd:on, dvdd:on
[88918.008073] sec_ts 1-0048: [sec_input] sec_ts_pinctrl_configure: SUSPEND
[88918.008091] Entering OFF state from 0
[88918.008092] AOD mode OFF
[88918.221126] @@@@ panel power off @@@@
1 Like

I think I managed to find a “better” workaround (on my Xperia 10 III):

echo 1 > /sys/devices/dsi_panel_driver/hbm_mode ; sleep 0.1 ; echo 0 > /sys/devices/dsi_panel_driver/hbm_mode

This causes the colors to “snap” to their expected values, without visible brightness change (it only has 100ms to do so). Using delay of 0.05s works sometimes, 0.2s gives a visible “blink” but 0.1s seems to work fine. This requires root privileges, obviously. Also, hbm_mode (high brightness mode?) is the only file that changes its contents when the screen is at max or not at max brightness.

Now, how to trigger this into the event of display waking up…

Edit: That would be this dbus signal:

signal time=1660849773.992509 sender=:1.1 -> destination=(null destination) serial=37069 path=/com/nokia/mce/signal; interface=com.nokia.mce.signal; member=display_status_ind
   string "on"
signal time=1660849775.086880 sender=:1.1 -> destination=(null destination) serial=37075 path=/com/nokia/mce/signal; interface=com.nokia.mce.signal; member=display_status_ind
   string "off"
2 Likes