Open6

em2native: macOS(ANGLE+Metal)対応

okuokuokuoku

C 言語指定を見落してた

ココにも残ってるじゃん。 今のPR には入ってないから追加で出さないと。。というか何でGitHubのCIは通ってるの。。?

set_source_files_properties(${COCOA_SOURCES} PROPERTIES LANGUAGE C)

https://github.com/okuoku/SDL2/commit/80e9f914cdcbb16a582cb24eee092c63a5dde979

→ PR更新した

https://github.com/libsdl-org/SDL/pull/4274

okuokuokuoku

ANGLEの修正

diff --git a/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h b/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h
index 1d6a0b4b4..152d4f820 100644
--- a/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h
+++ b/src/compiler/translator/tree_ops/vulkan/EarlyFragmentTestsOptimization.h
@@ -17,15 +17,17 @@ namespace sh
 class TCompiler;
 class TIntermNode;

-#ifdef ANGLE_ENABLE_VULKAN
+//#ifdef ANGLE_ENABLE_VULKAN
 ANGLE_NO_DISCARD bool CheckEarlyFragmentTestsFeasible(TCompiler *compiler, TIntermNode *root);
-#else
+#if 0
+//#else
 ANGLE_NO_DISCARD ANGLE_INLINE bool CheckEarlyFragmentTestsFeasible(TCompiler *compiler,
                                                                    TIntermNode *root)
 {
     UNREACHABLE();
     return false;
 }
+//#endif
 #endif
 }  // namespace sh

これはガチで謎。これはcommonなのでVulkanとそうでないところで実装を分ける理由がわからない。。もうちょっとソースを読む必要がありそう。

ANGLE_ENABLE_VULKAN がMetalでも必須だった。というわけで立てるように修正したらパッチ不要になった。

https://github.com/okuoku/angle-static-cmake/commit/a76de3179c0607def1efcf0d58a740ca627fcc78

okuokuokuoku

ANGLE + MetalではCALayerを使用する

ANGLE側には特にドキュメントが無いが、とりあえずEGL的なNativeWindowとしてはCALayerを使用しているようだ。

bool DisplayMtl::isValidNativeWindow(EGLNativeWindowType window) const
{
    ANGLE_MTL_OBJC_SCOPE
    {
        NSObject *layer = (__bridge NSObject *)(window);
        return [layer isKindOfClass:[CALayer class]];
    }
}

https://github.com/okuoku/yuniframe/commit/268953d7b6b34724842412363469ee6b01c12c08#diff-2bf08d560bd73f9d101465011c1656da1cfe5b1f3e0e6c4ddf0752f3a73b8eb5R138

SDLにCAMetalLayerを作る機能が付いているので、それを利用して SDL_Window* wnd から:

pfwnd = SDL_Metal_GetLayer(SDL_Metal_CreateView(wnd));

のようにして CAMetalLayer を得ることができる。CAMetalLayerはCALayerのサブクラスなので、CALayerとしても使用できる。