1/*
2 * Copyright 2017 Google Inc.
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#ifndef GrMtlCaps_DEFINED
9#define GrMtlCaps_DEFINED
10
11#include "GrCaps.h"
12
13#include "SkTDArray.h"
14
15#import <Metal/Metal.h>
16
17class GrShaderCaps;
18
19/**
20 * Stores some capabilities of a Mtl backend.
21 */
22class GrMtlCaps : public GrCaps {
23public:
24    GrMtlCaps(const GrContextOptions& contextOptions, id<MTLDevice> device,
25              MTLFeatureSet featureSet);
26
27    int getSampleCount(int requestedCount, GrPixelConfig config) const override;
28
29    bool isConfigTexturable(GrPixelConfig config) const override {
30        return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kTextureable_Flag);
31    }
32
33    bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
34        if (withMSAA) {
35            return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderable_Flag) &&
36                   SkToBool(fConfigTable[config].fFlags & ConfigInfo::kMSAA_Flag);
37        } else {
38            return SkToBool(fConfigTable[config].fFlags & ConfigInfo::kRenderable_Flag);
39        }
40    }
41
42    bool isConfigCopyable(GrPixelConfig config) const override {
43        return true;
44    }
45
46#if 0
47    /**
48     * Returns both a supported and most prefered stencil format to use in draws.
49     */
50    const StencilFormat& preferedStencilFormat() const {
51        return fPreferedStencilFormat;
52    }
53#endif
54    bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc,
55                            bool* rectsMustMatch, bool* disallowSubrect) const override {
56        return false;
57    }
58
59    bool validateBackendTexture(const GrBackendTexture&, SkColorType,
60                                GrPixelConfig*) const override {
61        return false;
62    }
63    bool validateBackendRenderTarget(const GrBackendRenderTarget&, SkColorType,
64                                     GrPixelConfig*) const override {
65        return false;
66    }
67
68private:
69    void initFeatureSet(MTLFeatureSet featureSet);
70
71    void initGrCaps(const id<MTLDevice> device);
72    void initShaderCaps();
73    void initConfigTable();
74
75    struct ConfigInfo {
76        ConfigInfo() : fFlags(0) {}
77
78        enum {
79            kTextureable_Flag = 0x1,
80            kRenderable_Flag  = 0x2, // Color attachment and blendable
81            kMSAA_Flag        = 0x4,
82            kResolve_Flag     = 0x8,
83        };
84        static const uint16_t kAllFlags = kTextureable_Flag | kRenderable_Flag |
85                                          kMSAA_Flag | kResolve_Flag;
86
87        uint16_t fFlags;
88    };
89    ConfigInfo fConfigTable[kGrPixelConfigCnt];
90
91    enum class Platform {
92        kMac,
93        kIOS
94    };
95    bool isMac() { return Platform::kMac == fPlatform; }
96    bool isIOS() { return Platform::kIOS == fPlatform; }
97
98    Platform fPlatform;
99    int fFamilyGroup;
100    int fVersion;
101
102    SkTDArray<int> fSampleCounts;
103
104    typedef GrCaps INHERITED;
105};
106
107#endif
108