Open11

C-WebGL: WebGL2のAPIレビュー

okuokuokuoku

WebGL2のAPIをレビューして、C-WebGLのパススルーに載せていく。

仕様書のバージョン

基本的には最新を見る。例えば、バッファのreadのblock時間を最小にするために、ヒューリスティックとしてfenceを使うことが明示されている。(このヒューリスティックがあるので、promiseを取るgetBufferSubData案が廃案になった)

https://github.com/kainino0x/getBufferSubDataAsync-Demo

okuokuokuoku

ヘッダ更新

とりあえずヘッダを更新した。

https://github.com/okuoku/cwgl/commit/171afdef1d78faecb4925248e6124d8eda4be855

これだけでも結構な量があるな。。いくつか新しい型が増えた。符号なし整数 u 、 配列 iarray

64bit整数もタイムアウトでだけ使われているが、C-WebGLでは非ゼロのタイムアウトはサポート予定が無いので特になにもしないことにした。

okuokuokuoku

Sync オブジェクト

https://github.com/okuoku/cwgl/commit/3bcaeeaca8b79b68db1ab7db0582beb2c05ddeee

GLSync はGLESの識別子としては珍しいポインタとなっている(GLES 3.0 2.4 の表で ptrbits とされている)。 ...もしかしてコレがEGLのコンテキスト共有で単一アドレス空間を要求している理由か。。?

WebGLではコンテキスト間同期するケースが存在しないので、waitSyncは事実上意味が無い操作になっている。しかし、C-WebGLでは複数コンテキストをサポートするつもりなので入れておく。ただし、タイムアウトは指定されても使わない。つまり、常に

glWaitSync(obj, flags, GL_TIMEOUT_IGNORED)

となる。

okuokuokuoku

TransformFeedback

一旦スキップ。誰も使わないでしょ最近は。。

https://github.com/okuoku/cwgl/commit/9413dc9e441ef7e02186c71ed0f45102843d97ad#diff-658feffb71f7dfc8a777bf976568bfe39d09d768db4d843a10fd5f759218f56bR46

transformFeedbackVaryingsgetTransformFeedbackVarying をどういうインターフェースにしたもんか考えたい。

bindに null を渡せるのをすっかり忘れていた。この場合はOpenGL的にはゼロ番をbindするのが正しい。

okuokuokuoku

2章

... GLES2での2章であって、WebGLでもGLES3でも2章では無いけど。。

https://github.com/okuoku/cwgl/commit/7d5794c9167b5aee12cb0dbe57633c9818d656cd

getBufferSubData の実装が、 glMapBufferRangeglUnmapBuffer のシーケンスに。これ遅いよね。。まぁその辺の最適化はtracker版でやれば良いんじゃないだろうか。。あんまりベンチマークに悪影響を及ぼすようならちょっと考えるって事で。。

okuokuokuoku

3章

https://github.com/okuoku/cwgl/commit/5ca530aad3a0fe2559cee3a10b28767804523feb

PIXEL_UNPACK_BUFFER が追加されたので、それ用の専用のAPIバリエーションを用意した(cwgl_*_buffer)。本家WebGL2ではオーバーロードで対応しているが、C-WebGLはC言語なのでオーバーロードは使えず、ユーザーが明示的に呼び分ける必要がある。

まぁ99%のケースで問題ないが、通常のGLESアプリとの互換性のために、どこかでバッファのバインディングを覚えておく必要が出る。この手のステートトラッキングの便宜のために、コンテキストにユーザーポインタ的なのを渡せるようにした方が良いんだろうか。。

okuokuokuoku

4章

https://github.com/okuoku/cwgl/commit/df6fdf6a0fa50fa30f42d2d90ad695db83d1ce5f

特記事項なし。

可変長のデータを送信する際に、C-WebGLは引数が (可変長データの先頭, エレメント数) の順になるけど、GLは逆なのでちょっと直感的ではないな。。まぁC-WebGL自体が直接使うことをあまり想定していないのでそこまで大きな問題ではないと思うけど。