2016/04/02

ディスプレイの位置・・・

・・・マルチディスプレイ構成での、プライマリディスプレイの扱いについて。

nVIDIA製品のコトは知らないし興味もナイ、ココで取り扱うのはAMD GPUでのハナシ。
って、一般的な設定でのと事案と云うより、プログラムを組む場合の、プライマリディスプレイ取得に関する考証。 ■ まず 結論から。
AMD製GPUで マルチディスプレイを構成している場合、仕様上
ディスプレイ番号で [1] を指定しても、プライマリディスプレイを取得出来ない可能性もある。

◆ コレは、
Eyefinity等 拡張性/運用の柔軟性を重視したハード/ドライバ設計に因るモノ。
・・・と云っても欠点ではなく、一般の利用であればむしろ利点でしかない。 ただ、ディスプレイを制御するアプリケーションを組む側から診ると、少しだけ面倒になっていると云うだけ。
■ 御存知の通り、
◆ AMD GPUでは 1カードで 最大6ディスプレイ構成が組める。
[1][2][3]
[4][5][6] ←どのディスプレイでも 1つを任意にプライマリとして指定出来る。
グラボ4枚挿しなら 24ディスプレイも可能となっているのだが、 一般での利用では サスガにソレはないと思うので割愛するが・・・(^_^;) ◆ もしEyefinityモード・・・
・・・これらディスプレイ群を1つのデスクトップとして稼動させる設定で利用の場合、

全ディスプレイがFullHDと仮定すると、
[1][2][3]   この構成の場合、[6]がプライマリディスプレイであれば
[4][5][6]   左上の座標は、x=3840 y=1080 となる。
このモードでは、全ディスプレイ分を足した範囲 x=5760 y=2160が、 1つのデスクトップ領域となり、ディスプレイ番号は [1] しか存在しなくなる。
■ しかし、
Eyefinityでの運用は 意外に現実的でないシーンのほうが多い。

と云うのも、Eyefinityの場合、ゲームなどでフルスクリーンモードを使用すると、全てのディスプレイが そのアプリケーションに占有される。
以前のドライバでは、Eyefinityでは CrossFireXが機能しなくなるなどのデメリットもあり、嫌煙される原因となっていた。
現在では、Eyefinity で CrossFireX を併用し、複数のグラボを効率よく稼動させる事が可能になっているので、
全ディスプレイでゲームをプレイしたい向きには、朗報だったと云えるだろう。
それでは おきつねさまのように、ゲームをプライマリでフルスクリーンプレイ、サブでシステムステータス表示 と云った利用は成立しない。 やはり別々のデスクトップで、別のディスプレイとして扱われるほうが都合が良かったりする。
■ 結局のトコロ、
Eyefinityで 1つのデスクトップとして使うのがいいか、
非Eyefinityで 複数のデスクトップとディスプレイという扱いの構成での運用がいいか の差だ。

これらの点では、ドライバの改良もあり、ドチラであっても問題になるようなコトは ほぼ無い。
■ だが、
アプリケーション側から プライマリディスプレイを指定する となると話は変わってくる。

前述の通り、Eyefinity状態なら 多数のディスプレイであっても ディスプレイは1つしかない として扱われるから支障は無い。
しかし、通常環境(非Eyefinity状態)では、複数のディスプレイと 同じ数のデスクトップが存在し、番号が割り振られている。

◆ コレが、以前のシステムなら、
ディスプレイの識別番号1 が プライマリディスプレイだった。
 ・・・コトで、大きな落とし穴となってしまっている。
■ と云うのも、
AMD GPU群では、ディスプレイ番号が 接続端子に応じて、固定で割り振られているからだ。

◆ ツマり、
(アプリケーション側から見える)ディスプレイ識別番号 ≠ ディスプレイ識別順位 
ってコトになり得るのだ、ドライバでのプライマリの指定や、ディスプレイの物理的設置次第でね・・・ ◆ 前提として、
AMD GPUのグラボは HDMI DVI(変換でRGB) DisplayPort の3端子がリファレンスの構成となっている。
◆ それら出力端子のうち
DisplayPortに関しては、対応したディスプレイを所有していない為、不明だが、
HDMIとDVI(RGB)では、番号が振られる優先順位は HDMIが DVIより上であるのは 確認出来ている。

DVIに変換コネクタで繋ぐアナログRGBのディスプレイも DVIと同じ順位となる。 
■ ココからは、
おきつねインフラ固有のハナシとなる。

◆ 具体的には おきつね2nd端末の
▼ ディスプレイ構成
[1] TV [Victor LT-26LC60] - HDMI入力
[2] タッチパネルLCD [iiyama PL T2451MTS] - DVI入力
で、 その物理配置は
[1][2] ← [2] がプライマリディスプレイ。
こうなってる。
・・・もう、お気付きの向きも多いだろう。 そう、プログラム側から [1]をプライマリだと思って指定されていると、 実はサブディスプレイに描画してしまっている と云う結果になる。 ◆ コレが おきつね1st端末なら
▼ ディスプレイ構成は
[1] タッチパネルLCD [iiyama PL T2451MTS] - HDMI入力
[2] LCD [BUFFALO FTD-G741A] - RGB入力
こうなってて、 配置は
[1][2] ← [1] がプライマリディスプレイ。
こう。
つまり、番号が振られる優先順位を踏まえれば、設定と物理レイアウトの関係で、 1st端末で発生しない問題も、2ndでは発生しうる と云うコトだ。 コンピューター用のディスプレイであれば、入力端子も多彩で、レイアウトと接続先を一考すれば、 プライマリディスプレイを画面[1]にするコトは可能だ。 しかし家電である TVに、DVI入力は ほぼ期待出来ないと考える。 多くのケースで、物理的に TVを ディスプレイ[2]以降にするのが難しい現実に直面するコトとなるだろう。
昨今では、アプリケーションを稼動させるマシンと ディスプレイの関係は、以前にも増して多様化している点も考慮に入れると、 意外に、描画領域への制御を行うアプリケーションを構成するのが 如何に大変である事か 判って頂けたかと思う。