Chiharu の日記

絵描き C/C++ プログラマーの日記です。

Parallel force - パラレル・フォース 〜GCC4 対応を完了

先日の日記の続き。
PandaBoard が届くまで、まだしばらくかかるので、パラレル・フォースの GCC4 向けの移植作業を進めていました。もともと Windows 向けに作っていたので、まず手始めに Cygwin 環境でのビルドに対応しました。C++0x 万歳的なコードですので、GCC4.5.x を使ってます。対応時にひっかかったのは下記。

windows.h を使うと min, max が stl と競合する。

これは Makefile にて gcc コンパイルオプションとして -DNOMINMAX を追加することで対応。

演算順序の不確定を指摘される。

描画処理コードの画素のブレンド処理にて下記のようなコードがあったのですが、

void foo()
{
 *aDst++ = op(*aDst, *aSrc++, aAlpha);
}

aDst が不確定と警告されたので、下記のように書き換えました。

void foo()
{
 *aDst = op(*aDst, *aSrc++, aAlpha);
 ++aDst;
}

関数テンプレートの定義順序不正を指摘される。

もともとは下記のような順序で定義していたのですが、

template<class T>
const std::shared_ptr<Type> alloc(const std::size_t iLength);
template<class T, std::size_t N>
const std::shared_ptr<Type> alloc(const std::size_t iLength);

呼び出し先となる alloc が決定できないとエラーになったので、下記のように書き換えました。

template<class T, std::size_t N>
const std::shared_ptr<Type> alloc(const std::size_t iLength);
template<class T>
const std::shared_ptr<Type> alloc(const std::size_t iLength);

_beginthreadex が使用できない。

もー、いろいろ検討して、PandaBoard 向けが最終ゴールということで、Thread パッケージの全クラスをプロキシ パターンで抽象化し、Win32API 版と POSIX 版の実装を揃える方針に切り替え。クリティカル セクションとスレッドは対応完了。残るはイベント。
―――イベントって、POSIX は何が相当するんだろう…。調べよう。

XAudio2 が使用できない。

もともと Null Device パターンで切り離し可能にはしてあったので、当該オブジェクトの生成処理をマクロで切り離しました。
―――PandaBoard だとどんな API で音を出すんだろう…。調べよう。

パフォーマンス モニタ系 API が使用できない。

アプリ部でちょろっと CPU 占有率を表示しているだけなので、さくっとマクロで切り離しました。
―――PandaBoard でも CPU 占有率は表示したいなぁ。まぁ、メンバのうちの誰かが調べるだろうから、その成果を使わせてもらおう。
ということで、地味に時間が掛かりました。特に Thread は完全な POSIX 対応を済ませておきたいところです。Win32API におけるイベントって、POSIX では何をどう使うのが妥当なんだろう。んー。pthread_cond_* を使うっぽいんだけれど。ふーむ。