1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "tools/sk_app/GraphiteMetalWindowContext.h" 9cb93a386Sopenharmony_ci#include "tools/sk_app/mac/WindowContextFactory_mac.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#import <Cocoa/Cocoa.h> 12cb93a386Sopenharmony_ci#import <QuartzCore/CAConstraintLayoutManager.h> 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciusing sk_app::DisplayParams; 15cb93a386Sopenharmony_ciusing sk_app::window_context_factory::MacWindowInfo; 16cb93a386Sopenharmony_ciusing sk_app::GraphiteMetalWindowContext; 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cinamespace { 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass GraphiteMetalWindowContext_mac : public GraphiteMetalWindowContext { 21cb93a386Sopenharmony_cipublic: 22cb93a386Sopenharmony_ci GraphiteMetalWindowContext_mac(const MacWindowInfo&, const DisplayParams&); 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci ~GraphiteMetalWindowContext_mac() override; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci bool onInitializeContext() override; 27cb93a386Sopenharmony_ci void onDestroyContext() override; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci void resize(int w, int h) override; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciprivate: 32cb93a386Sopenharmony_ci NSView* fMainView; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci using INHERITED = GraphiteMetalWindowContext; 35cb93a386Sopenharmony_ci}; 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ciGraphiteMetalWindowContext_mac::GraphiteMetalWindowContext_mac(const MacWindowInfo& info, 38cb93a386Sopenharmony_ci const DisplayParams& params) 39cb93a386Sopenharmony_ci : INHERITED(params) 40cb93a386Sopenharmony_ci , fMainView(info.fMainView) { 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci // any config code here (particularly for msaa)? 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci this->initializeContext(); 45cb93a386Sopenharmony_ci} 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ciGraphiteMetalWindowContext_mac::~GraphiteMetalWindowContext_mac() { 48cb93a386Sopenharmony_ci this->destroyContext(); 49cb93a386Sopenharmony_ci} 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_cibool GraphiteMetalWindowContext_mac::onInitializeContext() { 52cb93a386Sopenharmony_ci SkASSERT(nil != fMainView); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci fMetalLayer = [CAMetalLayer layer]; 55cb93a386Sopenharmony_ci fMetalLayer.device = fDevice.get(); 56cb93a386Sopenharmony_ci fMetalLayer.pixelFormat = MTLPixelFormatBGRA8Unorm; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci // resize ignores the passed values and uses the fMainView directly. 59cb93a386Sopenharmony_ci this->resize(0, 0); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci BOOL useVsync = fDisplayParams.fDisableVsync ? NO : YES; 62cb93a386Sopenharmony_ci fMetalLayer.displaySyncEnabled = useVsync; // TODO: need solution for 10.12 or lower 63cb93a386Sopenharmony_ci fMetalLayer.layoutManager = [CAConstraintLayoutManager layoutManager]; 64cb93a386Sopenharmony_ci fMetalLayer.autoresizingMask = kCALayerHeightSizable | kCALayerWidthSizable; 65cb93a386Sopenharmony_ci fMetalLayer.contentsGravity = kCAGravityTopLeft; 66cb93a386Sopenharmony_ci fMetalLayer.magnificationFilter = kCAFilterNearest; 67cb93a386Sopenharmony_ci NSColorSpace* cs = fMainView.window.colorSpace; 68cb93a386Sopenharmony_ci fMetalLayer.colorspace = cs.CGColorSpace; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci fMainView.layer = fMetalLayer; 71cb93a386Sopenharmony_ci fMainView.wantsLayer = YES; 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci return true; 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_civoid GraphiteMetalWindowContext_mac::onDestroyContext() { 77cb93a386Sopenharmony_ci fMainView.layer = nil; 78cb93a386Sopenharmony_ci fMainView.wantsLayer = NO; 79cb93a386Sopenharmony_ci} 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_civoid GraphiteMetalWindowContext_mac::resize(int w, int h) { 82cb93a386Sopenharmony_ci CGFloat backingScaleFactor = sk_app::GetBackingScaleFactor(fMainView); 83cb93a386Sopenharmony_ci CGSize backingSize = fMainView.bounds.size; 84cb93a386Sopenharmony_ci backingSize.width *= backingScaleFactor; 85cb93a386Sopenharmony_ci backingSize.height *= backingScaleFactor; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci fMetalLayer.drawableSize = backingSize; 88cb93a386Sopenharmony_ci fMetalLayer.contentsScale = backingScaleFactor; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci fWidth = backingSize.width; 91cb93a386Sopenharmony_ci fHeight = backingSize.height; 92cb93a386Sopenharmony_ci} 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci} // anonymous namespace 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_cinamespace sk_app { 97cb93a386Sopenharmony_cinamespace window_context_factory { 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_cistd::unique_ptr<WindowContext> MakeGraphiteMetalForMac(const MacWindowInfo& info, 100cb93a386Sopenharmony_ci const DisplayParams& params) { 101cb93a386Sopenharmony_ci std::unique_ptr<WindowContext> ctx(new GraphiteMetalWindowContext_mac(info, params)); 102cb93a386Sopenharmony_ci if (!ctx->isValid()) { 103cb93a386Sopenharmony_ci return nullptr; 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci return ctx; 106cb93a386Sopenharmony_ci} 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci} // namespace window_context_factory 109cb93a386Sopenharmony_ci} // namespace sk_app 110