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