logo
 
WebChain/2 Previous Ramdom Jump WebChain/2 Home Next
 メインメニュー
 サイト内検索

検索オプション
 ログイン
ユーザID または e-mail:

パスワード:

IDとパスワードを記憶

パスワード紛失

新規登録
 IRC(チャット)
#OS/2:*.jp
楽しみ方はこの辺参照.
フォーラム一覧   -   トピック一覧
   アプリ
     Cairo support for OS/2
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
SofiyaCat
投稿日時: 05/08/22 20:44
Quite a regular
登録日: 05/08/01
居住地: 東京都
投稿: 47
Re: Cairo support for OS/2
よくわかんにゃいけど
割り算で0に近いときにゃは、単純に0で返っちゃえばいいのでわにゃ?

だめにゃのかにゃ?
(Cairo自体をしらにゃい猫でしたにゃ。)


----------------
Sofiya猫

orca
投稿日時: 05/08/22 23:50
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
「分母が 0なら」という処理が直前にあって, でも「0に近ければ」ではなかったので最初はどーかと思ってたです。

SofiyaCatさんは書きました:
よくわかんにゃいけど
割り算で0に近いときにゃは、単純に0で返っちゃえばいいのでわにゃ?

だめにゃのかにゃ?
(Cairo自体をしらにゃい猫でしたにゃ。)
調べていくうち, double → longのキャストで異常終了してたことが分かったです。
でも ホントは, long → shortのキャストでオーバーしてもエラーにはならないように, double → longでもエラーになるはずがないのに (たぶん)。
orca
投稿日時: 05/08/23 00:02
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
先ほどの処理を, 関数を呼び出さず直接計算するようにしたです。

typedef struct { int32_t x, y; } point_t;
typedef struct { point_t p1, p2; } line_t;

{
    line_t ln1 = {{12091084, 8127346}, {12088491, 9281989}};
    line_t ln2 = {{37176333, 8455717}, {37166807, 9224825}};
    double m1 = (double)(ln1.p2.x -ln1.p1.x) / (double)(ln1.p2.y -ln1.p1.y);
    double m2 = (double)(ln2.p2.x -ln2.p1.x) / (double)(ln2.p2.y -ln2.p1.y);
    double b1 = (double)ln1.p1.x /65536.0 - m1 * ((double)ln1.p1.y /65536.0);
    double b2 = (double)ln2.p1.x /65536.0 - m2 * ((double)ln2.p1.y /65536.0);
    double tmp = (b2 - b1) / (m1 - m2) *65536;
    printf("y_intersect = \n");
    printf("%d \n", (long)tmp);   // ← ここで異常終了
}

んで, この処理で異常終了することを確認して, コレをあっちこっちに移動させてみたです。
(1) DLLから svg.cに移しても異常終了 ・・・ DLLの問題ではなさそげ
(2) svg.cでの記述場所によっては, (-)の最大値として正しく扱うこともできる
(3) で, その場所は hmq = WinCreateMsgQueue(hab, 0); のトコ
… てことが分かったです。

hmq = WinCreateMsgQueue(hab, 0) の呼び出し以降, 上記の処理は異常として捉えられるっぽいです。
具体的には

