nVidiaのOpenGLドライバは、シェーダのソースコード中に #pragma を埋め込むことで、GLSLのコンパイラの最適化処理を制御できます。
公式なドキュメントが見つからないのですが、#pragma では以下のオプションが使えるようです
#pragma optionNV(inline all) #pragma optionNV(fastmath on) #pragma optionNV(fastprecision on) #pragma optionNV(ifcvt none) #pragma optionNV(strict on) #pragma optionNV(unroll all)
機能的には
- inline は関数のインライン展開の制御
- fastmath (調査中。おそらく gcc の fastmath と同義 )
- fastprecision 倍精度、単精度の切り替え
- ifcvt (調査中。おそらくx86 でいう cmov をつかうか否か)
- strict (調査中)
- unroll 繰り返し処理の展開による最適化のOn/Off
とう雰囲気です
公式ドキュメントが見つからないので断言は出来ませんが、調べた限りでは nVidia のコンパイラは、デフォルトでは関数のインライン展開を行わないようです。
手元のシェーダは
#pragma optionNV(inline all)
をつけるだけで、フレームレートが20%程向上しました