BoxedwineをEmscriptenでビルドして動かすメモ
Boxedwine
↑ で以前紹介したLinux + x86エミュレータ。この場で試したければ公式サイトにデモが置いてある。
Emscripten移植もちゃんとメンテナンスされていて、最新版では音声等に改善がみられる。
Emscripten版
ネイティブ版は動的リコンパイラもありかなり快適に動作するが、Emscripten版は:
- 遅い(386-16MHzくらいか)
- 音は出る
- DirectX (Direct3D)はまだ(後述)
という感じ。 CheerpX がデモを見る限り割と常識的な速度のx86エミュレーションを実現しているのを考えると、もうちょっと向上の余地はあるのかもしれない。
ビルド
リポジトリをチェックアウトして、 /project/emscripten/buildjs.sh
を実行すれば良い。 emcc
にパスを通しておく必要がある。
emscripten 2.xx 対応
ターゲットしているEmscriptenが古いので、手元では createFolder
→ mkdir
への書き換えが必要になった。
EDIT: upstreamは createPath
を使ったようだ: https://github.com/danoon2/Boxedwine/commit/f35755e710cc7b63e5d666da2bb0f04fb540b654
function buildBrowserFileSystem(writableStorage, isDropBox, homeAdapter, extraFSs, zipfs)
{
FS.createFolder(FS.root, 'root', true, true);
FS.createFolder("/root", 'base', true, true);
FS.createFolder("/root", 'files', true, true);
↓
function buildBrowserFileSystem(writableStorage, isDropBox, homeAdapter, extraFSs, zipfs)
{
FS.mkdir("/root", 511);
FS.mkdir("/root/base", 511);
FS.mkdir("/root/files", 511);
起動
以下をHTTPでサーブする:
boxedwine.css boxedwine.js boxedwine.zip browserfs.boxedwine.js
boxedwine.html boxedwine.wasm boxedwine-shell.js jszip.min.js
boxedwine.zip は、 https://sourceforge.net/projects/boxedwine/files/FileSystems/Full/v5/ からDebian10-Wine-5.0.zipをダウンロードし、リネームしておく。ファイルシステムに加えたいものがあれば、この.zipを編集することでファイルを投入できる。
( boxedwine-shell.js
側にDropbox連携等も実装されているので、ドキュメント参照 https://github.com/danoon2/Boxedwine/blob/fb3b4261dba58e9f6edc4c5e46126a691792cf3a/buildFlags.txt#L17 )
(OpenGLサポート)
BoxedwineにはOpenGLとOpenGL ESの両方のサポートが入ってはいるものの、ES側はあまりメンテナンスされていないようだ。
#if defined(BOXEDWINE_OPENGL_SDL) || defined(BOXEDWINE_OPENGLS_ES)
ここのtypo (OPENGLS
→ OPENGL
)や、拡張のwrapが不十分などの理由で正常にビルドできない。
代わりに emscripten/integrate-gl4es
ブランチがあり、そちらでは gl4es (レガシOpenGLをOpenGL ESでエミュレートするもの)の統合をやっている。ただし、手元では正常に動作させることができなかった。
Emscripten自体にもレガシOpenGLのエミュレーションレイヤはあるが、多分gl4esを使った方が良い結果が得られるのではないかと思う。
Discussion