/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "../MetalWindowContext.h" #include "WindowContextFactory_mac.h" #import #include using sk_app::DisplayParams; using sk_app::window_context_factory::MacWindowInfo; using sk_app::MetalWindowContext; namespace { class MetalWindowContext_mac : public MetalWindowContext { public: MetalWindowContext_mac(const MacWindowInfo&, const DisplayParams&); ~MetalWindowContext_mac() override; bool onInitializeContext() override; void onDestroyContext() override; private: NSView* fMainView; typedef MetalWindowContext INHERITED; }; MetalWindowContext_mac::MetalWindowContext_mac(const MacWindowInfo& info, const DisplayParams& params) : INHERITED(params) , fMainView(info.fMainView) { // any config code here (particularly for msaa)? this->initializeContext(); } MetalWindowContext_mac::~MetalWindowContext_mac() { this->destroyContext(); } bool MetalWindowContext_mac::onInitializeContext() { SkASSERT(nil != fMainView); // create mtkview NSRect rect = fMainView.bounds; fMTKView = [[MTKView alloc] initWithFrame:rect device:fDevice]; if (nil == fMTKView) { return false; } fMTKView.autoResizeDrawable = NO; fMTKView.colorPixelFormat = MTLPixelFormatBGRA8Unorm; fMTKView.drawableSize = rect.size; if (fDisplayParams.fMSAASampleCount > 1) { if (![fDevice supportsTextureSampleCount:fDisplayParams.fMSAASampleCount]) { return false; } } fMTKView.sampleCount = fDisplayParams.fMSAASampleCount; // attach Metal view to main view [fMTKView setTranslatesAutoresizingMaskIntoConstraints:NO]; [fMainView addSubview:fMTKView]; NSDictionary *views = NSDictionaryOfVariableBindings(fMTKView); [fMainView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[fMTKView]|" options:0 metrics:nil views:views]]; [fMainView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[fMTKView]|" options:0 metrics:nil views:views]]; fSampleCount = [fMTKView sampleCount]; fStencilBits = 8; CGSize backingSize = [fMTKView drawableSize]; fWidth = backingSize.width; fHeight = backingSize.height; return true; } void MetalWindowContext_mac::onDestroyContext() { [fMTKView removeFromSuperview]; [fMTKView release]; fMTKView = nil; } } // anonymous namespace namespace sk_app { namespace window_context_factory { WindowContext* NewMetalForMac(const MacWindowInfo& info, const DisplayParams& params) { WindowContext* ctx = new MetalWindowContext_mac(info, params); if (!ctx->isValid()) { delete ctx; return nullptr; } return ctx; } } // namespace window_context_factory } // namespace sk_app