8. ほかのライブラリやフレームワークとの連携

ほかのグラフィックス関連のライブラリやフレームワークと平行して、GD ライブラリを利用する際の注意点を説明します。

8.1. 初期化時の注意点

ほかのフレームワーク(NintendoWare など)と同じコマンドリストを使用する場合は、コマンドリストの初期化を複数回呼ぶことがないように注意してください。

コード 2-1 で示したコードを例にすると、NintendoWare でコマンドリスト関連の初期化を済ませていた場合は GD ライブラリの初期化関数(nn::gd::System::Initialize())のみを呼び出します。

8.2. nn::gd::System::ForceDirty() の利用

GD ライブラリの関数以外で 3D コマンドを 3D コマンドバッファに書き込んだ場合、GD ライブラリの内部状態と GPU との同期が取れなくなる可能性があります。そのような場合には、nn::gd::System::ForceDirty() を呼び出していくつかのモジュールを「dirty」にし、対応するモジュールのすべての 3D コマンドが再送されるようにします。

ForceDirty() によって「dirty」となったモジュールは、描画コマンドが実行されたタイミングで 3D コマンドを生成します。すぐに 3D コマンドを生成する場合は、nn::gd::System::FlushDirtyModule() を呼び出してください。

イミディエート関数で設定されたレジスタの内容は GD ライブラリ内では保持していません。そのため、イミディエート関数でレジスタの内容を書き換えていた場合は、3D コマンドが生成されたあとにイミディエート関数を呼び出して、再度レジスタの内容を設定する必要があります。

内部状態については「1.2.2. モジュールの状態管理」を参照してください。

8.3. コマンドリストの二重化

GD ライブラリの関数の中には、コマンドリクエストをキューイングするものがあります。コマンドリストが実行されるまでキューイングされたコマンドリクエストは実行されることはありませんので、そのコマンドリストが実行される前にコマンドリクエストで扱ったリソースを書き換えたり削除したりしないように特に注意してください。

2 つのコマンドリストを利用しているフレームワークでも同様の注意が必要です。これは、コマンドリストを二重化している場合に、次のフレームの作成に使用するコマンドリストにコマンドリクエストがキューイングされるためです。

8.4. ダミーコマンドの挿入

nn::gd::System::AddDummyCommands() を呼び出して、GPU に命令として認識されないダミーコマンドをコマンドバッファに追加することができます。ダミーコマンドは、次に実行するコマンドまで Wait しなければならないときや、コマンドバッファのサイズ調整に利用します。