void
main(int argc, char *argv[], char *envp[])
{
  HAB hab;
  HMQ hmq;
  QMSG msg;
  ULONG flCreaFlags, flFrameStyle, flClientStyle;
  SWP swap;
  PFNWP pOldFrameProc;
  HWND hwndFrame;
  HWND hwndClient;

  DosGetInfoBlocks(&tib, &pib);
  // Change flag from VIO to PM:
  if (pib->pib_ultype==2) pib->pib_ultype = 3;

  hab = WinInitialize(0);
  hmq = WinCreateMsgQueue(hab, 0);
  // ここからは異常終了。(↑)の位置での計算であれば, 異常終了しない

… はっきしゆってコレ以上は追いきれないかも。
sava
投稿日時: 05/08/23 21:50
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
とりあえず qemu 内の OS/2 環境 (FX00505, SVGA GENGRADD) で Cairo のサンプルを実行してみました。
速度はともかくとして、3つともバイナリ無修正で動作するようです。

clock
font
SVG

なのですが、その後、CL-GD5446 用のドライバ突っ込んでもういちど試したら TestApp のウィンドウの中身がひとっつも表示されませんでした。

とりあえず SVG だけ

…ディスプレイドライバの作りによっては…というか GRADD 系以外ではまともに動かないんじゃねえのかという悪寒。(なんか非公開 API で無理やりトップダウン DIB の設定してるし…)
orca
投稿日時: 05/08/23 23:38
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
実行してもらうと参考になるです。
異常さ具合から, σ(^^) のマシンに問題があるのでは? とか思うので。 てゆーか, CPUの問題?とか考えてたです。
けど, ディスプレイドライバーかもってことれすね。 σ(^^) の環境のも, あの計算+PMモード でダメになるっぽいし。


(なんか非公開 API で無理やりトップダウン DIB の設定してるし…)

"Change flag from VIO to PM" とかコメントが付いてるトコでしょーか?
でも svg.lnk の内容 "system os2v2_pm" に書き替えて PMだけにしても, 結局内部でエラーが発生してるよーでした。
orca
投稿日時: 05/08/24 07:49
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
もしかすると, 原因が同じで症状が違うだけなのかも ・・・ 異常終了と。
その後、CL-GD5446 用のドライバ突っ込んでもういちど試したら TestApp のウィンドウの中身がひとっつも表示されませんでした。

ftp.serina.org に, σ(^^) が使ってる cairo.dllを uploadしたです。ソレで試してみるってのはどーでしょー?
achain
投稿日時: 05/08/25 00:09
Webmaster
登録日: 03/01/26
居住地: とーきょー じゃぺーん
投稿: 2597
Re: Cairo support for OS/2
実行してもらうと参考になるです。

とのことなので遅まきながら試してみました.
(昨日までOS/2マシンの電源が死んでたもので…<言い訳)
残念ながら(?)当方の環境ではオリジナルパッケージそのままのファイルで動作しました.font.exeのウィンドウサイズをぐりぐり動かしていたら一度だけSYS3175りましたが,あとはいたってふつうに.

ちなみにRadeon 9600+SNAP 3.0.8です.

ftp.serina.org に, σ(^^) が使ってる cairo.dllを uploadしたです。ソレで試してみるってのはどーでしょー?

# httpの方に移しておきました.

で,当方この織華さん版cairo.dllに入れ替えてもみましたが,コンソールにいっぱいアスタリスクが出力される以外は特に変化は見られませんでした.
sava
投稿日時: 05/08/25 07:07
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
先ほど cairo.dll を入れかえて試してみました。結果は同じで、やはり 5446 では表示されませんでした。

非公開 API というのは cairo-os2-surface.c 中で使われている GpiEnableYInversion とかそのへんです。
ただこれは浮動小数点の例外とはあまり関係ないと思えるので…(あとは WinCreateMsgQueue の直後に _fpreset() とか _controlfp あたりを置いてみるとかしか思いつきません)
orca
投稿日時: 05/08/25 07:19
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
やはり正しく動く環境もあるんですね。
てゆーか, 異常終了のアレからすると, そんなことで止まる方がどーかしてるって感じだけど。
で, σ(^^) の環境は snapse218 … なのかな? SNAPなのは分かるけど, バージョンの確認方法分からなかったりして。
そんな訳で, なるべく最新のものを探しだしてもいちど試してみるです。

加工した cairo.dllは, 異常のときにしかあまり意味がないかもです。
んで, "**" は変換を行ったときに表示してるです。


追記: VGAモードで起動しても, σ(^^) の環境では同じ現象でした。
で, snap-os2-3.0.8.exe S3 SuperSavage/IXC の VGAサイズ, 1024×768 (256色), 16M色 それぞれ同じ現象。
graddbb_a.097.exe の VESAでも同じ。
snapse218 に戻して, やっぱり同じ現象れす。

もいちど現象をまとめてみると …
PMのモードを持つプログラムで, (ある特定の?)浮動小数点数を longにキャストすると異常終了してしまう, です。
ついでに, 単純にソレだけを行うプログラムを用意してみたです。(shapes.zip)
KAMUI
投稿日時: 05/08/25 22:29
Home away from home
登録日: 03/01/28
居住地: 名古屋だがね。
投稿: 714
Re: Cairo support for OS/2
cairo.dll 差し替えて見ました。
これまでは clock しか動きませんでしたが
font と svg も動く様になりました m(__)m

ウチは SNAP/se build 446 に S3 Savage4 (APG/16MB)環境。
orca
投稿日時: 05/08/25 23:22
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
ほかにも同様のトラブルの方が現われるとは, 心強い … じゃなくて。

KAMUIさんは書きました:
cairo.dll 差し替えて見ました。
これまでは clock しか動きませんでしたが
font と svg も動く様になりました m(__)m

ウチは SNAP/se build 446 に S3 Savage4 (APG/16MB)環境。

σ(^^) が現在使ってるのも同じ 446です。
ドライバのバージョンというよりは画面の解像度や色数に影響を受けませんかねぇ….

解像度は前の追記にも書いたけど, ほかにも 640×480, 800×600, 1024×768, 1152×864も試してみたです。 色数も 256, 16Mとか。 で, 標準 VGAのドライバー, GRADDのVESA(800×600) も試してみたです。

あと考えられるのは, 実は DOSモードを導入していないので, ソレかも, とか。
本来はそんなことでエラーになるとは思えないけど, http://www.os2.jp/anon-ftp/pub/os2/orca/ にある shapes.zipのソースを見ると分かるかもだけど, 取り立てて変わったプログラムじゃないのに, σ(^^) のトコだと環境変数 SHAPESをセットするだけで動かなくなるです。

他には, もうカーネルの(バージョンの?)問題? みたいな
orca
投稿日時: 05/08/25 23:29
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
非公開 API というのは cairo-os2-surface.c 中で使われている GpiEnableYInversion とかそのへんです。

OS/2の APIはさっぱりだけど, ここ(↓)に公開されているので, 完全に非公開ではなくソレなりに非公開なのかも。
http://wiki.netlabs.org/index.php/GpiQueryYInversion()

記されたのは今月のよーれすね。
chagrin
投稿日時: 05/08/26 02:34
Not too shy to talk
登録日: 03/01/27
居住地: yokohama, japan
投稿: 39
Re: Cairo support for OS/2
shapes.exe を試してみました.環境変数 SHAPES を設定すると,
私の環境でも SYS3180 で落ちてくれます.逆汗してみると,落ちるのは
コプロセッサ命令でなくcallですね(笑) ちなみに CPU は Cyrix-MIIです.
MIIって,コプロ命令はキューに詰め込んで整数命令を先走るので,
変なところで止まるのでしょうか... ま,それは良いとして.

shapes.exe にバイナリパッチを当てて,コプロのコントロールワードを取ると,
0x0362 とのことです.これを強制的に 0x37f に変更してみると,
落ちずに動くようになりました.

| 0104AE DB5C24 50 FISTP dword ptr [ESP+50h]
この命令で無効演算例外が起きて落ちると.

sava さん曰くの,fpreset だか controlfp だかで,コプロ設定(の例外マスク)
を調整してあげれば良いんだと思いますが...
sava
投稿日時: 05/08/26 03:17
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
shapes はうちの環境(例によって qemu ですが)ではとりあえず問題なく動くようです。

FPU の初期化/制御ワード再設定できるバージョンをためしに作ってみました。

shapes2.zip

うーん、環境によって例外マスクの外れ方が違うんでしょうかね…
chagrin
投稿日時: 05/08/26 05:22
Not too shy to talk
登録日: 03/01/27
居住地: yokohama, japan
投稿: 39
Re: Cairo support for OS/2
-shapes つけて実行.Cyrix-MII, MCP1, Maxtox G400, 2.36.106
FPU control word = 0x127f
Rounding : nearest
Precision : 53bits
Exception Masks : INV_OP DENORMAL ZERO_DIV OVERFLOW UNDERFLOW PRECISION

WinCreateMsgQueue
FPU control word = 0x0362
Rounding : nearest
Precision : 64bits
Exception Masks : DENORMAL PRECISION

y_intersect ==
SYS1808: 処理が停止しています。
ソフトウェア診断コード(例外コード)は 0097 です。

-fpreset や -reassign をつけると,動きます.
例外マスクの外れ方は同じに見えます.う〜ん,謎だ.
orca
投稿日時: 05/08/26 08:24
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
shapes2試してみたです。
異常終了のときのメッセージは chagrinさんとまったく同じ。
んで, -fpreset -reassign のどちらか片方でも付けると, FPU control wordが 0x0362 → 0x127f に戻って, (-)の最大値が普通に表示され処理は続行するです。
sava
投稿日時: 05/08/26 22:53
Quite a regular
登録日: 03/01/27
居住地: ちば…たぶん
投稿: 41
Re: Cairo support for OS/2
落ちる環境と落ちない環境がある、というのが実は素朴に疑問だったりするのです。
(これが落ちるのだとしたら、FPU を用いる他の PM アプリでも予期せぬ動作をする可能性があるわけで)

Winなんちゃらの中で FPU 関係のエラーがなんか出ていて、それが残ってしまっているのかも…と考えたのですがステータスワード見れないとわからないのでまた少し追加してみました。

shapes3.zip

他のコンパイラ(gcc, VAC)だとどうなるんですかね。

# もうだんだん Cairo そのものから外れていくような…
orca
投稿日時: 05/08/26 23:46
Home away from home
登録日: 03/01/28
居住地:
投稿: 269
Re: Cairo support for OS/2
こんばんは。
savaさんは書きました:
他のコンパイラ(gcc, VAC)だとどうなるんですかね。
# もうだんだん Cairo そのものから外れていくような…

shapes2は gccでも試してみたです。FPU control wordは 0x037f → 0x0362 → 0x037f
あとは同じで, -shapes で異常終了するです。
chagrin
投稿日時: 05/08/26 23:47
Not too shy to talk
登録日: 03/01/27
居住地: yokohama, japan
投稿: 39
Re: Cairo support for OS/2
#完全にcairoから外れて発言してます...

shapes3 -shapes -reassign の末尾.
-shapes だけだと落ちてしまって,ステータスが見えないので.

y_intersect ==
-2147483648
FPU status word = 0x4021
TOS C3 C2 C1 C0 ERROR-SUMMARY STACK-FAULT EXCEPTION: PE UE OE ZE DE IE
0 1 0 0 0 0 0 1 0 0 0 0 1

IE が立って,かつマスクされていない(0x0362)時は落ちてしまうと.
これ自体はとっても明快ですが,なんだって環境依存でこんな事になるのか,
とっても謎です.

カーネルとか,os2ldr(この娘が割り込み管理してたりしない?)とか,
ソフトウェア側に何かあるのでしょうか?
achain
投稿日時: 05/08/26 23:52
Webmaster
登録日: 03/01/26
居住地: とーきょー じゃぺーん
投稿: 2597
Re: Cairo support for OS/2
カーネルとか,os2ldr(この娘が割り込み管理してたりしない?)とか,
ソフトウェア側に何かあるのでしょうか?


浮動小数点ってことで実は数日前から気になっていたのですが,今回の件ってまさに「この件」と同じなのでは….
(1) 2 3 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Powered by IBM OS/2 Warp, Apache, PHP, MySQL and XOOPS Cube