Open4
Yuniframe: ANGLE+Vulkanに対応する
というわけで次はiOS/macOSと行きたいところだけど、これがなかなか紆余曲折がある。
- デバッグ類は最初Macで済ませたい。しかし、MacにはOpenGL ESが無い → ANGLEの利用が必要
- iOSではOpenGL ESが既にdeprecatedなのでできればMac/iOSをMetalで統一したい
- ANGLEには最近Metalのサポートがマージされているが、DirectXと違って外部のシェーダーコンパイラフロントエンドをコンパイルして持ってくる必要がある
- 同じコンパイルフローをVulkanバックエンドが持っている
- VulkanはWindowsでも動く
というわけで、まずはVulkan + Windowsで動かすことに挑戦する。
ANGLEの動作の流れ
ANGLEがGLSLシェーダを各プラットフォームで実行する仕組は以下のようになっている。
- DirectX : ANGLEのシェーダートランスレーター → (HLSL出力) → Windows付属のシェーダーコンパイラ(d3dcompiler_47.dll) → (DirectXバイトコード) → GPUドライバのシェーダコンパイラ
- Vulkan : ANGLEのシェーダートランスレーター → (GLSL出力) → KhronosのGLSLフロントエンド → (SPIR-V バイトコード) → GPUドライバのシェーダーコンパイラ
- Metal ANGLEのシェーダートランスレーター → (GLSL出力) → KhronosのGLSLフロントエンド → (SPIR-V バイトコード) → spirv-cross による Metal Shading Language変換 → Appleのシェーダーコンパイラ
つまり、現状ANGLEのMetal実装は1ステップ多いことになる。Safariで採用するんだしもうちょっと真面目に実装しても良くない。。?そんなに効率化しないのかな。。
謎の警告
C:\cygwin64\home\oku\repos\em2c\yfrm\ext\cwgl\SPIRV-Tools\source\val\validate_image.cpp(1565): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。
if (_.GetIdOpcode(info.sampled_type) != SpvOpTypeVoid) {
const uint32_t result_component_type =
_.GetComponentType(actual_result_type);
if (result_component_type != info.sampled_type) {
return _.diag(SPV_ERROR_INVALID_DATA, inst)
<< "Expected Image 'Sampled Type' to be the same as "
<< GetActualResultTypeStr(opcode) << " components";
}
}
... どの辺が。。?アポストロフィ類がUnicodeになっていることは割とあるけど、どれもASCIIに収まっているような。。
とりあえず
set(SPIRV_WERROR OFF CACHE BOOL "" FORCE)
して警告をエラーにしないようにしておく。
何となくVulkanで動いた
とりあえすデフォルトのデバイスだけ使うようにしてみた。
これでVulkanでレンダリングしているようだ。RenderDocにそう書いてあるんで。。
... これバックバッファのフォーマットとか制御する方法が無くない。。?