sceGuCopyImage()関数に関連して
sceGuCopyImage()
関数を利用してライフゲームのセルを描画しているのだけど、グローバル変数をたくさん(といってもせいぜい十個くらいだが)宣言しすぎると、どういうわけか描画がおかしくなる。理由はまったく不明*1。
この関数は、画像データのピクセル列、画像幅、矩形*2、ビット深度、出力先の矩形などを指定して(おそらくはPSPのVRAMに直接)コピーするもの(と予想される)。上記のような条件を満たしていると、入力の先頭の数ピクセル分が黒になってしまい、結果左上数ピクセルが黒くなる。ただし、関数のほうに問題があるのか、それとも入力が既におかしいのかはまだわからない。調べるかもしれない。
追記
やけになって膨大な量の変数を宣言してみたら直った。神はサイコロを振っているようです。
仮説
PSPSDKの英語ドキュメントを解読すると、Note:Data must be aligned to 1 quad word (16 bytes)
などと記されている(知っていた)。僕はこれを「幅が16バイト単位でなければならない」と解釈していたのだけど、もしかして、データの位置もそろえておかなければならないのか。ややこしい。今から試行錯誤する。
結論
変数宣言の順番を変更して、バッファを一番最初に持ってくると、うまくいった。やれやれ。
解決
型名と変数名の間に__attribute__((aligned(16)))
を挟むとうまくいった。サンプルではディスプレイリストの宣言に使われていたのだけど、指定したバイト単位にそろえる働きがあるのか。どうやらgccの拡張らしい。そうか。にしても、解決策が見つかってよかった。幸せです。あと、眠い。