ThinkPad535上のXFree86-3.3.2で16bpp

last update 1998/09/07

はじめに

ThinkPad535{,E}はビデオチップにTrident社のCyber9320を使用していますが、 このチップはXFree86-3.3.2(とたぶんそれ以前のバージョン)の SVGA用Xサーバ(XF86_SVGA)では8bppしか選択できません。 今回わずかな改造で運良く16bppで表示可能にすることができましたので、 パッチおよびmake済みのバイナリを公開します。 FreeBSD-2.2.6Rでmakeしたバイナリ(約1.2MB)はこちら→ XF86_SVGA_TP535.gz
(本パッチ・バイナリは無保証です。ご自身の責任でお試し下さい)

パッチ当てとサーバの作成方法

まずXFree-3.3.2のサーバのソース(X332servonly.tgz)を入手してください。
サーバのソースはhttp://www.xfree86.org/ より入手できます。
これに私の作成したCyber9320 16bpp対応化パッチ cyber9320-16bpp.patchを当てます。
X332servonly.tgzとcyber9320-16bpp.patchがともに${workdir}にある場合、 ソースの展開とパッチ当ては以下のようになります。
  % cd ${workdir}
  % tar zxvf X332servonly.tgz
  % cd xc
  % patch < ${workdir}/cyber9320-16bpp.patch
パッチは内容を見れば分かりますが、わずか3行の追加だけで済んでいます。
次にhost.defをコピーし必要に応じて編集します。
  % cp config/cf/xf86site.def config/cf/host.def
  % vi config/cf/host.def
私はXF86_SVGAだけを構築するため、host.def中の設定を変更しました。 以下がその変更した部分です。
  /*
   * Which servers do you wish to build, you can save a lot of disk space
   * by only compiling the server you will be using.  It will also save you
   * considerable compile time.
   *
   * The following servers are supported in Intel x86 platforms
   *
   */
  #define XF86SVGAServer          YES
  #define XF86VGA16Server         NO
  #define XF86VGA16DualServer     NO
  #define XF86MonoServer          NO
  #define XF86MonoServer          NO
  #define XF86MonoDualServer      NO
  #define XF86S3Server            NO
  #define XF86S3VServer           NO
  #define XF86I8514Server         NO
  #define XF86Mach8Server         NO
  #define XF86Mach32Server        NO
  #define XF86Mach64Server        NO
  #define XF86P9000Server         NO
  #define XF86AGXServer           NO
  #define XF86W32Server           NO
  #define XF86I128Server          NO

    <省略>

  /*
   * To build only the servers with a cut-down source tree, uncomment
   * this.
   *
   */
  #define BuildServersOnly        YES
host.defの準備ができたらmakeします。ディスクは約100MBytesを必要とします。
  % make World >& world.log
makeはThinkPad535MF9(CPU=Pentium 133MHz, Memory=40MBytes)で約2時間30分かかりました。
makeが成功したらインストールします。 オリジナルのサーバはすぐに元に戻せるように別名で保存しておきます。
  % su
  % mv /usr/X11R6/bin/XF86_SVGA /usr/X11R6/bin/XF86_SVGA.org
  % cp programs/Xserver/XF86_SVGA /usr/X11R6/bin
XF86Configの Section "Screen" で Depth 16 と記述して16bppを指定し、 Xを立ち上げます。
xdpyinfoで16bppになっていることが確認できます。 参考までに私の使っているXF86Configです。
  % xdpyinfo

    <省略>

  visual:
    visual id:    0x22
    class:    TrueColor
    depth:    16 planes
    available colormap entries:    64 per subfield
    red, green, blue masks:    0xf800, 0x7e0, 0x1f
    significant bits in color specification:    6 bits

使用感

8bppのときはアクセラレーションが効いていますが、16bppにすると アクセラレーションが無効となり、かなり遅くなります。 参考までにxengineのrpm数とJump ScrollをDisableにした80x24の kterm上でcat /etc/termcapの実行に要した時間を次の表に示します。 スクロール性能が桁違いに遅いようです。

bppxenginecat /etc/termcap
8bpp990rpm32sec
16bpp630rpm408sec

ドライバのソース(t89_driver.c)を覗いてみると、どうやら仮想画面の幅が 512, 1024, 2048, 4096pixelでしかアクセラレーションが効かない仕様の ようです。ThinkPad535では仮想画面の横幅を1024pixelにするとVRAM容量が 足らないので無理なのですが、この制限ってCyber9320でも避けられない ものなのでしょうか? Cyber9320の資料が欲しいところですね。

あとがき

以前bsd-nomadsで、ThinkPad535上のXFree86がちょっとした修正で16bppを出せそうだけど画面が出ない、 という話題があるのを目にして私もhackを始めました。 おそらくVGAレジスタの設定にもれがあるのだろうと仮定し、 VGAレジスタの設定値を読み出すプログラムを作成しました。 これを16bitカラーモードにしたWindows95とXFree86上の双方で実行した結果を比較し、 内容が異なるレジスタをしらみつぶしに叩いていくというやり方で16bppで画面を出すための レジスタ設定を見つけ出すことに成功しました。
レジスタを適当に叩いていく方法はビデオ回路に無理な負担をかける恐れがあるのですが、 Cyber9320の資料がない中でやるにはこれしかありませんでした。 今も問題なくThinkPad535が動いているのはラッキーなことなのかもしれません。


戻る

E-mail: kami@lares.dti.ne.jp
Copyright 1998 Masahiko KAMI