sceGuCopyImage()関数に関連して

sceGuCopyImage()関数を利用してライフゲームのセルを描画しているのだけど、グローバル変数をたくさん(といってもせいぜい十個くらいだが)宣言しすぎると、どういうわけか描画がおかしくなる。理由はまったく不明*1

この関数は、画像データのピクセル列、画像幅、矩形*2、ビット深度、出力先の矩形などを指定して(おそらくはPSPのVRAMに直接)コピーするもの(と予想される)。上記のような条件を満たしていると、入力の先頭の数ピクセル分が黒になってしまい、結果左上数ピクセルが黒くなる。ただし、関数のほうに問題があるのか、それとも入力が既におかしいのかはまだわからない。調べるかもしれない。

追記

やけになって膨大な量の変数を宣言してみたら直った。神はサイコロを振っているようです。

仮説

PSPSDKの英語ドキュメントを解読すると、Note:Data must be aligned to 1 quad word (16 bytes)などと記されている(知っていた)。僕はこれを「幅が16バイト単位でなければならない」と解釈していたのだけど、もしかして、データの位置もそろえておかなければならないのか。ややこしい。今から試行錯誤する。

結論

変数宣言の順番を変更して、バッファを一番最初に持ってくると、うまくいった。やれやれ。

しかし

おかしい。コントローラからの入力と戯れていたら再発した。うぐぅ。崩れゆくバベルの塔のようです。

解決

型名と変数名の間に__attribute__((aligned(16)))を挟むとうまくいった。サンプルではディスプレイリストの宣言に使われていたのだけど、指定したバイト単位にそろえる働きがあるのか。どうやらgccの拡張らしい。そうか。にしても、解決策が見つかってよかった。幸せです。あと、眠い。

*1:この「原因」も、対照実験によって得られた仮説でしかない

*2:Rectangleのこと。左上座標とサイズのある値