20-Jan-2015の続き。とりあえずFIFO経由での描画にも対応させてみました。ソースコードと、ベンチマーク結果(ods)を転がしてみます。やっていることは大したことではないのですが、VMware SVGA IIのレジスタにちょっとヘンな値を書き込むだけでVMware自体がクラッシュして落ちてしまうなんてこともあり、思っている以上に時間を使ってしまいました。
B-benchを使用したベンチマークで得られた結果より、こんな傾向がありそうです。
- ウィンドウモードとフルスクリーンモードとの間で、パフォーマンスに差は無い
- T-Kernel/2 x86標準のドライバでは、主メモリバッファを使うと非常に遅くなる
- 今回作成したドライバにおいて、FrameBuffer経由での描画性能はT-Kernel 2/x86標準のドライバと変わらない
- 今回作成したドライバにおいて、FIFO経由(使用するFIFOの量は最小)での描画性能はT-Kernel 2/x86標準のドライバと変わらないものの、仮身オープン回数のスコアは大きく落としてしまう
- 今回作成したドライバにおいて、FIFO経由(使用するFIFOの量は最大)での描画性能はT-Kernel 2/x86標準のドライバよりも若干高速であり、仮身オープン回数のスコアも上がる
なんとなくですが、画面表示のエミュレーションが忙しくなるとディスク周りのエミュレーションに手が回らなくなり、画面表示のエミュレーションをサボらせるとディスク周りのエミュレーションに余裕が出るとか、そんな気がします。PC全体を一つのCPUで真似る(ということにしておく)以上、当然といえば当然なのですが。
これもなんとなくですが、FrameBufferを使用した場合は適当な周期で画面全体を描画するのに対し、FIFOを使用した場合は適当な周期で画面描画を行う点は変わらないものの、更新が必要な範囲のみを描画するために若干速くなるのでしょう。また、更新が必要な範囲をある程度溜め込んでおいた場合、適当に整理してまとめて描画するといった処理を行い、画面描画の頻度を減らす工夫をしている可能性も考えられます。
♪
使用環境を簡単に書いておくと、AMD A8-3850を使用したPC、Windows 8.1 Pro(64bit)上で動作するVMware Player 7.0.0、T-Kernel 2/x86の.vmxファイルその他仮想マシンの構成はT-Kernel 2/x86のCD-ROMにあるものをそのまま使用しています。
♪
今回のソースコードは、画面への描画要求があった場合はこれをFIFOへ複数溜め込むことはせずにその都度画面描画を行わせるよう、ベンチマークスコアを犠牲にする設定をデフォルトにしています。というのも、マウスポインタの動きがどうにもガクガクで見ていられないというのがその理由だったりします。
正直言ってこの辺の味付け、どうするのが正解なんですかね。今回は実験ということもあり意図的に極端な事をやっていたりするのですが(FIFOの使い方も、一部VMware SVGA Device Developer Kitに書かれた記述に反している部分があります)。とりあえずソースコードも出しているし、不具合や不満があってもまあなんとかなるっしょということで投げてしまいます。59.40kg(06:05)
03-Jan-2015補足:超漢字Vへも移植してみました。ベンチマーク結果も大体似たようなものではあるのですが、FIFO経由(使用するFIFOの量は最小)での描画性能が超漢字標準のドライバよりも若干落ちるのが気になります。HDDのDMAはoffとしているからなのか、それとも他の理由かまでは調べていません。