xref: /aosp_15_r20/external/skia/src/gpu/graphite/mtl/MtlCaps.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_MtlCaps_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_MtlCaps_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker #import <Metal/Metal.h>
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
18*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class MtlCaps final : public Caps {
21*c8dee2aaSAndroid Build Coastguard Worker public:
22*c8dee2aaSAndroid Build Coastguard Worker     MtlCaps(const id<MTLDevice>, const ContextOptions&);
~MtlCaps()23*c8dee2aaSAndroid Build Coastguard Worker     ~MtlCaps() override {}
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultSampledTextureInfo(SkColorType,
26*c8dee2aaSAndroid Build Coastguard Worker                                              Mipmapped mipmapped,
27*c8dee2aaSAndroid Build Coastguard Worker                                              Protected,
28*c8dee2aaSAndroid Build Coastguard Worker                                              Renderable) const override;
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getTextureInfoForSampledCopy(const TextureInfo& textureInfo,
31*c8dee2aaSAndroid Build Coastguard Worker                                              Mipmapped mipmapped) const override;
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultCompressedTextureInfo(SkTextureCompressionType,
34*c8dee2aaSAndroid Build Coastguard Worker                                                 Mipmapped mipmapped,
35*c8dee2aaSAndroid Build Coastguard Worker                                                 Protected) const override;
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultMSAATextureInfo(const TextureInfo& singleSampledInfo,
38*c8dee2aaSAndroid Build Coastguard Worker                                           Discardable discardable) const override;
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultDepthStencilTextureInfo(SkEnumBitMask<DepthStencilFlags>,
41*c8dee2aaSAndroid Build Coastguard Worker                                                   uint32_t sampleCount,
42*c8dee2aaSAndroid Build Coastguard Worker                                                   Protected) const override;
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     TextureInfo getDefaultStorageTextureInfo(SkColorType) const override;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     UniqueKey makeGraphicsPipelineKey(const GraphicsPipelineDesc&,
47*c8dee2aaSAndroid Build Coastguard Worker                                       const RenderPassDesc&) const override;
48*c8dee2aaSAndroid Build Coastguard Worker     UniqueKey makeComputePipelineKey(const ComputePipelineDesc&) const override;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     bool extractGraphicsDescs(const UniqueKey&,
51*c8dee2aaSAndroid Build Coastguard Worker                               GraphicsPipelineDesc*,
52*c8dee2aaSAndroid Build Coastguard Worker                               RenderPassDesc*,
53*c8dee2aaSAndroid Build Coastguard Worker                               const RendererProvider*) const override;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     // Get a sufficiently unique bit representation for the RenderPassDesc to be embedded in other
56*c8dee2aaSAndroid Build Coastguard Worker     // UniqueKeys (e.g. makeGraphicsPipelineKey).
57*c8dee2aaSAndroid Build Coastguard Worker     uint64_t getRenderPassDescKey(const RenderPassDesc&) const;
58*c8dee2aaSAndroid Build Coastguard Worker 
isMac()59*c8dee2aaSAndroid Build Coastguard Worker     bool isMac() const { return fGPUFamily == GPUFamily::kMac; }
isApple()60*c8dee2aaSAndroid Build Coastguard Worker     bool isApple() const { return fGPUFamily == GPUFamily::kApple; }
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     uint32_t channelMask(const TextureInfo&) const override;
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     bool isRenderable(const TextureInfo&) const override;
65*c8dee2aaSAndroid Build Coastguard Worker     bool isStorage(const TextureInfo&) const override;
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker     void buildKeyForTexture(SkISize dimensions,
68*c8dee2aaSAndroid Build Coastguard Worker                             const TextureInfo&,
69*c8dee2aaSAndroid Build Coastguard Worker                             ResourceType,
70*c8dee2aaSAndroid Build Coastguard Worker                             Shareable,
71*c8dee2aaSAndroid Build Coastguard Worker                             GraphiteResourceKey*) const override;
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker private:
74*c8dee2aaSAndroid Build Coastguard Worker     void initGPUFamily(const id<MTLDevice>);
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     void initCaps(const id<MTLDevice>);
77*c8dee2aaSAndroid Build Coastguard Worker     void initShaderCaps();
78*c8dee2aaSAndroid Build Coastguard Worker     void initFormatTable(const id<MTLDevice>);
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     enum class GPUFamily {
81*c8dee2aaSAndroid Build Coastguard Worker         kMac,
82*c8dee2aaSAndroid Build Coastguard Worker         kApple,
83*c8dee2aaSAndroid Build Coastguard Worker     };
84*c8dee2aaSAndroid Build Coastguard Worker     static bool GetGPUFamily(id<MTLDevice> device, GPUFamily* gpuFamily, int* group);
85*c8dee2aaSAndroid Build Coastguard Worker 
getFormatFromColorType(SkColorType colorType)86*c8dee2aaSAndroid Build Coastguard Worker     MTLPixelFormat getFormatFromColorType(SkColorType colorType) const {
87*c8dee2aaSAndroid Build Coastguard Worker         int idx = static_cast<int>(colorType);
88*c8dee2aaSAndroid Build Coastguard Worker         return fColorTypeToFormatTable[idx];
89*c8dee2aaSAndroid Build Coastguard Worker     }
90*c8dee2aaSAndroid Build Coastguard Worker     MTLPixelFormat getFormatFromDepthStencilFlags(SkEnumBitMask<DepthStencilFlags>) const;
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker     const ColorTypeInfo* getColorTypeInfo(SkColorType, const TextureInfo&) const override;
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     bool onIsTexturable(const TextureInfo&) const override;
95*c8dee2aaSAndroid Build Coastguard Worker     bool isTexturable(MTLPixelFormat) const;
96*c8dee2aaSAndroid Build Coastguard Worker     bool isRenderable(MTLPixelFormat, uint32_t numSamples) const;
97*c8dee2aaSAndroid Build Coastguard Worker     uint32_t maxRenderTargetSampleCount(MTLPixelFormat) const;
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker     bool supportsWritePixels(const TextureInfo&) const override;
100*c8dee2aaSAndroid Build Coastguard Worker     bool supportsReadPixels(const TextureInfo&) const override;
101*c8dee2aaSAndroid Build Coastguard Worker 
102*c8dee2aaSAndroid Build Coastguard Worker     std::pair<SkColorType, bool /*isRGBFormat*/> supportedWritePixelsColorType(
103*c8dee2aaSAndroid Build Coastguard Worker             SkColorType dstColorType,
104*c8dee2aaSAndroid Build Coastguard Worker             const TextureInfo& dstTextureInfo,
105*c8dee2aaSAndroid Build Coastguard Worker             SkColorType srcColorType) const override;
106*c8dee2aaSAndroid Build Coastguard Worker     std::pair<SkColorType, bool /*isRGBFormat*/> supportedReadPixelsColorType(
107*c8dee2aaSAndroid Build Coastguard Worker             SkColorType srcColorType,
108*c8dee2aaSAndroid Build Coastguard Worker             const TextureInfo& srcTextureInfo,
109*c8dee2aaSAndroid Build Coastguard Worker             SkColorType dstColorType) const override;
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker     MTLStorageMode getDefaultMSAAStorageMode(Discardable discardable) const;
112*c8dee2aaSAndroid Build Coastguard Worker 
113*c8dee2aaSAndroid Build Coastguard Worker     struct FormatInfo {
colorTypeFlagsFormatInfo114*c8dee2aaSAndroid Build Coastguard Worker         uint32_t colorTypeFlags(SkColorType colorType) const {
115*c8dee2aaSAndroid Build Coastguard Worker             for (int i = 0; i < fColorTypeInfoCount; ++i) {
116*c8dee2aaSAndroid Build Coastguard Worker                 if (fColorTypeInfos[i].fColorType == colorType) {
117*c8dee2aaSAndroid Build Coastguard Worker                     return fColorTypeInfos[i].fFlags;
118*c8dee2aaSAndroid Build Coastguard Worker                 }
119*c8dee2aaSAndroid Build Coastguard Worker             }
120*c8dee2aaSAndroid Build Coastguard Worker             return 0;
121*c8dee2aaSAndroid Build Coastguard Worker         }
122*c8dee2aaSAndroid Build Coastguard Worker 
123*c8dee2aaSAndroid Build Coastguard Worker         enum {
124*c8dee2aaSAndroid Build Coastguard Worker             kTexturable_Flag  = 0x01,
125*c8dee2aaSAndroid Build Coastguard Worker             kRenderable_Flag  = 0x02, // Color attachment and blendable
126*c8dee2aaSAndroid Build Coastguard Worker             kMSAA_Flag        = 0x04,
127*c8dee2aaSAndroid Build Coastguard Worker             kResolve_Flag     = 0x08,
128*c8dee2aaSAndroid Build Coastguard Worker             kStorage_Flag     = 0x10,
129*c8dee2aaSAndroid Build Coastguard Worker         };
130*c8dee2aaSAndroid Build Coastguard Worker         static const uint16_t kAllFlags =
131*c8dee2aaSAndroid Build Coastguard Worker                 kTexturable_Flag | kRenderable_Flag | kMSAA_Flag | kResolve_Flag | kStorage_Flag;
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker         uint16_t fFlags = 0;
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker         std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos;
136*c8dee2aaSAndroid Build Coastguard Worker         int fColorTypeInfoCount = 0;
137*c8dee2aaSAndroid Build Coastguard Worker     };
138*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_BUILD_FOR_MAC
139*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr size_t kNumMtlFormats = 23;
140*c8dee2aaSAndroid Build Coastguard Worker #else
141*c8dee2aaSAndroid Build Coastguard Worker     inline static constexpr size_t kNumMtlFormats = 21;
142*c8dee2aaSAndroid Build Coastguard Worker #endif
143*c8dee2aaSAndroid Build Coastguard Worker 
144*c8dee2aaSAndroid Build Coastguard Worker     static size_t GetFormatIndex(MTLPixelFormat);
145*c8dee2aaSAndroid Build Coastguard Worker     FormatInfo fFormatTable[kNumMtlFormats];
146*c8dee2aaSAndroid Build Coastguard Worker 
getFormatInfo(const MTLPixelFormat pixelFormat)147*c8dee2aaSAndroid Build Coastguard Worker     const FormatInfo& getFormatInfo(const MTLPixelFormat pixelFormat) const {
148*c8dee2aaSAndroid Build Coastguard Worker         size_t index = GetFormatIndex(pixelFormat);
149*c8dee2aaSAndroid Build Coastguard Worker         return fFormatTable[index];
150*c8dee2aaSAndroid Build Coastguard Worker     }
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker     MTLPixelFormat fColorTypeToFormatTable[kSkColorTypeCnt];
153*c8dee2aaSAndroid Build Coastguard Worker     void setColorType(SkColorType, std::initializer_list<MTLPixelFormat> formats);
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker     // A vector of the viable sample counts (e.g., { 1, 2, 4, 8 }).
156*c8dee2aaSAndroid Build Coastguard Worker     std::vector<uint32_t> fColorSampleCounts;
157*c8dee2aaSAndroid Build Coastguard Worker 
158*c8dee2aaSAndroid Build Coastguard Worker     GPUFamily fGPUFamily;
159*c8dee2aaSAndroid Build Coastguard Worker     int fFamilyGroup;
160*c8dee2aaSAndroid Build Coastguard Worker };
161*c8dee2aaSAndroid Build Coastguard Worker 
162*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite
163*c8dee2aaSAndroid Build Coastguard Worker 
164*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_MtlCaps_DEFINED
165