/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tools/window/mac/GaneshANGLEWindowContext_mac.h" #include "tools/window/ANGLEWindowContext.h" #include "tools/window/mac/MacWindowGLUtils.h" #include "tools/window/mac/MacWindowInfo.h" using skwindow::DisplayParams; using skwindow::MacWindowInfo; using skwindow::internal::ANGLEWindowContext; namespace { class ANGLEWindowContext_mac : public ANGLEWindowContext { public: ANGLEWindowContext_mac(const MacWindowInfo&, std::unique_ptr); protected: EGLDisplay onGetEGLDisplay( PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const override; NativeWindowType onGetNativeWindow() const override; SkISize onGetSize() const override; int onGetStencilBits() const override; private: NSView* fMainView; }; ANGLEWindowContext_mac::ANGLEWindowContext_mac(const MacWindowInfo& info, std::unique_ptr params) : ANGLEWindowContext(std::move(params)), fMainView(info.fMainView) { this->initializeContext(); } EGLDisplay ANGLEWindowContext_mac::onGetEGLDisplay( PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const { static constexpr EGLint kType = EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE; static constexpr EGLint attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, kType, EGL_NONE}; return eglGetPlatformDisplayEXT( EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast(EGL_DEFAULT_DISPLAY), attribs); } NativeWindowType ANGLEWindowContext_mac::onGetNativeWindow() const { [fMainView setWantsLayer:YES]; return fMainView.layer; } int ANGLEWindowContext_mac::onGetStencilBits() const { GLint stencilBits; NSOpenGLPixelFormat* pixelFormat = skwindow::GetGLPixelFormat(fDisplayParams->msaaSampleCount()); [pixelFormat getValues:&stencilBits forAttribute:NSOpenGLPFAStencilSize forVirtualScreen:0]; return stencilBits; } SkISize ANGLEWindowContext_mac::onGetSize() const { CGFloat backingScaleFactor = skwindow::GetBackingScaleFactor(fMainView); return SkISize::Make(fMainView.bounds.size.width * backingScaleFactor, fMainView.bounds.size.height * backingScaleFactor); } } // anonymous namespace namespace skwindow { std::unique_ptr MakeGaneshANGLEForMac(const MacWindowInfo& info, std::unique_ptr params) { std::unique_ptr ctx(new ANGLEWindowContext_mac(info, std::move(params))); if (!ctx->isValid()) { return nullptr; } return ctx; } } // namespace skwindow