Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
MtlCaps.h
Go to the documentation of this file.
1/*
2 * Copyright 2021 Google LLC
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 skgpu_graphite_MtlCaps_DEFINED
9#define skgpu_graphite_MtlCaps_DEFINED
10
11#include <vector>
12
13#import <Metal/Metal.h>
14
16
17namespace skgpu::graphite {
18struct ContextOptions;
19
20class MtlCaps final : public Caps {
21public:
22 MtlCaps(const id<MTLDevice>, const ContextOptions&);
23 ~MtlCaps() override {}
24
26 Mipmapped mipmapped,
28 Renderable) const override;
29
31 Mipmapped mipmapped) const override;
32
34 Mipmapped mipmapped,
35 Protected) const override;
36
37 TextureInfo getDefaultMSAATextureInfo(const TextureInfo& singleSampledInfo,
38 Discardable discardable) const override;
39
41 uint32_t sampleCount,
42 Protected) const override;
43
45
47 const RenderPassDesc&) const override;
49
53 const RendererProvider*) const override;
54
55 // Get a sufficiently unique bit representation for the RenderPassDesc to be embedded in other
56 // UniqueKeys (e.g. makeGraphicsPipelineKey).
57 uint64_t getRenderPassDescKey(const RenderPassDesc&) const;
58
59 bool isMac() const { return fGPUFamily == GPUFamily::kMac; }
60 bool isApple() const { return fGPUFamily == GPUFamily::kApple; }
61
62 uint32_t channelMask(const TextureInfo&) const override;
63
64 bool isRenderable(const TextureInfo&) const override;
65 bool isStorage(const TextureInfo&) const override;
66
67 void buildKeyForTexture(SkISize dimensions,
68 const TextureInfo&,
71 GraphiteResourceKey*) const override;
72
73private:
74 void initGPUFamily(const id<MTLDevice>);
75
76 void initCaps(const id<MTLDevice>);
77 void initShaderCaps();
78 void initFormatTable();
79
80 enum class GPUFamily {
81 kMac,
82 kApple,
83 };
84 static bool GetGPUFamily(id<MTLDevice> device, GPUFamily* gpuFamily, int* group);
85 static bool GetGPUFamilyFromFeatureSet(id<MTLDevice> device, GPUFamily* gpuFamily,
86 int* group);
87
88 MTLPixelFormat getFormatFromColorType(SkColorType colorType) const {
89 int idx = static_cast<int>(colorType);
90 return fColorTypeToFormatTable[idx];
91 }
92
93 const ColorTypeInfo* getColorTypeInfo(SkColorType, const TextureInfo&) const override;
94
95 bool onIsTexturable(const TextureInfo&) const override;
96 bool isTexturable(MTLPixelFormat) const;
97 bool isRenderable(MTLPixelFormat, uint32_t numSamples) const;
98 uint32_t maxRenderTargetSampleCount(MTLPixelFormat) const;
99
100 bool supportsWritePixels(const TextureInfo&) const override;
101 bool supportsReadPixels(const TextureInfo&) const override;
102
103 std::pair<SkColorType, bool /*isRGBFormat*/> supportedWritePixelsColorType(
104 SkColorType dstColorType,
105 const TextureInfo& dstTextureInfo,
106 SkColorType srcColorType) const override;
107 std::pair<SkColorType, bool /*isRGBFormat*/> supportedReadPixelsColorType(
108 SkColorType srcColorType,
109 const TextureInfo& srcTextureInfo,
110 SkColorType dstColorType) const override;
111
112 MTLStorageMode getDefaultMSAAStorageMode(Discardable discardable) const;
113
114 struct FormatInfo {
115 uint32_t colorTypeFlags(SkColorType colorType) const {
116 for (int i = 0; i < fColorTypeInfoCount; ++i) {
117 if (fColorTypeInfos[i].fColorType == colorType) {
118 return fColorTypeInfos[i].fFlags;
119 }
120 }
121 return 0;
122 }
123
124 enum {
125 kTexturable_Flag = 0x01,
126 kRenderable_Flag = 0x02, // Color attachment and blendable
127 kMSAA_Flag = 0x04,
128 kResolve_Flag = 0x08,
129 kStorage_Flag = 0x10,
130 };
131 static const uint16_t kAllFlags =
132 kTexturable_Flag | kRenderable_Flag | kMSAA_Flag | kResolve_Flag | kStorage_Flag;
133
134 uint16_t fFlags = 0;
135
136 std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos;
137 int fColorTypeInfoCount = 0;
138 };
139#ifdef SK_BUILD_FOR_MAC
140 inline static constexpr size_t kNumMtlFormats = 21;
141#else
142 inline static constexpr size_t kNumMtlFormats = 20;
143#endif
144
145 static size_t GetFormatIndex(MTLPixelFormat);
146 FormatInfo fFormatTable[kNumMtlFormats];
147
148 const FormatInfo& getFormatInfo(const MTLPixelFormat pixelFormat) const {
149 size_t index = GetFormatIndex(pixelFormat);
150 return fFormatTable[index];
151 }
152
153 MTLPixelFormat fColorTypeToFormatTable[kSkColorTypeCnt];
154 void setColorType(SkColorType, std::initializer_list<MTLPixelFormat> formats);
155
156 // A vector of the viable sample counts (e.g., { 1, 2, 4, 8 }).
157 std::vector<uint32_t> fColorSampleCounts;
158
159 GPUFamily fGPUFamily;
160 int fFamilyGroup;
161};
162
163} // namespace skgpu::graphite
164
165#endif // skgpu_graphite_MtlCaps_DEFINED
SkColorType fColorType
uint16_t fFlags
SkColorType
Definition SkColorType.h:19
static constexpr int kSkColorTypeCnt
Definition SkColorType.h:68
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
void buildKeyForTexture(SkISize dimensions, const TextureInfo &, ResourceType, Shareable, GraphiteResourceKey *) const override
Definition MtlCaps.mm:1214
TextureInfo getDefaultMSAATextureInfo(const TextureInfo &singleSampledInfo, Discardable discardable) const override
Definition MtlCaps.mm:879
TextureInfo getTextureInfoForSampledCopy(const TextureInfo &textureInfo, Mipmapped mipmapped) const override
Definition MtlCaps.mm:816
TextureInfo getDefaultCompressedTextureInfo(SkTextureCompressionType, Mipmapped mipmapped, Protected) const override
Definition MtlCaps.mm:847
std::pair< SkColorType, bool > supportedWritePixelsColorType(SkColorType dstColorType, const TextureInfo &dstTextureInfo, SkColorType srcColorType) const override
Definition MtlCaps.mm:1174
bool extractGraphicsDescs(const UniqueKey &, GraphicsPipelineDesc *, RenderPassDesc *, const RendererProvider *) const override
Definition MtlCaps.mm:985
bool isStorage(const TextureInfo &) const override
Definition MtlCaps.mm:1114
bool supportsReadPixels(const TextureInfo &) const override
Definition MtlCaps.mm:1155
TextureInfo getDefaultSampledTextureInfo(SkColorType, Mipmapped mipmapped, Protected, Renderable) const override
Definition MtlCaps.mm:791
bool onIsTexturable(const TextureInfo &) const override
Definition MtlCaps.mm:1086
bool supportsWritePixels(const TextureInfo &) const override
Definition MtlCaps.mm:1141
bool isApple() const
Definition MtlCaps.h:60
TextureInfo getDefaultDepthStencilTextureInfo(SkEnumBitMask< DepthStencilFlags >, uint32_t sampleCount, Protected) const override
Definition MtlCaps.mm:902
std::pair< SkColorType, bool > supportedReadPixelsColorType(SkColorType srcColorType, const TextureInfo &srcTextureInfo, SkColorType dstColorType) const override
Definition MtlCaps.mm:1191
bool isMac() const
Definition MtlCaps.h:59
TextureInfo getDefaultStorageTextureInfo(SkColorType) const override
Definition MtlCaps.mm:917
UniqueKey makeComputePipelineKey(const ComputePipelineDesc &) const override
Definition MtlCaps.mm:1065
uint64_t getRenderPassDescKey(const RenderPassDesc &) const
Definition MtlCaps.mm:1055
bool isRenderable(const TextureInfo &) const override
Definition MtlCaps.mm:1104
uint32_t channelMask(const TextureInfo &) const override
Definition MtlCaps.mm:1082
UniqueKey makeGraphicsPipelineKey(const GraphicsPipelineDesc &, const RenderPassDesc &) const override
Definition MtlCaps.mm:962
const ColorTypeInfo * getColorTypeInfo(SkColorType, const TextureInfo &) const override
Definition MtlCaps.mm:941
VkDevice device
Definition main.cc:53
uint32_t ResourceType
Renderable
Definition GpuTypes.h:69
Mipmapped
Definition GpuTypes.h:53
Protected
Definition GpuTypes.h:61