Open7
C-WebGL: 各社のOpenGL ES推奨事項メモ
前Vulkanのはやったよね
一般
- PowerVR: https://docs.imgtec.com/html/index.html
- Apple: https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Introduction/Introduction.html OpenGLはdeprecated。まだ存在するけど。
- Adreno(Qualcomm Snapdragon): https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html
- Vivante: https://www.nxp.com/docs/en/user-guide/I.MX_GRAPHICS_USERS_GUIDE.pdf
- VC4(RaspberryPiの3まで): https://docs.mesa3d.org/drivers/vc4.html -- Broadcomはこれといってガイドを公開していないが、mesaには多少の推奨事項がある
SamsungはARMとQualcommを混ぜて載せていてちょっとわかりづらい https://developer.samsung.com/galaxy-gamedev/overview.html 。
ジオメトリ、プリミティブ
サイズ
- PowerVR: 32ピクセルは欲しい、1ピクセルを切ると処理されない https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/triangle-size.html
プリミティブタイプ
基本的にindexされた三角形を推奨していないベンダは居ないはず。頂点キャッシュを活用するため。
- PowerVR: TriList? https://docs.imgtec.com/starter-guides/powervr-architecture/html/topics/rules/do-use-indexed-lists.html
- Apple: TriStripを推奨 、 degenerate trianglesかプリミティブリスタートを使う https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW12
- Vivante: TriStripをdegenerate triangleで繋ぐほうが、プリミティブリスタートより安い
Z
- PowerVR: Z-prepassは意味がないのでやらないこと https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/z-pre-pass-and-powervr.html
- Adreno: Z-prepassはFast-Zのヒントとして機能する https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#fast-z 。 (Vulkanのみ?)
early_fragment_tests
https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#early-zindirect でFast-Zを明示的に使わせられる。
VBO
- PowerVR: 推奨事項 https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/vertex-buffer-objects-in-opengl-es.html
- PowerVR, Vivante: 大きなVBOを確保し、リングバッファ的に使うのが良い
- Vivante: 256 bytes以上のstrideはネイティブサポートでない(特定のバージョン以降では2048bytesになった)
- Vivante: Indexバッファと混在させるとコピーになる。まぁDirectXみたいに最初に指定するデザインを期待したんだろうな。。
VAO
- PowerVR: そもそも拡張のドキュメントを書いたのはIMG https://docs.imgtec.com/reference-manuals/open-gl-es-extensions/html/topics/GL_OES/vertex-array-object.html https://registry.khronos.org/OpenGL/extensions/OES/OES_vertex_array_object.txt
- Apple: 推奨 https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html#//apple_ref/doc/uid/TP40008793-CH107-SW14
ローカルメモリ
- PowerVR: 32x32 タイル https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/using-multiple-render-targets-efficiently.html
- PowerVR, Adreno:
glInvalidateFramebuffer
かglClear
で直前のシーンを常に消す https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/using-glclear-and-glcolormask-on-powervr.html https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#render-pass - Adreno: タイルサイズは制御できない。
- Adreno: FlexRenderによりIMRにきりかわるケースがある。UIを想定したとみられる要件と、テッセレーション/ジオメトリシェーダーを使うケース https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#direct-mode-triggers
- Adreno: Position only shadingが使われるケースがある(A7x以降) https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#concurrent-binning-prevention-conditions
テクスチャ
- PowerVR: アップロードはdeferされる。よって見えないところにわざと描くことも有効である https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/uploading-textures-efficiently.html ただし、
glTexStorage
とglTexImage
の組合せで、その場でアップロードさせることも可能 https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/uploading-textures-into-pbos.html - PowerVR:
glTexStorage
の使用を推奨 https://docs.imgtec.com/performance-guides/performance-recommendations/html/topics/using-gltexstorage2d-and-gltexstorage3d.html - Vivante: 圧縮テクスチャは帯域を節約しない(!)
MSAA
- Adreno: MSAAサンプルはGMEMの消費量に影響する可能性がある(...具体例は。。?) https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html
- Vivante: 4x, 8x MSAAは常に有料。使わないこと。まぁVivanteはIMRだもんな。。
シェーダ, コンピュート
- Adreno: シェーダ命令は2000命令程度まで https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/spec_sheets.html#instruction-count-device-specific UBOサイズは8192バイト * 0.9程度まで https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#buffer-best-practices
- Adreno: グラフックスと混在できない https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#shader-mode-switching ただA7x以降LPACがあるのでかならずしもそうとは言えないんではないか。。
- Adreno: f16とf32であればf16がおすすめ https://docs.qualcomm.com/bundle/publicresource/topics/80-78185-2/best_practices.html#half-precision