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