C-WebGL: WebGL2のAPIレビュー
WebGL2のAPIをレビューして、C-WebGLのパススルーに載せていく。
仕様書のバージョン
- https://registry.khronos.org/webgl/specs/latest/2.0 -- 最新
- https://registry.khronos.org/webgl/specs/2.0/ -- 成立当初のバージョン
基本的には最新を見る。例えば、バッファのreadのblock時間を最小にするために、ヒューリスティックとしてfenceを使うことが明示されている。(このヒューリスティックがあるので、promiseを取るgetBufferSubData案が廃案になった)
ヘッダ更新
とりあえずヘッダを更新した。
これだけでも結構な量があるな。。いくつか新しい型が増えた。符号なし整数 u
、 配列 iarray
。
64bit整数もタイムアウトでだけ使われているが、C-WebGLでは非ゼロのタイムアウトはサポート予定が無いので特になにもしないことにした。
Query オブジェクト
getQuery
は投入されたQueryオブジェクトそのものを返却すべきなのか、それとも新規にアロケートして良いのか。。とりあえず新規にアロケートする方向で実装してみた。
Sampler オブジェクト
特記事項なし。
Sync オブジェクト
GLSync
はGLESの識別子としては珍しいポインタとなっている(GLES 3.0 2.4 の表で ptrbits
とされている)。 ...もしかしてコレがEGLのコンテキスト共有で単一アドレス空間を要求している理由か。。?
WebGLではコンテキスト間同期するケースが存在しないので、waitSyncは事実上意味が無い操作になっている。しかし、C-WebGLでは複数コンテキストをサポートするつもりなので入れておく。ただし、タイムアウトは指定されても使わない。つまり、常に
glWaitSync(obj, flags, GL_TIMEOUT_IGNORED)
となる。
TransformFeedback
一旦スキップ。誰も使わないでしょ最近は。。
transformFeedbackVaryings
と getTransformFeedbackVarying
をどういうインターフェースにしたもんか考えたい。
bindに null
を渡せるのをすっかり忘れていた。この場合はOpenGL的にはゼロ番をbindするのが正しい。
UBO
これ地味に難しい。。
可変長の getParameter
はWebGL2で初登場になるのでやりかたを考えないと。。とりあえず、今回は可変長になるのが UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES
だけで、その長さは確実に UNIFORM_BLOCK_ACTIVE_UNIFORMS
になることを利用して2pass実装とした。
2章
... GLES2での2章であって、WebGLでもGLES3でも2章では無いけど。。
getBufferSubData
の実装が、 glMapBufferRange
→ glUnmapBuffer
のシーケンスに。これ遅いよね。。まぁその辺の最適化はtracker版でやれば良いんじゃないだろうか。。あんまりベンチマークに悪影響を及ぼすようならちょっと考えるって事で。。
3章
PIXEL_UNPACK_BUFFER
が追加されたので、それ用の専用のAPIバリエーションを用意した(cwgl_*_buffer
)。本家WebGL2ではオーバーロードで対応しているが、C-WebGLはC言語なのでオーバーロードは使えず、ユーザーが明示的に呼び分ける必要がある。
まぁ99%のケースで問題ないが、通常のGLESアプリとの互換性のために、どこかでバッファのバインディングを覚えておく必要が出る。この手のステートトラッキングの便宜のために、コンテキストにユーザーポインタ的なのを渡せるようにした方が良いんだろうか。。
4章
特記事項なし。
可変長のデータを送信する際に、C-WebGLは引数が (可変長データの先頭, エレメント数)
の順になるけど、GLは逆なのでちょっと直感的ではないな。。まぁC-WebGL自体が直接使うことをあまり想定していないのでそこまで大きな問題ではないと思うけど。
6章
Unity動かすのには不要なので実装はスキップ。