2020/07/24(Fri)ラップトップのAC電源状態が変化したとき、本体液晶画面が3秒暗転する

2020/07/24 4:09 Software::WindowsHardware::ThinkPad
Lenovo ThinkPad T490で発生した非常に不可解な現象ですが、とりあえず解決法を見つけたのでメモ。
(7/24更新)
追加調査の結果、この現象は「ダイナミック・リフレッシュ・レート・スイッチング」によるものだという事が分かった。(ページ下部参照)

環境

Lenovo ThinkPad T490 (Type 20N3)
OS: Windows 10 x64 Enterprise 1909
VGA: Intel HD Graphics 620
VGA Driver: Lenovoからダウンロードした最新 v26.20.100.7810 (2020/01/21)、及びIntelからダウンロードした v26.20.100.7926 (2020/02/25) / v27.20.100.8336 (2020/06/16) のいずれでも発症

※ただし自分でOSからclean installしていないので、他の要素が絡んでいる可能性あり

現象

Windowsにログオンした後、USB-CコネクタのAC電源を抜き差しすると、1-2秒遅れてから画面が3秒間暗転する。ただ真っ暗になるだけで作業状況は失われないが、単に鬱陶しい。
Windows起動前や、ログイン前のロック画面ではこの現象が起こらない。

イベントビューアでは、Source:Kernel-Power ID:105 "電源の変更"が記録された後(これは正常)、Source:Display ID:4107 "呼び出し元が SetDisplayConfig() API への呼び出しに SDC_FORCE_MODE_ENUMERATION フラグを指定しました" が記録される。
igfxem-event.png


SDC_FORCE_MODE_ENUMERATIONとは?

SetDisplayConfig のドキュメントを読んでみると、
The caller requests that the driver is given an opportunity to update the GDI mode list while SetDisplayConfig sets the new display configuration. This flag value is only valid when the SDC_USE_SUPPLIED_DISPLAY_CONFIG and SDC_APPLY flag values are also specified.
ということで、ま、要は、電源状態の切り替えとともに新しいディスプレイ設定を適用しようとして、一時的に画面が暗転しているようだ、ということが分かった。

ラップトップのように、安定したAC電源だけでなくバッテリ駆動をする場合には、それぞれでパフォーマンスを変動させる意図は分かるのだが、歴代使ってきたThinkPadではこのようなディスプレイ暗転まで起こった事は無かった。使い勝手を下げてまで、これをする意図はないと思うので、この挙動が起こらないようにする。

やってみたこと

まずは、新しいドライバに更新するのが鉄板なので、Intelからダウンロードして適用。
元々v26.20.100.7926 (2020/02/25)だったのを、v27.20.100.8336 (2020/06/16)に上げたが挙動変わらず。
一度グラフィックドライバーを全て削除したところ、Microsoftの基本ドライバーで動作中は現象が起こらなかったため、やはりIntel HD Graphics関連だと言うことは分かった。
しかし、Lenovoからダウンロードした最新 v26.20.100.7810 (2020/01/21)でも発症するので、切り札のメーカー推奨ドライバーもダメっぽい。


となると、よくあるのが、Windowsサービスだということで、Intelと名の付く物を全部落としていったのだが、解決せず。(後述の罠あり)
次に、Windowsログオン後から発症するということで、起動中のIntel製アプリを順番に落としていったところ、igfxEM.exeを終了させた時点で、挙動が変わった。

つまり、Windowsログオン後に起動するigfxEM.exeがこの暗転を引き起こしており、Intel(R) HD Graphics Control Panel Service経由で起動していることが、Process Explorerを使って分かった。が、このサービス、一度起動してから終了すると、explorer.exe配下でigfxEM.exeを起動するらしい。なんてこった!だから、サービスを終了しただけでは、挙動が変わらなかったのか……お行儀の悪い。

解決策

というわけで、WindowsサービスのIntel(R) HD Graphics Control Panel Serviceのスタートアップの種類を無効にして、Windowsを再起動すれば良い。
すぐに再起動できない場合は、タスクマネージャからigfxEM.exeを終了すると収まる。
igfxem-service.png

考察

冒頭にも書いたように、このシステムは自分で1からセットアップしていないので、最初のインストールで失敗した何かを引きずっている可能性はあり得る。
一つ気になったのは、通常Intelのグラフィックドライバを入れるとスタートメニューに登録されるIntel(R) Graphics Control Panelがこの環境には存在しない。
ThinkPad用のドライバとして稼働する場合にはインストールされないor有効化されないだけなのかもしれないが、こうした齟齬がigfxEM.exeの不可解な挙動を引き起こしている可能性はあり得る。

真の原因 17:25

どうやら同一構成でインストールされた別個体では、この現象が起こらないという話を耳にしたため、先のサービスのDriver cache*1から削除し、改めて正常個体が導入しているメーカー推奨ドライバをインストール。
それでも該当機の挙動は再発したため、別の原因を思い出していたところ、自分はMicrosoft Storeアプリを起動して全てのアプリを更新したことを思い出した。その中にインテル(R) グラフィクス・コマンド・センターがあったのだ。スタートメニューに現れないので、すっかり存在を忘れていた。
igfxem-store.png


これを起動してみると、システム - 電源の中に怪しい設定項目がある。
ダイナミック・リフレッシュ・レート・スイッチングである。(画像は既にオフにした後だが、デフォルトは有効だった)
igfxem-dynrrsw.png


説明によると
ディスプレイのリフレッシュ・レートを動的に下げることにより、複数のリフレッシュ・レートをサポートする内蔵ディスプレイの電力を節約し、バッテリー持続時間を延ばします。
これだー!!

なるほどこれを有効にした状態でAC電源を抜くと、リフレッシュレートが60Hzから48Hzに落ちている。
igfxem-refrate1.png

ディスプレイ側が60Hzと48Hzの両方をサポートしているらしい事も分かった。
igfxem-refrate2.png


比較対象として、以前使用していたThinkPad T450sでは、60Hzしかサポートされておらず、そもそも性能的にこのような機能を実装できないと思われる。
確かにリフレッシュレートを切り替えるなら、一度画面表示が切れるのもうなずけるし、設定を無効化すると、ピタッとこの現象は収まった。

自分でオンにした覚えはないのだが、グラフィック・コマンド・センターのアップデートを適用したら元に戻ってしまったような挙動も見られた*2ので、また再発したらもう一度オフにすればよさそう。

*1 : C:\Windows\System32\DriverStore\FileRepository\cui_dch.inf_*のディレクトリ

*2 : 開きながら更新したせいかも