1cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel/* 2cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * Copyright 2017 Google Inc. 3cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * 4cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * Use of this source code is governed by a BSD-style license that can be 5cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * found in the LICENSE file. 6cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel */ 7cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 8cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#ifndef GrMtlCaps_DEFINED 9cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#define GrMtlCaps_DEFINED 10cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 11cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#include "GrCaps.h" 12cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 13cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#include "SkTDArray.h" 14cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 15cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#import <Metal/Metal.h> 16cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 17cebcb84739c261e729a054ff097adca32a1b537fGreg Danielclass GrShaderCaps; 18cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 19cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel/** 20cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * Stores some capabilities of a Mtl backend. 21cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel */ 22cebcb84739c261e729a054ff097adca32a1b537fGreg Danielclass GrMtlCaps : public GrCaps { 23cebcb84739c261e729a054ff097adca32a1b537fGreg Danielpublic: 24cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel GrMtlCaps(const GrContextOptions& contextOptions, id<MTLDevice> device, 25cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel MTLFeatureSet featureSet); 26cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 27cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel bool isConfigTexturable(GrPixelConfig config) const override { 28cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kTextureable_Flag); 29cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel } 30cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 31bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon int getRenderTargetSampleCount(int requestedCount, GrPixelConfig) const override; 32bdecacfbe47bc7211336bb847bb33c00ef85ea3eBrian Salomon int maxRenderTargetSampleCount(GrPixelConfig) const override; 33cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 343d86a19f420c2b406620b086c319732eb4135d33Brian Salomon bool surfaceSupportsWritePixels(const GrSurface* surface) const override { return true; } 355f33a8ccac141dfaddddc7b9fc39a8428cc233feBrian Salomon 36bb76ace72bee5d44189b6ee6c81cda174ce9ea30Greg Daniel bool isConfigCopyable(GrPixelConfig config) const override { 37bb76ace72bee5d44189b6ee6c81cda174ce9ea30Greg Daniel return true; 38bb76ace72bee5d44189b6ee6c81cda174ce9ea30Greg Daniel } 39bb76ace72bee5d44189b6ee6c81cda174ce9ea30Greg Daniel 40cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#if 0 41cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel /** 42cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel * Returns both a supported and most prefered stencil format to use in draws. 43cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel */ 44cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel const StencilFormat& preferedStencilFormat() const { 45cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel return fPreferedStencilFormat; 46cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel } 47cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#endif 48cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, 49cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel bool* rectsMustMatch, bool* disallowSubrect) const override { 50cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel return false; 51cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel } 52cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 53faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel bool validateBackendTexture(const GrBackendTexture&, SkColorType, 54faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel GrPixelConfig*) const override { 55faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel return false; 56faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel } 57faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel bool validateBackendRenderTarget(const GrBackendRenderTarget&, SkColorType, 58faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Daniel GrPixelConfig*) const override { 59fc711a2b0143aa4f559ef041068af1c04d7dab85Robert Phillips return false; 60fc711a2b0143aa4f559ef041068af1c04d7dab85Robert Phillips } 61fc711a2b0143aa4f559ef041068af1c04d7dab85Robert Phillips 62fc711a2b0143aa4f559ef041068af1c04d7dab85Robert Phillips bool getConfigFromBackendFormat(const GrBackendFormat&, SkColorType, 63fc711a2b0143aa4f559ef041068af1c04d7dab85Robert Phillips GrPixelConfig*) const override { 64f5d8758f29390fd5c135df12bc8a5e196854eda2Greg Daniel return false; 65f5d8758f29390fd5c135df12bc8a5e196854eda2Greg Daniel } 66f5d8758f29390fd5c135df12bc8a5e196854eda2Greg Daniel 67faa095e9842b924c20de84dce1bcc1adad7fe2e4Greg Danielprivate: 68cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel void initFeatureSet(MTLFeatureSet featureSet); 6963fd760a37905c45d26fc3d49cac261fad1b4808Ben Wagner 70cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel void initGrCaps(const id<MTLDevice> device); 71cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel void initShaderCaps(); 72cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel void initConfigTable(); 73cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 74cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel struct ConfigInfo { 75cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel ConfigInfo() : fFlags(0) {} 76cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 77cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel enum { 78cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kTextureable_Flag = 0x1, 79cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kRenderable_Flag = 0x2, // Color attachment and blendable 80cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kMSAA_Flag = 0x4, 81cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kResolve_Flag = 0x8, 82cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel }; 83cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel static const uint16_t kAllFlags = kTextureable_Flag | kRenderable_Flag | 84cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kMSAA_Flag | kResolve_Flag; 85cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 86cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel uint16_t fFlags; 87cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel }; 88cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel ConfigInfo fConfigTable[kGrPixelConfigCnt]; 89cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 90cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel enum class Platform { 91cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kMac, 92cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel kIOS 93cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel }; 94cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel bool isMac() { return Platform::kMac == fPlatform; } 95cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel bool isIOS() { return Platform::kIOS == fPlatform; } 96cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 97cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel Platform fPlatform; 98cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel int fFamilyGroup; 99cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel int fVersion; 100cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 101cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel SkTDArray<int> fSampleCounts; 102cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 103cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel typedef GrCaps INHERITED; 104cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel}; 105cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel 106cebcb84739c261e729a054ff097adca32a1b537fGreg Daniel#endif 107