xref: /third_party/skia/src/gpu/mtl/GrMtlCaps.mm (revision cb93a386)
1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "src/gpu/mtl/GrMtlCaps.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkRect.h"
11cb93a386Sopenharmony_ci#include "include/gpu/GrBackendSurface.h"
12cb93a386Sopenharmony_ci#include "src/core/SkCompressedDataUtils.h"
13cb93a386Sopenharmony_ci#include "src/core/SkReadBuffer.h"
14cb93a386Sopenharmony_ci#include "src/gpu/GrBackendUtils.h"
15cb93a386Sopenharmony_ci#include "src/gpu/GrProcessor.h"
16cb93a386Sopenharmony_ci#include "src/gpu/GrProgramDesc.h"
17cb93a386Sopenharmony_ci#include "src/gpu/GrProgramInfo.h"
18cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTarget.h"
19cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTargetProxy.h"
20cb93a386Sopenharmony_ci#include "src/gpu/GrShaderCaps.h"
21cb93a386Sopenharmony_ci#include "src/gpu/GrSurfaceProxy.h"
22cb93a386Sopenharmony_ci#include "src/gpu/mtl/GrMtlRenderTarget.h"
23cb93a386Sopenharmony_ci#include "src/gpu/mtl/GrMtlTexture.h"
24cb93a386Sopenharmony_ci#include "src/gpu/mtl/GrMtlUtil.h"
25cb93a386Sopenharmony_ci
26cb93a386Sopenharmony_ci#if !__has_feature(objc_arc)
27cb93a386Sopenharmony_ci#error This file must be compiled with Arc. Use -fobjc-arc flag
28cb93a386Sopenharmony_ci#endif
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_ciGR_NORETAIN_BEGIN
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ciGrMtlCaps::GrMtlCaps(const GrContextOptions& contextOptions, const id<MTLDevice> device)
33cb93a386Sopenharmony_ci        : INHERITED(contextOptions) {
34cb93a386Sopenharmony_ci    fShaderCaps = std::make_unique<GrShaderCaps>();
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci    this->initGPUFamily(device);
37cb93a386Sopenharmony_ci    this->initGrCaps(device);
38cb93a386Sopenharmony_ci    this->initShaderCaps();
39cb93a386Sopenharmony_ci    if (!contextOptions.fDisableDriverCorrectnessWorkarounds) {
40cb93a386Sopenharmony_ci        this->applyDriverCorrectnessWorkarounds(contextOptions, device);
41cb93a386Sopenharmony_ci    }
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    this->initFormatTable();
44cb93a386Sopenharmony_ci    this->initStencilFormat(device);
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    // TODO: appears to be slow with Mac msaa8, disabled for now
47cb93a386Sopenharmony_ci    fStoreAndMultisampleResolveSupport = (fGPUFamily == GPUFamily::kApple &&
48cb93a386Sopenharmony_ci                                          fFamilyGroup >= 3);
49cb93a386Sopenharmony_ci    // Also slow with non-Apple silicon
50cb93a386Sopenharmony_ci    fPreferDiscardableMSAAAttachment = (fGPUFamily == GPUFamily::kApple);
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci    this->finishInitialization(contextOptions);
53cb93a386Sopenharmony_ci}
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci// translates from older MTLFeatureSet interface to MTLGPUFamily interface
56cb93a386Sopenharmony_cibool GrMtlCaps::getGPUFamilyFromFeatureSet(id<MTLDevice> device,
57cb93a386Sopenharmony_ci                                           GPUFamily* gpuFamily,
58cb93a386Sopenharmony_ci                                           int* group) {
59cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_MAC)
60cb93a386Sopenharmony_ci    // Apple Silicon is only available in later OSes
61cb93a386Sopenharmony_ci    *gpuFamily = GPUFamily::kMac;
62cb93a386Sopenharmony_ci    // Mac OSX 14
63cb93a386Sopenharmony_ci    if (@available(macOS 10.14, *)) {
64cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily2_v1]) {
65cb93a386Sopenharmony_ci            *group = 2;
66cb93a386Sopenharmony_ci            return true;
67cb93a386Sopenharmony_ci        }
68cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v4]) {
69cb93a386Sopenharmony_ci            *group = 1;
70cb93a386Sopenharmony_ci            return true;
71cb93a386Sopenharmony_ci        }
72cb93a386Sopenharmony_ci    }
73cb93a386Sopenharmony_ci    // Mac OSX 13
74cb93a386Sopenharmony_ci    if (@available(macOS 10.13, *)) {
75cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v3]) {
76cb93a386Sopenharmony_ci            *group = 1;
77cb93a386Sopenharmony_ci            return true;
78cb93a386Sopenharmony_ci        }
79cb93a386Sopenharmony_ci    }
80cb93a386Sopenharmony_ci    // Mac OSX 12
81cb93a386Sopenharmony_ci    if (@available(macOS 10.12, *)) {
82cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v2]) {
83cb93a386Sopenharmony_ci            *group = 1;
84cb93a386Sopenharmony_ci            return true;
85cb93a386Sopenharmony_ci        }
86cb93a386Sopenharmony_ci    }
87cb93a386Sopenharmony_ci    // Mac OSX 11
88cb93a386Sopenharmony_ci    if (@available(macOS 10.11, *)) {
89cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_macOS_GPUFamily1_v1]) {
90cb93a386Sopenharmony_ci            *group = 1;
91cb93a386Sopenharmony_ci            return true;
92cb93a386Sopenharmony_ci        }
93cb93a386Sopenharmony_ci    }
94cb93a386Sopenharmony_ci#elif defined(SK_BUILD_FOR_IOS)
95cb93a386Sopenharmony_ci    // TODO: support tvOS
96cb93a386Sopenharmony_ci   *gpuFamily = GPUFamily::kApple;
97cb93a386Sopenharmony_ci    // iOS 12
98cb93a386Sopenharmony_ci    if (@available(iOS 12.0, *)) {
99cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily5_v1]) {
100cb93a386Sopenharmony_ci            *group = 5;
101cb93a386Sopenharmony_ci            return true;
102cb93a386Sopenharmony_ci        }
103cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v2]) {
104cb93a386Sopenharmony_ci            *group = 4;
105cb93a386Sopenharmony_ci            return true;
106cb93a386Sopenharmony_ci        }
107cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v4]) {
108cb93a386Sopenharmony_ci            *group = 3;
109cb93a386Sopenharmony_ci            return true;
110cb93a386Sopenharmony_ci        }
111cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v5]) {
112cb93a386Sopenharmony_ci            *group = 2;
113cb93a386Sopenharmony_ci            return true;
114cb93a386Sopenharmony_ci        }
115cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v5]) {
116cb93a386Sopenharmony_ci            *group = 1;
117cb93a386Sopenharmony_ci            return true;
118cb93a386Sopenharmony_ci        }
119cb93a386Sopenharmony_ci    }
120cb93a386Sopenharmony_ci    // iOS 11
121cb93a386Sopenharmony_ci    if (@available(iOS 11.0, *)) {
122cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) {
123cb93a386Sopenharmony_ci            *group = 4;
124cb93a386Sopenharmony_ci            return true;
125cb93a386Sopenharmony_ci        }
126cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v3]) {
127cb93a386Sopenharmony_ci            *group = 3;
128cb93a386Sopenharmony_ci            return true;
129cb93a386Sopenharmony_ci        }
130cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v4]) {
131cb93a386Sopenharmony_ci            *group = 2;
132cb93a386Sopenharmony_ci            return true;
133cb93a386Sopenharmony_ci        }
134cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v4]) {
135cb93a386Sopenharmony_ci            *group = 1;
136cb93a386Sopenharmony_ci            return true;
137cb93a386Sopenharmony_ci        }
138cb93a386Sopenharmony_ci    }
139cb93a386Sopenharmony_ci    // iOS 10
140cb93a386Sopenharmony_ci    if (@available(iOS 10.0, *)) {
141cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v2]) {
142cb93a386Sopenharmony_ci            *group = 3;
143cb93a386Sopenharmony_ci            return true;
144cb93a386Sopenharmony_ci        }
145cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v3]) {
146cb93a386Sopenharmony_ci            *group = 2;
147cb93a386Sopenharmony_ci            return true;
148cb93a386Sopenharmony_ci        }
149cb93a386Sopenharmony_ci        if ([device supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v3]) {
150cb93a386Sopenharmony_ci            *group = 1;
151cb93a386Sopenharmony_ci            return true;
152cb93a386Sopenharmony_ci        }
153cb93a386Sopenharmony_ci    }
154cb93a386Sopenharmony_ci    // We don't support earlier OSes
155cb93a386Sopenharmony_ci#endif
156cb93a386Sopenharmony_ci
157cb93a386Sopenharmony_ci    // No supported GPU families were found
158cb93a386Sopenharmony_ci    return false;
159cb93a386Sopenharmony_ci}
160cb93a386Sopenharmony_ci
161cb93a386Sopenharmony_cibool GrMtlCaps::getGPUFamily(id<MTLDevice> device, GPUFamily* gpuFamily, int* group) {
162cb93a386Sopenharmony_ci#if GR_METAL_SDK_VERSION >= 220
163cb93a386Sopenharmony_ci    if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) {
164cb93a386Sopenharmony_ci        // Apple Silicon
165cb93a386Sopenharmony_ci#if GR_METAL_SDK_VERSION >= 230
166cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple7]) {
167cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
168cb93a386Sopenharmony_ci            *group = 7;
169cb93a386Sopenharmony_ci            return true;
170cb93a386Sopenharmony_ci        }
171cb93a386Sopenharmony_ci#endif
172cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
173cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple6]) {
174cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
175cb93a386Sopenharmony_ci            *group = 6;
176cb93a386Sopenharmony_ci            return true;
177cb93a386Sopenharmony_ci        }
178cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple5]) {
179cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
180cb93a386Sopenharmony_ci            *group = 5;
181cb93a386Sopenharmony_ci            return true;
182cb93a386Sopenharmony_ci        }
183cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple4]) {
184cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
185cb93a386Sopenharmony_ci            *group = 4;
186cb93a386Sopenharmony_ci            return true;
187cb93a386Sopenharmony_ci        }
188cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple3]) {
189cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
190cb93a386Sopenharmony_ci            *group = 3;
191cb93a386Sopenharmony_ci            return true;
192cb93a386Sopenharmony_ci        }
193cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple2]) {
194cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
195cb93a386Sopenharmony_ci            *group = 2;
196cb93a386Sopenharmony_ci            return true;
197cb93a386Sopenharmony_ci        }
198cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyApple1]) {
199cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kApple;
200cb93a386Sopenharmony_ci            *group = 1;
201cb93a386Sopenharmony_ci            return true;
202cb93a386Sopenharmony_ci        }
203cb93a386Sopenharmony_ci#endif
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_ci        // Older Macs
206cb93a386Sopenharmony_ci        // At the moment MacCatalyst families have the same features as Mac,
207cb93a386Sopenharmony_ci        // so we treat them the same
208cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyMac2] ||
209cb93a386Sopenharmony_ci            [device supportsFamily:MTLGPUFamilyMacCatalyst2]) {
210cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kMac;
211cb93a386Sopenharmony_ci            *group = 2;
212cb93a386Sopenharmony_ci            return true;
213cb93a386Sopenharmony_ci        }
214cb93a386Sopenharmony_ci        if ([device supportsFamily:MTLGPUFamilyMac1] ||
215cb93a386Sopenharmony_ci            [device supportsFamily:MTLGPUFamilyMacCatalyst1]) {
216cb93a386Sopenharmony_ci            *gpuFamily = GPUFamily::kMac;
217cb93a386Sopenharmony_ci            *group = 1;
218cb93a386Sopenharmony_ci            return true;
219cb93a386Sopenharmony_ci        }
220cb93a386Sopenharmony_ci    }
221cb93a386Sopenharmony_ci#endif
222cb93a386Sopenharmony_ci
223cb93a386Sopenharmony_ci    // No supported GPU families were found
224cb93a386Sopenharmony_ci    return false;
225cb93a386Sopenharmony_ci}
226cb93a386Sopenharmony_ci
227cb93a386Sopenharmony_civoid GrMtlCaps::initGPUFamily(id<MTLDevice> device) {
228cb93a386Sopenharmony_ci    if (!this->getGPUFamily(device, &fGPUFamily, &fFamilyGroup) &&
229cb93a386Sopenharmony_ci        !this->getGPUFamilyFromFeatureSet(device, &fGPUFamily, &fFamilyGroup)) {
230cb93a386Sopenharmony_ci        // We don't know what this is, fall back to minimum defaults
231cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
232cb93a386Sopenharmony_ci        fGPUFamily = GPUFamily::kMac;
233cb93a386Sopenharmony_ci        fFamilyGroup = 1;
234cb93a386Sopenharmony_ci#else
235cb93a386Sopenharmony_ci        fGPUFamily = GPUFamily::kApple;
236cb93a386Sopenharmony_ci        fFamilyGroup = 1;
237cb93a386Sopenharmony_ci#endif
238cb93a386Sopenharmony_ci    }
239cb93a386Sopenharmony_ci}
240cb93a386Sopenharmony_ci
241cb93a386Sopenharmony_cibool GrMtlCaps::canCopyAsBlit(MTLPixelFormat dstFormat, int dstSampleCount,
242cb93a386Sopenharmony_ci                              MTLPixelFormat srcFormat, int srcSampleCount,
243cb93a386Sopenharmony_ci                              const SkIRect& srcRect, const SkIPoint& dstPoint,
244cb93a386Sopenharmony_ci                              bool areDstSrcSameObj) const {
245cb93a386Sopenharmony_ci    if (!dstFormat || dstFormat != srcFormat) {
246cb93a386Sopenharmony_ci        return false;
247cb93a386Sopenharmony_ci    }
248cb93a386Sopenharmony_ci    if ((dstSampleCount > 1 || srcSampleCount > 1) && (dstSampleCount != srcSampleCount)) {
249cb93a386Sopenharmony_ci        return false;
250cb93a386Sopenharmony_ci    }
251cb93a386Sopenharmony_ci    if (areDstSrcSameObj) {
252cb93a386Sopenharmony_ci        SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.x(), dstPoint.y(),
253cb93a386Sopenharmony_ci                                            srcRect.width(), srcRect.height());
254cb93a386Sopenharmony_ci        if (dstRect.intersect(srcRect)) {
255cb93a386Sopenharmony_ci            return false;
256cb93a386Sopenharmony_ci        }
257cb93a386Sopenharmony_ci    }
258cb93a386Sopenharmony_ci    return true;
259cb93a386Sopenharmony_ci}
260cb93a386Sopenharmony_ci
261cb93a386Sopenharmony_cibool GrMtlCaps::canCopyAsResolve(MTLPixelFormat dstFormat, int dstSampleCount,
262cb93a386Sopenharmony_ci                                 MTLPixelFormat srcFormat, int srcSampleCount,
263cb93a386Sopenharmony_ci                                 bool srcIsRenderTarget, const SkISize srcDimensions,
264cb93a386Sopenharmony_ci                                 const SkIRect& srcRect,
265cb93a386Sopenharmony_ci                                 const SkIPoint& dstPoint,
266cb93a386Sopenharmony_ci                                 bool areDstSrcSameObj) const {
267cb93a386Sopenharmony_ci    if (areDstSrcSameObj) {
268cb93a386Sopenharmony_ci        return false;
269cb93a386Sopenharmony_ci    }
270cb93a386Sopenharmony_ci    if (dstFormat != srcFormat) {
271cb93a386Sopenharmony_ci        return false;
272cb93a386Sopenharmony_ci    }
273cb93a386Sopenharmony_ci    if (dstSampleCount > 1 || srcSampleCount == 1 || !srcIsRenderTarget) {
274cb93a386Sopenharmony_ci        return false;
275cb93a386Sopenharmony_ci    }
276cb93a386Sopenharmony_ci
277cb93a386Sopenharmony_ci    // TODO: Support copying subrectangles
278cb93a386Sopenharmony_ci    if (dstPoint != SkIPoint::Make(0, 0)) {
279cb93a386Sopenharmony_ci        return false;
280cb93a386Sopenharmony_ci    }
281cb93a386Sopenharmony_ci    if (srcRect != SkIRect::MakeSize(srcDimensions)) {
282cb93a386Sopenharmony_ci        return false;
283cb93a386Sopenharmony_ci    }
284cb93a386Sopenharmony_ci
285cb93a386Sopenharmony_ci    return true;
286cb93a386Sopenharmony_ci}
287cb93a386Sopenharmony_ci
288cb93a386Sopenharmony_cibool GrMtlCaps::onCanCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* src,
289cb93a386Sopenharmony_ci                                 const SkIRect& srcRect, const SkIPoint& dstPoint) const {
290cb93a386Sopenharmony_ci    int dstSampleCnt = 1;
291cb93a386Sopenharmony_ci    int srcSampleCnt = 1;
292cb93a386Sopenharmony_ci    if (const GrRenderTargetProxy* rtProxy = dst->asRenderTargetProxy()) {
293cb93a386Sopenharmony_ci        dstSampleCnt = rtProxy->numSamples();
294cb93a386Sopenharmony_ci    }
295cb93a386Sopenharmony_ci    if (const GrRenderTargetProxy* rtProxy = src->asRenderTargetProxy()) {
296cb93a386Sopenharmony_ci        srcSampleCnt = rtProxy->numSamples();
297cb93a386Sopenharmony_ci    }
298cb93a386Sopenharmony_ci
299cb93a386Sopenharmony_ci    // TODO: need some way to detect whether the proxy is framebufferOnly
300cb93a386Sopenharmony_ci
301cb93a386Sopenharmony_ci    if (this->canCopyAsBlit(GrBackendFormatAsMTLPixelFormat(dst->backendFormat()), dstSampleCnt,
302cb93a386Sopenharmony_ci                            GrBackendFormatAsMTLPixelFormat(src->backendFormat()), srcSampleCnt,
303cb93a386Sopenharmony_ci                            srcRect, dstPoint, dst == src)) {
304cb93a386Sopenharmony_ci        return true;
305cb93a386Sopenharmony_ci    }
306cb93a386Sopenharmony_ci    bool srcIsRenderTarget = src->asRenderTargetProxy();
307cb93a386Sopenharmony_ci    MTLPixelFormat dstFormat = GrBackendFormatAsMTLPixelFormat(dst->backendFormat());
308cb93a386Sopenharmony_ci    MTLPixelFormat srcFormat = GrBackendFormatAsMTLPixelFormat(src->backendFormat());
309cb93a386Sopenharmony_ci    return this->canCopyAsResolve(dstFormat, dstSampleCnt,
310cb93a386Sopenharmony_ci                                  srcFormat, srcSampleCnt,
311cb93a386Sopenharmony_ci                                  srcIsRenderTarget, src->backingStoreDimensions(), srcRect,
312cb93a386Sopenharmony_ci                                  dstPoint,
313cb93a386Sopenharmony_ci                                  dst == src);
314cb93a386Sopenharmony_ci}
315cb93a386Sopenharmony_ci
316cb93a386Sopenharmony_civoid GrMtlCaps::initGrCaps(id<MTLDevice> device) {
317cb93a386Sopenharmony_ci    // Max vertex attribs is the same on all devices
318cb93a386Sopenharmony_ci    fMaxVertexAttributes = 31;
319cb93a386Sopenharmony_ci
320cb93a386Sopenharmony_ci    // Metal does not support scissor + clear
321cb93a386Sopenharmony_ci    fPerformPartialClearsAsDraws = true;
322cb93a386Sopenharmony_ci
323cb93a386Sopenharmony_ci    // We always copy in/out of a transfer buffer so it's trivial to support row bytes.
324cb93a386Sopenharmony_ci    fReadPixelsRowBytesSupport = true;
325cb93a386Sopenharmony_ci    fWritePixelsRowBytesSupport = true;
326cb93a386Sopenharmony_ci    fTransferPixelsToRowBytesSupport = true;
327cb93a386Sopenharmony_ci
328cb93a386Sopenharmony_ci    // RenderTarget and Texture size
329cb93a386Sopenharmony_ci    if (this->isMac() || fFamilyGroup >= 3) {
330cb93a386Sopenharmony_ci        fMaxRenderTargetSize = 16384;
331cb93a386Sopenharmony_ci    } else {
332cb93a386Sopenharmony_ci        fMaxRenderTargetSize = 8192;
333cb93a386Sopenharmony_ci    }
334cb93a386Sopenharmony_ci    fMaxPreferredRenderTargetSize = fMaxRenderTargetSize;
335cb93a386Sopenharmony_ci    fMaxTextureSize = fMaxRenderTargetSize;
336cb93a386Sopenharmony_ci
337cb93a386Sopenharmony_ci    fMaxPushConstantsSize = 4*1024;
338cb93a386Sopenharmony_ci    fTransferBufferAlignment = 1;
339cb93a386Sopenharmony_ci
340cb93a386Sopenharmony_ci    // Init sample counts. All devices support 1 (i.e. 0 in skia).
341cb93a386Sopenharmony_ci    fSampleCounts.push_back(1);
342cb93a386Sopenharmony_ci    if (@available(iOS 9.0, *)) {
343cb93a386Sopenharmony_ci        for (auto sampleCnt : {2, 4, 8}) {
344cb93a386Sopenharmony_ci            if ([device supportsTextureSampleCount:sampleCnt]) {
345cb93a386Sopenharmony_ci                fSampleCounts.push_back(sampleCnt);
346cb93a386Sopenharmony_ci            }
347cb93a386Sopenharmony_ci        }
348cb93a386Sopenharmony_ci    }
349cb93a386Sopenharmony_ci
350cb93a386Sopenharmony_ci    // Clamp to border is supported on Mac 10.12 and higher. It is not supported on iOS.
351cb93a386Sopenharmony_ci    fClampToBorderSupport = false;
352cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
353cb93a386Sopenharmony_ci    if (@available(macOS 10.12, *)) {
354cb93a386Sopenharmony_ci        fClampToBorderSupport = true;
355cb93a386Sopenharmony_ci    }
356cb93a386Sopenharmony_ci#endif
357cb93a386Sopenharmony_ci
358cb93a386Sopenharmony_ci    // Starting with the assumption that there isn't a reason to not map small buffers.
359cb93a386Sopenharmony_ci    fBufferMapThreshold = 0;
360cb93a386Sopenharmony_ci
361cb93a386Sopenharmony_ci    // Buffers are always fully mapped.
362cb93a386Sopenharmony_ci    fMapBufferFlags =  kCanMap_MapFlag | kAsyncRead_MapFlag;
363cb93a386Sopenharmony_ci
364cb93a386Sopenharmony_ci    fOversizedStencilSupport = true;
365cb93a386Sopenharmony_ci
366cb93a386Sopenharmony_ci    fMipmapSupport = true;   // always available in Metal
367cb93a386Sopenharmony_ci    fNPOTTextureTileSupport = true;  // always available in Metal
368cb93a386Sopenharmony_ci
369cb93a386Sopenharmony_ci    fReuseScratchTextures = true; // Assuming this okay
370cb93a386Sopenharmony_ci
371cb93a386Sopenharmony_ci    fTransferFromBufferToTextureSupport = true;
372cb93a386Sopenharmony_ci    fTransferFromSurfaceToBufferSupport = true;
373cb93a386Sopenharmony_ci
374cb93a386Sopenharmony_ci    fTextureBarrierSupport = false; // Need to figure out if we can do this
375cb93a386Sopenharmony_ci
376cb93a386Sopenharmony_ci    fSampleLocationsSupport = false;
377cb93a386Sopenharmony_ci
378cb93a386Sopenharmony_ci    if (@available(macOS 10.11, iOS 9.0, *)) {
379cb93a386Sopenharmony_ci        if (this->isMac() || fFamilyGroup >= 3) {
380cb93a386Sopenharmony_ci            fDrawInstancedSupport = true;
381cb93a386Sopenharmony_ci            fNativeDrawIndirectSupport = true;
382cb93a386Sopenharmony_ci        }
383cb93a386Sopenharmony_ci    }
384cb93a386Sopenharmony_ci
385cb93a386Sopenharmony_ci    fGpuTracingSupport = false;
386cb93a386Sopenharmony_ci
387cb93a386Sopenharmony_ci    fFenceSyncSupport = true;
388cb93a386Sopenharmony_ci    bool supportsMTLEvent = false;
389cb93a386Sopenharmony_ci    if (@available(macOS 10.14, iOS 12.0, *)) {
390cb93a386Sopenharmony_ci        supportsMTLEvent = true;
391cb93a386Sopenharmony_ci    }
392cb93a386Sopenharmony_ci    fSemaphoreSupport = supportsMTLEvent;
393cb93a386Sopenharmony_ci
394cb93a386Sopenharmony_ci    fCrossContextTextureSupport = true;
395cb93a386Sopenharmony_ci    fHalfFloatVertexAttributeSupport = true;
396cb93a386Sopenharmony_ci
397cb93a386Sopenharmony_ci    fDynamicStateArrayGeometryProcessorTextureSupport = true;
398cb93a386Sopenharmony_ci}
399cb93a386Sopenharmony_ci
400cb93a386Sopenharmony_cistatic bool format_is_srgb(MTLPixelFormat format) {
401cb93a386Sopenharmony_ci    switch (format) {
402cb93a386Sopenharmony_ci        case MTLPixelFormatRGBA8Unorm_sRGB:
403cb93a386Sopenharmony_ci        case MTLPixelFormatBGRA8Unorm_sRGB:
404cb93a386Sopenharmony_ci            return true;
405cb93a386Sopenharmony_ci        default:
406cb93a386Sopenharmony_ci            return false;
407cb93a386Sopenharmony_ci    }
408cb93a386Sopenharmony_ci}
409cb93a386Sopenharmony_ci
410cb93a386Sopenharmony_cibool GrMtlCaps::isFormatSRGB(const GrBackendFormat& format) const {
411cb93a386Sopenharmony_ci    return format_is_srgb(GrBackendFormatAsMTLPixelFormat(format));
412cb93a386Sopenharmony_ci}
413cb93a386Sopenharmony_ci
414cb93a386Sopenharmony_cibool GrMtlCaps::isFormatTexturable(const GrBackendFormat& format, GrTextureType) const {
415cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
416cb93a386Sopenharmony_ci    return this->isFormatTexturable(mtlFormat);
417cb93a386Sopenharmony_ci}
418cb93a386Sopenharmony_ci
419cb93a386Sopenharmony_cibool GrMtlCaps::isFormatTexturable(MTLPixelFormat format) const {
420cb93a386Sopenharmony_ci    const FormatInfo& formatInfo = this->getFormatInfo(format);
421cb93a386Sopenharmony_ci    return SkToBool(FormatInfo::kTexturable_Flag && formatInfo.fFlags);
422cb93a386Sopenharmony_ci}
423cb93a386Sopenharmony_ci
424cb93a386Sopenharmony_cibool GrMtlCaps::isFormatAsColorTypeRenderable(GrColorType ct, const GrBackendFormat& format,
425cb93a386Sopenharmony_ci                                              int sampleCount) const {
426cb93a386Sopenharmony_ci    if (!this->isFormatRenderable(format, sampleCount)) {
427cb93a386Sopenharmony_ci        return false;
428cb93a386Sopenharmony_ci    }
429cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
430cb93a386Sopenharmony_ci    SkASSERT(mtlFormat != MTLPixelFormatInvalid);
431cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(mtlFormat);
432cb93a386Sopenharmony_ci    if (!SkToBool(info.colorTypeFlags(ct) & ColorTypeInfo::kRenderable_Flag)) {
433cb93a386Sopenharmony_ci        return false;
434cb93a386Sopenharmony_ci    }
435cb93a386Sopenharmony_ci    return true;
436cb93a386Sopenharmony_ci}
437cb93a386Sopenharmony_ci
438cb93a386Sopenharmony_cibool GrMtlCaps::isFormatRenderable(const GrBackendFormat& format, int sampleCount) const {
439cb93a386Sopenharmony_ci    return this->isFormatRenderable(GrBackendFormatAsMTLPixelFormat(format), sampleCount);
440cb93a386Sopenharmony_ci}
441cb93a386Sopenharmony_ci
442cb93a386Sopenharmony_cibool GrMtlCaps::isFormatRenderable(MTLPixelFormat format, int sampleCount) const {
443cb93a386Sopenharmony_ci    return sampleCount <= this->maxRenderTargetSampleCount(format);
444cb93a386Sopenharmony_ci}
445cb93a386Sopenharmony_ci
446cb93a386Sopenharmony_ciint GrMtlCaps::maxRenderTargetSampleCount(const GrBackendFormat& format) const {
447cb93a386Sopenharmony_ci    return this->maxRenderTargetSampleCount(GrBackendFormatAsMTLPixelFormat(format));
448cb93a386Sopenharmony_ci}
449cb93a386Sopenharmony_ci
450cb93a386Sopenharmony_ciint GrMtlCaps::maxRenderTargetSampleCount(MTLPixelFormat format) const {
451cb93a386Sopenharmony_ci    const FormatInfo& formatInfo = this->getFormatInfo(format);
452cb93a386Sopenharmony_ci    if (formatInfo.fFlags & FormatInfo::kMSAA_Flag) {
453cb93a386Sopenharmony_ci        return fSampleCounts[fSampleCounts.count() - 1];
454cb93a386Sopenharmony_ci    } else if (formatInfo.fFlags & FormatInfo::kRenderable_Flag) {
455cb93a386Sopenharmony_ci        return 1;
456cb93a386Sopenharmony_ci    }
457cb93a386Sopenharmony_ci    return 0;
458cb93a386Sopenharmony_ci}
459cb93a386Sopenharmony_ci
460cb93a386Sopenharmony_ciint GrMtlCaps::getRenderTargetSampleCount(int requestedCount,
461cb93a386Sopenharmony_ci                                          const GrBackendFormat& format) const {
462cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
463cb93a386Sopenharmony_ci
464cb93a386Sopenharmony_ci    return this->getRenderTargetSampleCount(requestedCount, mtlFormat);
465cb93a386Sopenharmony_ci}
466cb93a386Sopenharmony_ci
467cb93a386Sopenharmony_ciint GrMtlCaps::getRenderTargetSampleCount(int requestedCount, MTLPixelFormat format) const {
468cb93a386Sopenharmony_ci    requestedCount = std::max(requestedCount, 1);
469cb93a386Sopenharmony_ci    const FormatInfo& formatInfo = this->getFormatInfo(format);
470cb93a386Sopenharmony_ci    if (!(formatInfo.fFlags & FormatInfo::kRenderable_Flag)) {
471cb93a386Sopenharmony_ci        return 0;
472cb93a386Sopenharmony_ci    }
473cb93a386Sopenharmony_ci    if (formatInfo.fFlags & FormatInfo::kMSAA_Flag) {
474cb93a386Sopenharmony_ci        int count = fSampleCounts.count();
475cb93a386Sopenharmony_ci        for (int i = 0; i < count; ++i) {
476cb93a386Sopenharmony_ci            if (fSampleCounts[i] >= requestedCount) {
477cb93a386Sopenharmony_ci                return fSampleCounts[i];
478cb93a386Sopenharmony_ci            }
479cb93a386Sopenharmony_ci        }
480cb93a386Sopenharmony_ci    }
481cb93a386Sopenharmony_ci    return 1 == requestedCount ? 1 : 0;
482cb93a386Sopenharmony_ci}
483cb93a386Sopenharmony_ci
484cb93a386Sopenharmony_civoid GrMtlCaps::initShaderCaps() {
485cb93a386Sopenharmony_ci    GrShaderCaps* shaderCaps = fShaderCaps.get();
486cb93a386Sopenharmony_ci
487cb93a386Sopenharmony_ci    // Setting this true with the assumption that this cap will eventually mean we support varying
488cb93a386Sopenharmony_ci    // precisions and not just via modifiers.
489cb93a386Sopenharmony_ci    shaderCaps->fUsesPrecisionModifiers = true;
490cb93a386Sopenharmony_ci    shaderCaps->fFlatInterpolationSupport = true;
491cb93a386Sopenharmony_ci    // We haven't yet tested that using flat attributes perform well.
492cb93a386Sopenharmony_ci    shaderCaps->fPreferFlatInterpolation = true;
493cb93a386Sopenharmony_ci
494cb93a386Sopenharmony_ci    shaderCaps->fShaderDerivativeSupport = true;
495cb93a386Sopenharmony_ci
496cb93a386Sopenharmony_ci    if (@available(macOS 10.12, iOS 11.0, *)) {
497cb93a386Sopenharmony_ci        shaderCaps->fDualSourceBlendingSupport = true;
498cb93a386Sopenharmony_ci    } else {
499cb93a386Sopenharmony_ci        shaderCaps->fDualSourceBlendingSupport = false;
500cb93a386Sopenharmony_ci    }
501cb93a386Sopenharmony_ci
502cb93a386Sopenharmony_ci    // TODO(skia:8270): Re-enable this once bug 8270 is fixed. Will also need to remove asserts in
503cb93a386Sopenharmony_ci    // GrMtlPipelineStateBuilder which assert we aren't using this feature.
504cb93a386Sopenharmony_ci#if 0
505cb93a386Sopenharmony_ci    if (this->isIOS()) {
506cb93a386Sopenharmony_ci        shaderCaps->fFBFetchSupport = true;
507cb93a386Sopenharmony_ci        shaderCaps->fFBFetchNeedsCustomOutput = true; // ??
508cb93a386Sopenharmony_ci        shaderCaps->fFBFetchColorName = ""; // Somehow add [[color(0)]] to arguments to frag shader
509cb93a386Sopenharmony_ci    }
510cb93a386Sopenharmony_ci#endif
511cb93a386Sopenharmony_ci    shaderCaps->fDstReadInShaderSupport = shaderCaps->fFBFetchSupport;
512cb93a386Sopenharmony_ci
513cb93a386Sopenharmony_ci    shaderCaps->fIntegerSupport = true;
514cb93a386Sopenharmony_ci    shaderCaps->fNonsquareMatrixSupport = true;
515cb93a386Sopenharmony_ci    shaderCaps->fInverseHyperbolicSupport = true;
516cb93a386Sopenharmony_ci    shaderCaps->fVertexIDSupport = true;
517cb93a386Sopenharmony_ci    shaderCaps->fInfinitySupport = true;
518cb93a386Sopenharmony_ci    shaderCaps->fNonconstantArrayIndexSupport = true;
519cb93a386Sopenharmony_ci
520cb93a386Sopenharmony_ci    // Metal uses IEEE float and half floats so assuming those values here.
521cb93a386Sopenharmony_ci    shaderCaps->fFloatIs32Bits = true;
522cb93a386Sopenharmony_ci    shaderCaps->fHalfIs32Bits = false;
523cb93a386Sopenharmony_ci
524cb93a386Sopenharmony_ci    shaderCaps->fMaxFragmentSamplers = 16;
525cb93a386Sopenharmony_ci
526cb93a386Sopenharmony_ci    shaderCaps->fCanUseFastMath = true;
527cb93a386Sopenharmony_ci}
528cb93a386Sopenharmony_ci
529cb93a386Sopenharmony_civoid GrMtlCaps::applyDriverCorrectnessWorkarounds(const GrContextOptions&,
530cb93a386Sopenharmony_ci                                                  const id<MTLDevice> device) {
531cb93a386Sopenharmony_ci    // TODO: We may need to disable the fastmath option on Intel devices to avoid corruption
532cb93a386Sopenharmony_ci//    if ([device.name rangeOfString:@"Intel"].location != NSNotFound) {
533cb93a386Sopenharmony_ci//        fShaderCaps->fCanUseFastMath = false;
534cb93a386Sopenharmony_ci//    }
535cb93a386Sopenharmony_ci}
536cb93a386Sopenharmony_ci
537cb93a386Sopenharmony_ci// Define this so we can use it to initialize arrays and work around
538cb93a386Sopenharmony_ci// the fact that MTLPixelFormatBGR10A2Unorm is not always available.
539cb93a386Sopenharmony_ci#define kMTLPixelFormatBGR10A2Unorm MTLPixelFormat(94)
540cb93a386Sopenharmony_ci
541cb93a386Sopenharmony_ci// These are all the valid MTLPixelFormats that we support in Skia.  They are roughly ordered from
542cb93a386Sopenharmony_ci// most frequently used to least to improve look up times in arrays.
543cb93a386Sopenharmony_cistatic constexpr MTLPixelFormat kMtlFormats[] = {
544cb93a386Sopenharmony_ci    MTLPixelFormatRGBA8Unorm,
545cb93a386Sopenharmony_ci    MTLPixelFormatR8Unorm,
546cb93a386Sopenharmony_ci    MTLPixelFormatA8Unorm,
547cb93a386Sopenharmony_ci    MTLPixelFormatBGRA8Unorm,
548cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
549cb93a386Sopenharmony_ci    MTLPixelFormatB5G6R5Unorm,
550cb93a386Sopenharmony_ci#endif
551cb93a386Sopenharmony_ci    MTLPixelFormatRGBA16Float,
552cb93a386Sopenharmony_ci    MTLPixelFormatR16Float,
553cb93a386Sopenharmony_ci    MTLPixelFormatRG8Unorm,
554cb93a386Sopenharmony_ci    MTLPixelFormatRGB10A2Unorm,
555cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
556cb93a386Sopenharmony_ci    kMTLPixelFormatBGR10A2Unorm,
557cb93a386Sopenharmony_ci#endif
558cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
559cb93a386Sopenharmony_ci    MTLPixelFormatABGR4Unorm,
560cb93a386Sopenharmony_ci#endif
561cb93a386Sopenharmony_ci    MTLPixelFormatRGBA8Unorm_sRGB,
562cb93a386Sopenharmony_ci    MTLPixelFormatR16Unorm,
563cb93a386Sopenharmony_ci    MTLPixelFormatRG16Unorm,
564cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
565cb93a386Sopenharmony_ci    MTLPixelFormatETC2_RGB8,
566cb93a386Sopenharmony_ci#else
567cb93a386Sopenharmony_ci    MTLPixelFormatBC1_RGBA,
568cb93a386Sopenharmony_ci#endif
569cb93a386Sopenharmony_ci    MTLPixelFormatRGBA16Unorm,
570cb93a386Sopenharmony_ci    MTLPixelFormatRG16Float,
571cb93a386Sopenharmony_ci
572cb93a386Sopenharmony_ci    MTLPixelFormatInvalid,
573cb93a386Sopenharmony_ci};
574cb93a386Sopenharmony_ci
575cb93a386Sopenharmony_civoid GrMtlCaps::setColorType(GrColorType colorType, std::initializer_list<MTLPixelFormat> formats) {
576cb93a386Sopenharmony_ci#ifdef SK_DEBUG
577cb93a386Sopenharmony_ci    for (size_t i = 0; i < kNumMtlFormats; ++i) {
578cb93a386Sopenharmony_ci        const auto& formatInfo = fFormatTable[i];
579cb93a386Sopenharmony_ci        for (int j = 0; j < formatInfo.fColorTypeInfoCount; ++j) {
580cb93a386Sopenharmony_ci            const auto& ctInfo = formatInfo.fColorTypeInfos[j];
581cb93a386Sopenharmony_ci            if (ctInfo.fColorType == colorType) {
582cb93a386Sopenharmony_ci                bool found = false;
583cb93a386Sopenharmony_ci                for (auto it = formats.begin(); it != formats.end(); ++it) {
584cb93a386Sopenharmony_ci                    if (kMtlFormats[i] == *it) {
585cb93a386Sopenharmony_ci                        found = true;
586cb93a386Sopenharmony_ci                    }
587cb93a386Sopenharmony_ci                }
588cb93a386Sopenharmony_ci                SkASSERT(found);
589cb93a386Sopenharmony_ci            }
590cb93a386Sopenharmony_ci        }
591cb93a386Sopenharmony_ci    }
592cb93a386Sopenharmony_ci#endif
593cb93a386Sopenharmony_ci    int idx = static_cast<int>(colorType);
594cb93a386Sopenharmony_ci    for (auto it = formats.begin(); it != formats.end(); ++it) {
595cb93a386Sopenharmony_ci        const auto& info = this->getFormatInfo(*it);
596cb93a386Sopenharmony_ci        for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
597cb93a386Sopenharmony_ci            if (info.fColorTypeInfos[i].fColorType == colorType) {
598cb93a386Sopenharmony_ci                fColorTypeToFormatTable[idx] = *it;
599cb93a386Sopenharmony_ci                return;
600cb93a386Sopenharmony_ci            }
601cb93a386Sopenharmony_ci        }
602cb93a386Sopenharmony_ci    }
603cb93a386Sopenharmony_ci}
604cb93a386Sopenharmony_ci
605cb93a386Sopenharmony_cisize_t GrMtlCaps::GetFormatIndex(MTLPixelFormat pixelFormat) {
606cb93a386Sopenharmony_ci    static_assert(SK_ARRAY_COUNT(kMtlFormats) == GrMtlCaps::kNumMtlFormats,
607cb93a386Sopenharmony_ci                  "Size of kMtlFormats array must match static value in header");
608cb93a386Sopenharmony_ci    for (size_t i = 0; i < GrMtlCaps::kNumMtlFormats; ++i) {
609cb93a386Sopenharmony_ci        if (kMtlFormats[i] == pixelFormat) {
610cb93a386Sopenharmony_ci            return i;
611cb93a386Sopenharmony_ci        }
612cb93a386Sopenharmony_ci    }
613cb93a386Sopenharmony_ci    SK_ABORT("Invalid MTLPixelFormat");
614cb93a386Sopenharmony_ci}
615cb93a386Sopenharmony_ci
616cb93a386Sopenharmony_civoid GrMtlCaps::initFormatTable() {
617cb93a386Sopenharmony_ci    FormatInfo* info;
618cb93a386Sopenharmony_ci
619cb93a386Sopenharmony_ci    if (@available(macos 10.13, ios 11.0, *)) {
620cb93a386Sopenharmony_ci        SkASSERT(kMTLPixelFormatBGR10A2Unorm == MTLPixelFormatBGR10A2Unorm);
621cb93a386Sopenharmony_ci    }
622cb93a386Sopenharmony_ci
623cb93a386Sopenharmony_ci    // Format: R8Unorm
624cb93a386Sopenharmony_ci    {
625cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatR8Unorm)];
626cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
627cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 2;
628cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
629cb93a386Sopenharmony_ci        int ctIdx = 0;
630cb93a386Sopenharmony_ci        // Format: R8Unorm, Surface: kAlpha_8
631cb93a386Sopenharmony_ci        {
632cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
633cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kAlpha_8;
634cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
635cb93a386Sopenharmony_ci            ctInfo.fReadSwizzle = GrSwizzle("000r");
636cb93a386Sopenharmony_ci            ctInfo.fWriteSwizzle = GrSwizzle("a000");
637cb93a386Sopenharmony_ci        }
638cb93a386Sopenharmony_ci        // Format: R8Unorm, Surface: kGray_8
639cb93a386Sopenharmony_ci        {
640cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
641cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kGray_8;
642cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
643cb93a386Sopenharmony_ci            ctInfo.fReadSwizzle = GrSwizzle("rrr1");
644cb93a386Sopenharmony_ci        }
645cb93a386Sopenharmony_ci    }
646cb93a386Sopenharmony_ci
647cb93a386Sopenharmony_ci    // Format: A8Unorm
648cb93a386Sopenharmony_ci    {
649cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatA8Unorm)];
650cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kTexturable_Flag;
651cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
652cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
653cb93a386Sopenharmony_ci        int ctIdx = 0;
654cb93a386Sopenharmony_ci        // Format: A8Unorm, Surface: kAlpha_8
655cb93a386Sopenharmony_ci        {
656cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
657cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kAlpha_8;
658cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
659cb93a386Sopenharmony_ci        }
660cb93a386Sopenharmony_ci    }
661cb93a386Sopenharmony_ci
662cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_IOS) && !TARGET_OS_SIMULATOR
663cb93a386Sopenharmony_ci    // Format: B5G6R5Unorm
664cb93a386Sopenharmony_ci    {
665cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatB5G6R5Unorm)];
666cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
667cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
668cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
669cb93a386Sopenharmony_ci        int ctIdx = 0;
670cb93a386Sopenharmony_ci        // Format: B5G6R5Unorm, Surface: kBGR_565
671cb93a386Sopenharmony_ci        {
672cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
673cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kBGR_565;
674cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
675cb93a386Sopenharmony_ci        }
676cb93a386Sopenharmony_ci    }
677cb93a386Sopenharmony_ci
678cb93a386Sopenharmony_ci    // Format: ABGR4Unorm
679cb93a386Sopenharmony_ci    {
680cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatABGR4Unorm)];
681cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
682cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
683cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
684cb93a386Sopenharmony_ci        int ctIdx = 0;
685cb93a386Sopenharmony_ci        // Format: ABGR4Unorm, Surface: kABGR_4444
686cb93a386Sopenharmony_ci        {
687cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
688cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kABGR_4444;
689cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
690cb93a386Sopenharmony_ci        }
691cb93a386Sopenharmony_ci    }
692cb93a386Sopenharmony_ci#endif
693cb93a386Sopenharmony_ci
694cb93a386Sopenharmony_ci    // Format: RGBA8Unorm
695cb93a386Sopenharmony_ci    {
696cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRGBA8Unorm)];
697cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
698cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 2;
699cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
700cb93a386Sopenharmony_ci        int ctIdx = 0;
701cb93a386Sopenharmony_ci        // Format: RGBA8Unorm, Surface: kRGBA_8888
702cb93a386Sopenharmony_ci        {
703cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
704cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_8888;
705cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
706cb93a386Sopenharmony_ci        }
707cb93a386Sopenharmony_ci        // Format: RGBA8Unorm, Surface: kRGB_888x
708cb93a386Sopenharmony_ci        {
709cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
710cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGB_888x;
711cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag;
712cb93a386Sopenharmony_ci            ctInfo.fReadSwizzle = GrSwizzle::RGB1();
713cb93a386Sopenharmony_ci        }
714cb93a386Sopenharmony_ci    }
715cb93a386Sopenharmony_ci
716cb93a386Sopenharmony_ci    // Format: RG8Unorm
717cb93a386Sopenharmony_ci    {
718cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRG8Unorm)];
719cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kTexturable_Flag;
720cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
721cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
722cb93a386Sopenharmony_ci        int ctIdx = 0;
723cb93a386Sopenharmony_ci        // Format: RG8Unorm, Surface: kRG_88
724cb93a386Sopenharmony_ci        {
725cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
726cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRG_88;
727cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
728cb93a386Sopenharmony_ci        }
729cb93a386Sopenharmony_ci    }
730cb93a386Sopenharmony_ci
731cb93a386Sopenharmony_ci    // Format: BGRA8Unorm
732cb93a386Sopenharmony_ci    {
733cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatBGRA8Unorm)];
734cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
735cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
736cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
737cb93a386Sopenharmony_ci        int ctIdx = 0;
738cb93a386Sopenharmony_ci        // Format: BGRA8Unorm, Surface: kBGRA_8888
739cb93a386Sopenharmony_ci        {
740cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
741cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kBGRA_8888;
742cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
743cb93a386Sopenharmony_ci        }
744cb93a386Sopenharmony_ci    }
745cb93a386Sopenharmony_ci
746cb93a386Sopenharmony_ci    // Format: RGBA8Unorm_sRGB
747cb93a386Sopenharmony_ci    {
748cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRGBA8Unorm_sRGB)];
749cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
750cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
751cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
752cb93a386Sopenharmony_ci        int ctIdx = 0;
753cb93a386Sopenharmony_ci        // Format: RGBA8Unorm_sRGB, Surface: kRGBA_8888_SRGB
754cb93a386Sopenharmony_ci        {
755cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
756cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_8888_SRGB;
757cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
758cb93a386Sopenharmony_ci        }
759cb93a386Sopenharmony_ci    }
760cb93a386Sopenharmony_ci
761cb93a386Sopenharmony_ci    // Format: RGB10A2Unorm
762cb93a386Sopenharmony_ci    {
763cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRGB10A2Unorm)];
764cb93a386Sopenharmony_ci        if (this->isMac() || fFamilyGroup >= 3) {
765cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kAllFlags;
766cb93a386Sopenharmony_ci        } else {
767cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kTexturable_Flag;
768cb93a386Sopenharmony_ci        }
769cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
770cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
771cb93a386Sopenharmony_ci        int ctIdx = 0;
772cb93a386Sopenharmony_ci        // Format: RGB10A2Unorm, Surface: kRGBA_1010102
773cb93a386Sopenharmony_ci        {
774cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
775cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_1010102;
776cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
777cb93a386Sopenharmony_ci        }
778cb93a386Sopenharmony_ci    }
779cb93a386Sopenharmony_ci
780cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
781cb93a386Sopenharmony_ci    // Format: BGR10A2Unorm
782cb93a386Sopenharmony_ci    if (@available(macos 10.13, ios 11.0, *)) {
783cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatBGR10A2Unorm)];
784cb93a386Sopenharmony_ci        if (this->isMac() && fFamilyGroup == 1) {
785cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kTexturable_Flag;
786cb93a386Sopenharmony_ci        } else {
787cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kAllFlags;
788cb93a386Sopenharmony_ci        }
789cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
790cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
791cb93a386Sopenharmony_ci        int ctIdx = 0;
792cb93a386Sopenharmony_ci        // Format: BGR10A2Unorm, Surface: kBGRA_1010102
793cb93a386Sopenharmony_ci        {
794cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
795cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kBGRA_1010102;
796cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
797cb93a386Sopenharmony_ci        }
798cb93a386Sopenharmony_ci    }
799cb93a386Sopenharmony_ci#endif
800cb93a386Sopenharmony_ci
801cb93a386Sopenharmony_ci    // Format: R16Float
802cb93a386Sopenharmony_ci    {
803cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatR16Float)];
804cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
805cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
806cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
807cb93a386Sopenharmony_ci        int ctIdx = 0;
808cb93a386Sopenharmony_ci        // Format: R16Float, Surface: kAlpha_F16
809cb93a386Sopenharmony_ci        {
810cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
811cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kAlpha_F16;
812cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
813cb93a386Sopenharmony_ci            ctInfo.fReadSwizzle = GrSwizzle("000r");
814cb93a386Sopenharmony_ci            ctInfo.fWriteSwizzle = GrSwizzle("a000");
815cb93a386Sopenharmony_ci        }
816cb93a386Sopenharmony_ci    }
817cb93a386Sopenharmony_ci
818cb93a386Sopenharmony_ci    // Format: RGBA16Float
819cb93a386Sopenharmony_ci    {
820cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRGBA16Float)];
821cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
822cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 2;
823cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
824cb93a386Sopenharmony_ci        int ctIdx = 0;
825cb93a386Sopenharmony_ci        // Format: RGBA16Float, Surface: kRGBA_F16
826cb93a386Sopenharmony_ci        {
827cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
828cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_F16;
829cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
830cb93a386Sopenharmony_ci        }
831cb93a386Sopenharmony_ci        // Format: RGBA16Float, Surface: kRGBA_F16_Clamped
832cb93a386Sopenharmony_ci        {
833cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
834cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_F16_Clamped;
835cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
836cb93a386Sopenharmony_ci        }
837cb93a386Sopenharmony_ci    }
838cb93a386Sopenharmony_ci
839cb93a386Sopenharmony_ci    // Format: R16Unorm
840cb93a386Sopenharmony_ci    {
841cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatR16Unorm)];
842cb93a386Sopenharmony_ci        if (this->isMac()) {
843cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kAllFlags;
844cb93a386Sopenharmony_ci        } else {
845cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kTexturable_Flag | FormatInfo::kRenderable_Flag;
846cb93a386Sopenharmony_ci        }
847cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
848cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
849cb93a386Sopenharmony_ci        int ctIdx = 0;
850cb93a386Sopenharmony_ci        // Format: R16Unorm, Surface: kAlpha_16
851cb93a386Sopenharmony_ci        {
852cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
853cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kAlpha_16;
854cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
855cb93a386Sopenharmony_ci            ctInfo.fReadSwizzle = GrSwizzle("000r");
856cb93a386Sopenharmony_ci            ctInfo.fWriteSwizzle = GrSwizzle("a000");
857cb93a386Sopenharmony_ci        }
858cb93a386Sopenharmony_ci    }
859cb93a386Sopenharmony_ci
860cb93a386Sopenharmony_ci    // Format: RG16Unorm
861cb93a386Sopenharmony_ci    {
862cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRG16Unorm)];
863cb93a386Sopenharmony_ci        if (this->isMac()) {
864cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kAllFlags;
865cb93a386Sopenharmony_ci        } else {
866cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kTexturable_Flag | FormatInfo::kRenderable_Flag;
867cb93a386Sopenharmony_ci        }
868cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
869cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
870cb93a386Sopenharmony_ci        int ctIdx = 0;
871cb93a386Sopenharmony_ci        // Format: RG16Unorm, Surface: kRG_1616
872cb93a386Sopenharmony_ci        {
873cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
874cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRG_1616;
875cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
876cb93a386Sopenharmony_ci        }
877cb93a386Sopenharmony_ci    }
878cb93a386Sopenharmony_ci
879cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
880cb93a386Sopenharmony_ci    // ETC2_RGB8
881cb93a386Sopenharmony_ci    info = &fFormatTable[GetFormatIndex(MTLPixelFormatETC2_RGB8)];
882cb93a386Sopenharmony_ci    info->fFlags = FormatInfo::kTexturable_Flag;
883cb93a386Sopenharmony_ci    // NO supported colorTypes
884cb93a386Sopenharmony_ci#else
885cb93a386Sopenharmony_ci    // BC1_RGBA
886cb93a386Sopenharmony_ci    info = &fFormatTable[GetFormatIndex(MTLPixelFormatBC1_RGBA)];
887cb93a386Sopenharmony_ci    info->fFlags = FormatInfo::kTexturable_Flag;
888cb93a386Sopenharmony_ci    // NO supported colorTypes
889cb93a386Sopenharmony_ci#endif
890cb93a386Sopenharmony_ci
891cb93a386Sopenharmony_ci    // Format: RGBA16Unorm
892cb93a386Sopenharmony_ci    {
893cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRGBA16Unorm)];
894cb93a386Sopenharmony_ci        if (this->isMac()) {
895cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kAllFlags;
896cb93a386Sopenharmony_ci        } else {
897cb93a386Sopenharmony_ci            info->fFlags = FormatInfo::kTexturable_Flag | FormatInfo::kRenderable_Flag;
898cb93a386Sopenharmony_ci        }
899cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
900cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
901cb93a386Sopenharmony_ci        int ctIdx = 0;
902cb93a386Sopenharmony_ci        // Format: RGBA16Unorm, Surface: kRGBA_16161616
903cb93a386Sopenharmony_ci        {
904cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
905cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRGBA_16161616;
906cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
907cb93a386Sopenharmony_ci        }
908cb93a386Sopenharmony_ci    }
909cb93a386Sopenharmony_ci
910cb93a386Sopenharmony_ci    // Format: RG16Float
911cb93a386Sopenharmony_ci    {
912cb93a386Sopenharmony_ci        info = &fFormatTable[GetFormatIndex(MTLPixelFormatRG16Float)];
913cb93a386Sopenharmony_ci        info->fFlags = FormatInfo::kAllFlags;
914cb93a386Sopenharmony_ci        info->fColorTypeInfoCount = 1;
915cb93a386Sopenharmony_ci        info->fColorTypeInfos.reset(new ColorTypeInfo[info->fColorTypeInfoCount]());
916cb93a386Sopenharmony_ci        int ctIdx = 0;
917cb93a386Sopenharmony_ci        // Format: RG16Float, Surface: kRG_F16
918cb93a386Sopenharmony_ci        {
919cb93a386Sopenharmony_ci            auto& ctInfo = info->fColorTypeInfos[ctIdx++];
920cb93a386Sopenharmony_ci            ctInfo.fColorType = GrColorType::kRG_F16;
921cb93a386Sopenharmony_ci            ctInfo.fFlags = ColorTypeInfo::kUploadData_Flag | ColorTypeInfo::kRenderable_Flag;
922cb93a386Sopenharmony_ci        }
923cb93a386Sopenharmony_ci    }
924cb93a386Sopenharmony_ci
925cb93a386Sopenharmony_ci    ////////////////////////////////////////////////////////////////////////////
926cb93a386Sopenharmony_ci    // Map GrColorTypes (used for creating GrSurfaces) to MTLPixelFormats. The order in which the
927cb93a386Sopenharmony_ci    // formats are passed into the setColorType function indicates the priority in selecting which
928cb93a386Sopenharmony_ci    // format we use for a given GrcolorType.
929cb93a386Sopenharmony_ci
930cb93a386Sopenharmony_ci    std::fill_n(fColorTypeToFormatTable, kGrColorTypeCnt, MTLPixelFormatInvalid);
931cb93a386Sopenharmony_ci
932cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kAlpha_8,          { MTLPixelFormatR8Unorm,
933cb93a386Sopenharmony_ci                                                         MTLPixelFormatA8Unorm });
934cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_IOS) && !TARGET_OS_SIMULATOR
935cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kBGR_565,          { MTLPixelFormatB5G6R5Unorm });
936cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kABGR_4444,        { MTLPixelFormatABGR4Unorm });
937cb93a386Sopenharmony_ci#endif
938cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_8888,        { MTLPixelFormatRGBA8Unorm });
939cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_8888_SRGB,   { MTLPixelFormatRGBA8Unorm_sRGB });
940cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGB_888x,         { MTLPixelFormatRGBA8Unorm });
941cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRG_88,            { MTLPixelFormatRG8Unorm });
942cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kBGRA_8888,        { MTLPixelFormatBGRA8Unorm });
943cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_1010102,     { MTLPixelFormatRGB10A2Unorm });
944cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
945cb93a386Sopenharmony_ci    if (@available(macos 10.13, ios 11.0, *)) {
946cb93a386Sopenharmony_ci        this->setColorType(GrColorType::kBGRA_1010102, { MTLPixelFormatBGR10A2Unorm });
947cb93a386Sopenharmony_ci    }
948cb93a386Sopenharmony_ci#endif
949cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kGray_8,           { MTLPixelFormatR8Unorm });
950cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kAlpha_F16,        { MTLPixelFormatR16Float });
951cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_F16,         { MTLPixelFormatRGBA16Float });
952cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_F16_Clamped, { MTLPixelFormatRGBA16Float });
953cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kAlpha_16,         { MTLPixelFormatR16Unorm });
954cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRG_1616,          { MTLPixelFormatRG16Unorm });
955cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRGBA_16161616,    { MTLPixelFormatRGBA16Unorm });
956cb93a386Sopenharmony_ci    this->setColorType(GrColorType::kRG_F16,           { MTLPixelFormatRG16Float });
957cb93a386Sopenharmony_ci}
958cb93a386Sopenharmony_ci
959cb93a386Sopenharmony_civoid GrMtlCaps::initStencilFormat(id<MTLDevice> physDev) {
960cb93a386Sopenharmony_ci    fPreferredStencilFormat = MTLPixelFormatStencil8;
961cb93a386Sopenharmony_ci}
962cb93a386Sopenharmony_ci
963cb93a386Sopenharmony_cibool GrMtlCaps::onSurfaceSupportsWritePixels(const GrSurface* surface) const {
964cb93a386Sopenharmony_ci    if (auto rt = surface->asRenderTarget()) {
965cb93a386Sopenharmony_ci        return rt->numSamples() <= 1 && SkToBool(surface->asTexture());
966cb93a386Sopenharmony_ci    }
967cb93a386Sopenharmony_ci    return true;
968cb93a386Sopenharmony_ci}
969cb93a386Sopenharmony_ci
970cb93a386Sopenharmony_ciGrCaps::SurfaceReadPixelsSupport GrMtlCaps::surfaceSupportsReadPixels(
971cb93a386Sopenharmony_ci        const GrSurface* surface) const {
972cb93a386Sopenharmony_ci    if (auto tex = static_cast<const GrMtlTexture*>(surface->asTexture())) {
973cb93a386Sopenharmony_ci        // We disallow reading back directly from compressed textures.
974cb93a386Sopenharmony_ci        if (GrMtlFormatIsCompressed(tex->attachment()->mtlFormat())) {
975cb93a386Sopenharmony_ci            return SurfaceReadPixelsSupport::kCopyToTexture2D;
976cb93a386Sopenharmony_ci        }
977cb93a386Sopenharmony_ci    }
978cb93a386Sopenharmony_ci
979cb93a386Sopenharmony_ci    if (auto mtlRT = static_cast<const GrMtlRenderTarget*>(surface->asRenderTarget())) {
980cb93a386Sopenharmony_ci        if (mtlRT->numSamples() > 1 && !mtlRT->resolveAttachment()) {
981cb93a386Sopenharmony_ci            return SurfaceReadPixelsSupport::kCopyToTexture2D;
982cb93a386Sopenharmony_ci        }
983cb93a386Sopenharmony_ci    }
984cb93a386Sopenharmony_ci    return SurfaceReadPixelsSupport::kSupported;
985cb93a386Sopenharmony_ci}
986cb93a386Sopenharmony_ci
987cb93a386Sopenharmony_ciGrCaps::DstCopyRestrictions GrMtlCaps::getDstCopyRestrictions(const GrRenderTargetProxy* src,
988cb93a386Sopenharmony_ci                                                              GrColorType ct) const {
989cb93a386Sopenharmony_ci    // If the src is a MSAA RT then the only supported copy action (not considering falling back
990cb93a386Sopenharmony_ci    // to a draw) is to resolve from the MSAA src to the non-MSAA dst. Currently we only support
991cb93a386Sopenharmony_ci    // resolving the entire texture to a resolve buffer of the same size.
992cb93a386Sopenharmony_ci    DstCopyRestrictions restrictions = {};
993cb93a386Sopenharmony_ci    if (auto rtProxy = src->asRenderTargetProxy()) {
994cb93a386Sopenharmony_ci        if (rtProxy->numSamples() > 1) {
995cb93a386Sopenharmony_ci            restrictions.fMustCopyWholeSrc = true;
996cb93a386Sopenharmony_ci            restrictions.fRectsMustMatch = GrSurfaceProxy::RectsMustMatch::kYes;
997cb93a386Sopenharmony_ci        }
998cb93a386Sopenharmony_ci    }
999cb93a386Sopenharmony_ci    return restrictions;
1000cb93a386Sopenharmony_ci}
1001cb93a386Sopenharmony_ci
1002cb93a386Sopenharmony_cibool GrMtlCaps::onAreColorTypeAndFormatCompatible(GrColorType ct,
1003cb93a386Sopenharmony_ci                                                  const GrBackendFormat& format) const {
1004cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
1005cb93a386Sopenharmony_ci
1006cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(mtlFormat);
1007cb93a386Sopenharmony_ci    for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1008cb93a386Sopenharmony_ci        if (info.fColorTypeInfos[i].fColorType == ct) {
1009cb93a386Sopenharmony_ci            return true;
1010cb93a386Sopenharmony_ci        }
1011cb93a386Sopenharmony_ci    }
1012cb93a386Sopenharmony_ci    return false;
1013cb93a386Sopenharmony_ci}
1014cb93a386Sopenharmony_ci
1015cb93a386Sopenharmony_ciGrBackendFormat GrMtlCaps::onGetDefaultBackendFormat(GrColorType ct) const {
1016cb93a386Sopenharmony_ci    MTLPixelFormat format = this->getFormatFromColorType(ct);
1017cb93a386Sopenharmony_ci    if (!format) {
1018cb93a386Sopenharmony_ci        return {};
1019cb93a386Sopenharmony_ci    }
1020cb93a386Sopenharmony_ci    return GrBackendFormat::MakeMtl(format);
1021cb93a386Sopenharmony_ci}
1022cb93a386Sopenharmony_ci
1023cb93a386Sopenharmony_ciGrBackendFormat GrMtlCaps::getBackendFormatFromCompressionType(
1024cb93a386Sopenharmony_ci        SkImage::CompressionType compressionType) const {
1025cb93a386Sopenharmony_ci    switch (compressionType) {
1026cb93a386Sopenharmony_ci        case SkImage::CompressionType::kNone:
1027cb93a386Sopenharmony_ci            return {};
1028cb93a386Sopenharmony_ci        case SkImage::CompressionType::kETC2_RGB8_UNORM:
1029cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
1030cb93a386Sopenharmony_ci            return {};
1031cb93a386Sopenharmony_ci#else
1032cb93a386Sopenharmony_ci            return GrBackendFormat::MakeMtl(MTLPixelFormatETC2_RGB8);
1033cb93a386Sopenharmony_ci#endif
1034cb93a386Sopenharmony_ci        case SkImage::CompressionType::kBC1_RGB8_UNORM:
1035cb93a386Sopenharmony_ci            // Metal only supports the RGBA BC1 variant (see following)
1036cb93a386Sopenharmony_ci            return {};
1037cb93a386Sopenharmony_ci        case SkImage::CompressionType::kBC1_RGBA8_UNORM:
1038cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
1039cb93a386Sopenharmony_ci            return GrBackendFormat::MakeMtl(MTLPixelFormatBC1_RGBA);
1040cb93a386Sopenharmony_ci#else
1041cb93a386Sopenharmony_ci            return {};
1042cb93a386Sopenharmony_ci#endif
1043cb93a386Sopenharmony_ci
1044cb93a386Sopenharmony_ci    }
1045cb93a386Sopenharmony_ci    SK_ABORT("Invalid compression type");
1046cb93a386Sopenharmony_ci}
1047cb93a386Sopenharmony_ci
1048cb93a386Sopenharmony_ciGrSwizzle GrMtlCaps::onGetReadSwizzle(const GrBackendFormat& format, GrColorType colorType) const {
1049cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
1050cb93a386Sopenharmony_ci    SkASSERT(mtlFormat != MTLPixelFormatInvalid);
1051cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(mtlFormat);
1052cb93a386Sopenharmony_ci    for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1053cb93a386Sopenharmony_ci        const auto& ctInfo = info.fColorTypeInfos[i];
1054cb93a386Sopenharmony_ci        if (ctInfo.fColorType == colorType) {
1055cb93a386Sopenharmony_ci            return ctInfo.fReadSwizzle;
1056cb93a386Sopenharmony_ci        }
1057cb93a386Sopenharmony_ci    }
1058cb93a386Sopenharmony_ci    SkDEBUGFAILF("Illegal color type (%d) and format (%d) combination.", (int)colorType,
1059cb93a386Sopenharmony_ci                 static_cast<int>(mtlFormat));
1060cb93a386Sopenharmony_ci    return {};
1061cb93a386Sopenharmony_ci}
1062cb93a386Sopenharmony_ci
1063cb93a386Sopenharmony_ciGrSwizzle GrMtlCaps::getWriteSwizzle(const GrBackendFormat& format, GrColorType colorType) const {
1064cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
1065cb93a386Sopenharmony_ci    SkASSERT(mtlFormat != MTLPixelFormatInvalid);
1066cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(mtlFormat);
1067cb93a386Sopenharmony_ci    for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1068cb93a386Sopenharmony_ci        const auto& ctInfo = info.fColorTypeInfos[i];
1069cb93a386Sopenharmony_ci        if (ctInfo.fColorType == colorType) {
1070cb93a386Sopenharmony_ci            return ctInfo.fWriteSwizzle;
1071cb93a386Sopenharmony_ci        }
1072cb93a386Sopenharmony_ci    }
1073cb93a386Sopenharmony_ci    SkDEBUGFAILF("Illegal color type (%d) and format (%d) combination.", (int)colorType,
1074cb93a386Sopenharmony_ci                 static_cast<int>(mtlFormat));
1075cb93a386Sopenharmony_ci    return {};
1076cb93a386Sopenharmony_ci}
1077cb93a386Sopenharmony_ci
1078cb93a386Sopenharmony_ciuint64_t GrMtlCaps::computeFormatKey(const GrBackendFormat& format) const {
1079cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
1080cb93a386Sopenharmony_ci    SkASSERT(mtlFormat != MTLPixelFormatInvalid);
1081cb93a386Sopenharmony_ci    // A MTLPixelFormat is an NSUInteger type which is documented to be 32 bits in 32 bit
1082cb93a386Sopenharmony_ci    // applications and 64 bits in 64 bit applications. So it should fit in an uint64_t, but adding
1083cb93a386Sopenharmony_ci    // the assert heere to make sure.
1084cb93a386Sopenharmony_ci    static_assert(sizeof(MTLPixelFormat) <= sizeof(uint64_t));
1085cb93a386Sopenharmony_ci    return (uint64_t)mtlFormat;
1086cb93a386Sopenharmony_ci}
1087cb93a386Sopenharmony_ci
1088cb93a386Sopenharmony_ciGrCaps::SupportedWrite GrMtlCaps::supportedWritePixelsColorType(
1089cb93a386Sopenharmony_ci        GrColorType surfaceColorType, const GrBackendFormat& surfaceFormat,
1090cb93a386Sopenharmony_ci        GrColorType srcColorType) const {
1091cb93a386Sopenharmony_ci    // Metal requires the destination offset for copyFromTexture to be a multiple of the textures
1092cb93a386Sopenharmony_ci    // pixels size.
1093cb93a386Sopenharmony_ci    size_t offsetAlignment = GrColorTypeBytesPerPixel(surfaceColorType);
1094cb93a386Sopenharmony_ci
1095cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(GrBackendFormatAsMTLPixelFormat(surfaceFormat));
1096cb93a386Sopenharmony_ci    for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1097cb93a386Sopenharmony_ci        const auto& ctInfo = info.fColorTypeInfos[i];
1098cb93a386Sopenharmony_ci        if (ctInfo.fColorType == surfaceColorType) {
1099cb93a386Sopenharmony_ci            return {surfaceColorType, offsetAlignment};
1100cb93a386Sopenharmony_ci        }
1101cb93a386Sopenharmony_ci    }
1102cb93a386Sopenharmony_ci    return {GrColorType::kUnknown, 0};
1103cb93a386Sopenharmony_ci}
1104cb93a386Sopenharmony_ci
1105cb93a386Sopenharmony_ciGrCaps::SupportedRead GrMtlCaps::onSupportedReadPixelsColorType(
1106cb93a386Sopenharmony_ci        GrColorType srcColorType, const GrBackendFormat& srcBackendFormat,
1107cb93a386Sopenharmony_ci        GrColorType dstColorType) const {
1108cb93a386Sopenharmony_ci    SkImage::CompressionType compression = GrBackendFormatToCompressionType(srcBackendFormat);
1109cb93a386Sopenharmony_ci    if (compression != SkImage::CompressionType::kNone) {
1110cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
1111cb93a386Sopenharmony_ci        // Reading back to kRGB_888x doesn't work on Metal/iOS (skbug.com/9839)
1112cb93a386Sopenharmony_ci        return { GrColorType::kUnknown, 0 };
1113cb93a386Sopenharmony_ci#else
1114cb93a386Sopenharmony_ci        return { SkCompressionTypeIsOpaque(compression) ? GrColorType::kRGB_888x
1115cb93a386Sopenharmony_ci                                                        : GrColorType::kRGBA_8888, 0 };
1116cb93a386Sopenharmony_ci#endif
1117cb93a386Sopenharmony_ci    }
1118cb93a386Sopenharmony_ci
1119cb93a386Sopenharmony_ci    // Metal requires the destination offset for copyFromTexture to be a multiple of the textures
1120cb93a386Sopenharmony_ci    // pixels size.
1121cb93a386Sopenharmony_ci    size_t offsetAlignment = GrColorTypeBytesPerPixel(srcColorType);
1122cb93a386Sopenharmony_ci    MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(srcBackendFormat);
1123cb93a386Sopenharmony_ci
1124cb93a386Sopenharmony_ci    const auto& info = this->getFormatInfo(mtlFormat);
1125cb93a386Sopenharmony_ci    for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
1126cb93a386Sopenharmony_ci        const auto& ctInfo = info.fColorTypeInfos[i];
1127cb93a386Sopenharmony_ci        if (ctInfo.fColorType == srcColorType) {
1128cb93a386Sopenharmony_ci            return {srcColorType, offsetAlignment};
1129cb93a386Sopenharmony_ci        }
1130cb93a386Sopenharmony_ci    }
1131cb93a386Sopenharmony_ci    return {GrColorType::kUnknown, 0};
1132cb93a386Sopenharmony_ci}
1133cb93a386Sopenharmony_ci
1134cb93a386Sopenharmony_ci/**
1135cb93a386Sopenharmony_ci * For Metal we want to cache the entire pipeline for reuse of draws. The Desc here holds all
1136cb93a386Sopenharmony_ci * the information needed to differentiate one pipeline from another.
1137cb93a386Sopenharmony_ci *
1138cb93a386Sopenharmony_ci * The GrProgramDesc contains all the information need to create the actual shaders for the
1139cb93a386Sopenharmony_ci * pipeline.
1140cb93a386Sopenharmony_ci *
1141cb93a386Sopenharmony_ci * For Metal we need to add to the GrProgramDesc to include the rest of the state on the
1142cb93a386Sopenharmony_ci * pipeline. This includes blending information and primitive type. The pipeline is immutable
1143cb93a386Sopenharmony_ci * so any remaining dynamic state is set via the MtlRenderCmdEncoder.
1144cb93a386Sopenharmony_ci */
1145cb93a386Sopenharmony_ciGrProgramDesc GrMtlCaps::makeDesc(GrRenderTarget*, const GrProgramInfo& programInfo,
1146cb93a386Sopenharmony_ci                                  ProgramDescOverrideFlags overrideFlags) const {
1147cb93a386Sopenharmony_ci    SkASSERT(overrideFlags == ProgramDescOverrideFlags::kNone);
1148cb93a386Sopenharmony_ci    GrProgramDesc desc;
1149cb93a386Sopenharmony_ci    GrProgramDesc::Build(&desc, programInfo, *this);
1150cb93a386Sopenharmony_ci
1151cb93a386Sopenharmony_ci    GrProcessorKeyBuilder b(desc.key());
1152cb93a386Sopenharmony_ci
1153cb93a386Sopenharmony_ci    // If ordering here is changed, update getStencilPixelFormat() below
1154cb93a386Sopenharmony_ci    b.add32(programInfo.backendFormat().asMtlFormat());
1155cb93a386Sopenharmony_ci
1156cb93a386Sopenharmony_ci    b.add32(programInfo.numSamples());
1157cb93a386Sopenharmony_ci
1158cb93a386Sopenharmony_ci    b.add32(programInfo.needsStencil() ? this->preferredStencilFormat() : MTLPixelFormatInvalid);
1159cb93a386Sopenharmony_ci    b.add32((uint32_t)programInfo.isStencilEnabled());
1160cb93a386Sopenharmony_ci    // Stencil samples don't seem to be tracked in the MTLRenderPipeline
1161cb93a386Sopenharmony_ci
1162cb93a386Sopenharmony_ci    programInfo.pipeline().genKey(&b, *this);
1163cb93a386Sopenharmony_ci
1164cb93a386Sopenharmony_ci    b.add32(programInfo.primitiveTypeKey());
1165cb93a386Sopenharmony_ci
1166cb93a386Sopenharmony_ci    b.flush();
1167cb93a386Sopenharmony_ci    return desc;
1168cb93a386Sopenharmony_ci}
1169cb93a386Sopenharmony_ci
1170cb93a386Sopenharmony_ciMTLPixelFormat GrMtlCaps::getStencilPixelFormat(const GrProgramDesc& desc) {
1171cb93a386Sopenharmony_ci    // Set up read buffer to point to platform-dependent part of the key
1172cb93a386Sopenharmony_ci    SkReadBuffer readBuffer(desc.asKey() + desc.initialKeyLength()/sizeof(uint32_t),
1173cb93a386Sopenharmony_ci                            desc.keyLength() - desc.initialKeyLength());
1174cb93a386Sopenharmony_ci    // skip backend format
1175cb93a386Sopenharmony_ci    readBuffer.readUInt();
1176cb93a386Sopenharmony_ci    // skip raster samples
1177cb93a386Sopenharmony_ci    readBuffer.readUInt();
1178cb93a386Sopenharmony_ci
1179cb93a386Sopenharmony_ci    return (MTLPixelFormat) readBuffer.readUInt();
1180cb93a386Sopenharmony_ci}
1181cb93a386Sopenharmony_ci
1182cb93a386Sopenharmony_cibool GrMtlCaps::renderTargetSupportsDiscardableMSAA(const GrMtlRenderTarget* rt) const {
1183cb93a386Sopenharmony_ci    return rt->resolveAttachment() &&
1184cb93a386Sopenharmony_ci           !rt->resolveAttachment()->framebufferOnly() &&
1185cb93a386Sopenharmony_ci           (rt->numSamples() > 1 && this->preferDiscardableMSAAAttachment());
1186cb93a386Sopenharmony_ci}
1187cb93a386Sopenharmony_ci
1188cb93a386Sopenharmony_ci#if GR_TEST_UTILS
1189cb93a386Sopenharmony_cistd::vector<GrCaps::TestFormatColorTypeCombination> GrMtlCaps::getTestingCombinations() const {
1190cb93a386Sopenharmony_ci    std::vector<GrCaps::TestFormatColorTypeCombination> combos = {
1191cb93a386Sopenharmony_ci        { GrColorType::kAlpha_8,          GrBackendFormat::MakeMtl(MTLPixelFormatA8Unorm)         },
1192cb93a386Sopenharmony_ci        { GrColorType::kAlpha_8,          GrBackendFormat::MakeMtl(MTLPixelFormatR8Unorm)         },
1193cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_IOS) && !TARGET_OS_SIMULATOR
1194cb93a386Sopenharmony_ci        { GrColorType::kBGR_565,          GrBackendFormat::MakeMtl(MTLPixelFormatB5G6R5Unorm)     },
1195cb93a386Sopenharmony_ci        { GrColorType::kABGR_4444,        GrBackendFormat::MakeMtl(MTLPixelFormatABGR4Unorm)      },
1196cb93a386Sopenharmony_ci#endif
1197cb93a386Sopenharmony_ci        { GrColorType::kRGBA_8888,        GrBackendFormat::MakeMtl(MTLPixelFormatRGBA8Unorm)      },
1198cb93a386Sopenharmony_ci        { GrColorType::kRGBA_8888_SRGB,   GrBackendFormat::MakeMtl(MTLPixelFormatRGBA8Unorm_sRGB) },
1199cb93a386Sopenharmony_ci        { GrColorType::kRGB_888x,         GrBackendFormat::MakeMtl(MTLPixelFormatRGBA8Unorm)      },
1200cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_IOS
1201cb93a386Sopenharmony_ci        { GrColorType::kRGB_888x,         GrBackendFormat::MakeMtl(MTLPixelFormatETC2_RGB8)       },
1202cb93a386Sopenharmony_ci#else
1203cb93a386Sopenharmony_ci        { GrColorType::kRGBA_8888,        GrBackendFormat::MakeMtl(MTLPixelFormatBC1_RGBA)        },
1204cb93a386Sopenharmony_ci#endif
1205cb93a386Sopenharmony_ci        { GrColorType::kRG_88,            GrBackendFormat::MakeMtl(MTLPixelFormatRG8Unorm)        },
1206cb93a386Sopenharmony_ci        { GrColorType::kBGRA_8888,        GrBackendFormat::MakeMtl(MTLPixelFormatBGRA8Unorm)      },
1207cb93a386Sopenharmony_ci        { GrColorType::kRGBA_1010102,     GrBackendFormat::MakeMtl(MTLPixelFormatRGB10A2Unorm)    },
1208cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_MAC
1209cb93a386Sopenharmony_ci        { GrColorType::kBGRA_1010102,     GrBackendFormat::MakeMtl(kMTLPixelFormatBGR10A2Unorm)   },
1210cb93a386Sopenharmony_ci#endif
1211cb93a386Sopenharmony_ci        { GrColorType::kGray_8,           GrBackendFormat::MakeMtl(MTLPixelFormatR8Unorm)         },
1212cb93a386Sopenharmony_ci        { GrColorType::kAlpha_F16,        GrBackendFormat::MakeMtl(MTLPixelFormatR16Float)        },
1213cb93a386Sopenharmony_ci        { GrColorType::kRGBA_F16,         GrBackendFormat::MakeMtl(MTLPixelFormatRGBA16Float)     },
1214cb93a386Sopenharmony_ci        { GrColorType::kRGBA_F16_Clamped, GrBackendFormat::MakeMtl(MTLPixelFormatRGBA16Float)     },
1215cb93a386Sopenharmony_ci        { GrColorType::kAlpha_16,         GrBackendFormat::MakeMtl(MTLPixelFormatR16Unorm)        },
1216cb93a386Sopenharmony_ci        { GrColorType::kRG_1616,          GrBackendFormat::MakeMtl(MTLPixelFormatRG16Unorm)       },
1217cb93a386Sopenharmony_ci        { GrColorType::kRGBA_16161616,    GrBackendFormat::MakeMtl(MTLPixelFormatRGBA16Unorm)     },
1218cb93a386Sopenharmony_ci        { GrColorType::kRG_F16,           GrBackendFormat::MakeMtl(MTLPixelFormatRG16Float)       },
1219cb93a386Sopenharmony_ci    };
1220cb93a386Sopenharmony_ci
1221cb93a386Sopenharmony_ci    return combos;
1222cb93a386Sopenharmony_ci}
1223cb93a386Sopenharmony_ci#endif
1224cb93a386Sopenharmony_ci
1225cb93a386Sopenharmony_ci#ifdef SK_ENABLE_DUMP_GPU
1226cb93a386Sopenharmony_ci#include "src/utils/SkJSONWriter.h"
1227cb93a386Sopenharmony_civoid GrMtlCaps::onDumpJSON(SkJSONWriter* writer) const {
1228cb93a386Sopenharmony_ci
1229cb93a386Sopenharmony_ci    // We are called by the base class, which has already called beginObject(). We choose to nest
1230cb93a386Sopenharmony_ci    // all of our caps information in a named sub-object.
1231cb93a386Sopenharmony_ci    writer->beginObject("Metal caps");
1232cb93a386Sopenharmony_ci
1233cb93a386Sopenharmony_ci    writer->beginObject("Preferred Stencil Format");
1234cb93a386Sopenharmony_ci    writer->appendS32("stencil bits", GrMtlFormatStencilBits(fPreferredStencilFormat));
1235cb93a386Sopenharmony_ci    writer->appendS32("total bytes", GrMtlFormatBytesPerBlock(fPreferredStencilFormat));
1236cb93a386Sopenharmony_ci    writer->endObject();
1237cb93a386Sopenharmony_ci
1238cb93a386Sopenharmony_ci    switch (fGPUFamily) {
1239cb93a386Sopenharmony_ci        case GPUFamily::kMac:
1240cb93a386Sopenharmony_ci            writer->appendString("GPU Family", "Mac");
1241cb93a386Sopenharmony_ci            break;
1242cb93a386Sopenharmony_ci        case GPUFamily::kApple:
1243cb93a386Sopenharmony_ci            writer->appendString("GPU Family", "Apple");
1244cb93a386Sopenharmony_ci            break;
1245cb93a386Sopenharmony_ci        default:
1246cb93a386Sopenharmony_ci            writer->appendString("GPU Family", "unknown");
1247cb93a386Sopenharmony_ci            break;
1248cb93a386Sopenharmony_ci    }
1249cb93a386Sopenharmony_ci    writer->appendS32("Family Group", fFamilyGroup);
1250cb93a386Sopenharmony_ci
1251cb93a386Sopenharmony_ci    writer->beginArray("Sample Counts");
1252cb93a386Sopenharmony_ci    for (int v : fSampleCounts) {
1253cb93a386Sopenharmony_ci        writer->appendS32(nullptr, v);
1254cb93a386Sopenharmony_ci    }
1255cb93a386Sopenharmony_ci    writer->endArray();
1256cb93a386Sopenharmony_ci
1257cb93a386Sopenharmony_ci    writer->endObject();
1258cb93a386Sopenharmony_ci}
1259cb93a386Sopenharmony_ci#else
1260cb93a386Sopenharmony_civoid GrMtlCaps::onDumpJSON(SkJSONWriter* writer) const { }
1261cb93a386Sopenharmony_ci#endif
1262cb93a386Sopenharmony_ci
1263cb93a386Sopenharmony_ciGR_NORETAIN_END
1264