Open4

Yuniframe: ANGLE+Vulkanに対応する

okuokuokuoku

というわけで次は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で採用するんだしもうちょっと真面目に実装しても良くない。。?そんなに効率化しないのかな。。

okuokuokuoku

謎の警告

C:\cygwin64\home\oku\repos\em2c\yfrm\ext\cwgl\SPIRV-Tools\source\val\validate_image.cpp(1565): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。

https://github.com/KhronosGroup/SPIRV-Tools/blob/61e256c9c44b023a5296c8641fa482e23d1d70a5/source/val/validate_image.cpp#L1565-L1573

  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)

して警告をエラーにしないようにしておく。