1/* 2 * Copyright 2023 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "tools/window/ANGLEWindowContext.h" 9#include "tools/window/mac/WindowContextFactory_mac.h" 10 11using skwindow::DisplayParams; 12using skwindow::MacWindowInfo; 13using skwindow::internal::ANGLEWindowContext; 14 15namespace { 16 17class ANGLEWindowContext_mac : public ANGLEWindowContext { 18public: 19 ANGLEWindowContext_mac(const MacWindowInfo&, const DisplayParams&); 20 21protected: 22 EGLDisplay onGetEGLDisplay( 23 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const override; 24 NativeWindowType onGetNativeWindow() const override; 25 SkISize onGetSize() const override; 26 int onGetStencilBits() const override; 27 28private: 29 NSView* fMainView; 30}; 31 32ANGLEWindowContext_mac::ANGLEWindowContext_mac(const MacWindowInfo& info, 33 const DisplayParams& params) 34 : ANGLEWindowContext(params), fMainView(info.fMainView) { 35 this->initializeContext(); 36} 37 38EGLDisplay ANGLEWindowContext_mac::onGetEGLDisplay( 39 PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT) const { 40 static constexpr EGLint kType = EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE; 41 static constexpr EGLint attribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, kType, EGL_NONE}; 42 return eglGetPlatformDisplayEXT( 43 EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void*>(EGL_DEFAULT_DISPLAY), attribs); 44} 45 46NativeWindowType ANGLEWindowContext_mac::onGetNativeWindow() const { 47 [fMainView setWantsLayer:YES]; 48 return fMainView.layer; 49} 50 51int ANGLEWindowContext_mac::onGetStencilBits() const { 52 GLint stencilBits; 53 NSOpenGLPixelFormat* pixelFormat = skwindow::GetGLPixelFormat(fDisplayParams.fMSAASampleCount); 54 [pixelFormat getValues:&stencilBits forAttribute:NSOpenGLPFAStencilSize forVirtualScreen:0]; 55 return stencilBits; 56} 57 58SkISize ANGLEWindowContext_mac::onGetSize() const { 59 CGFloat backingScaleFactor = skwindow::GetBackingScaleFactor(fMainView); 60 return SkISize::Make(fMainView.bounds.size.width * backingScaleFactor, 61 fMainView.bounds.size.height * backingScaleFactor); 62} 63 64} // anonymous namespace 65 66namespace skwindow { 67 68std::unique_ptr<WindowContext> MakeANGLEForMac(const MacWindowInfo& info, 69 const DisplayParams& params) { 70 std::unique_ptr<WindowContext> ctx(new ANGLEWindowContext_mac(info, params)); 71 if (!ctx->isValid()) { 72 return nullptr; 73 } 74 return ctx; 75} 76 77} // namespace skwindow 78