| /* |
| * Copyright 2021 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef skgpu_graphite_MtlGraphiteTypesPriv_DEFINED |
| #define skgpu_graphite_MtlGraphiteTypesPriv_DEFINED |
| |
| #include "include/core/SkString.h" |
| #include "include/ports/SkCFObject.h" |
| #include "src/base/SkEnumBitMask.h" |
| |
| class SkStream; |
| class SkWStream; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #include <TargetConditionals.h> |
| |
| // We're using the MSL version as shorthand for the Metal SDK version here |
| #if defined(SK_BUILD_FOR_MAC) |
| #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 300 |
| #elif __MAC_OS_X_VERSION_MAX_ALLOWED >= 120000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 240 |
| #elif __MAC_OS_X_VERSION_MAX_ALLOWED >= 110000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 230 |
| #else |
| #error Must use at least 11.00 SDK to build Metal backend for MacOS |
| #endif |
| #else |
| #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 160000 || __TV_OS_VERSION_MAX_ALLOWED >= 160000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 300 |
| #elif __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000 || __TV_OS_VERSION_MAX_ALLOWED >= 150000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 240 |
| #elif __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000 || __TV_OS_VERSION_MAX_ALLOWED >= 140000 |
| #define SKGPU_GRAPHITE_METAL_SDK_VERSION 230 |
| #else |
| #error Must use at least 14.00 SDK to build Metal backend for iOS |
| #endif |
| #endif |
| |
| #import <Metal/Metal.h> |
| |
| namespace skgpu { |
| class ShaderErrorHandler; |
| } |
| |
| namespace skgpu::graphite { |
| |
| class MtlSharedContext; |
| enum class TextureFormat : uint8_t; |
| |
| sk_cfp<id<MTLLibrary>> MtlCompileShaderLibrary(const MtlSharedContext* sharedContext, |
| std::string_view label, |
| std::string_view msl, |
| ShaderErrorHandler* errorHandler); |
| |
| TextureFormat MTLPixelFormatToTextureFormat(MTLPixelFormat); |
| MTLPixelFormat TextureFormatToMTLPixelFormat(TextureFormat); |
| |
| // Reproduction of "Texture capabalities by pixel format" from |
| // https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf |
| // NOTE: All graphics and compute kernels can read or sample a texture with any pixel format. |
| // This intentionally does not follow Skia's normal naming convention in order to better match |
| // the format table from the document. |
| enum class MTLFeatureFlag : uint8_t { |
| NotAvailable = 0x0, // Not available. |
| Atomic = 0x1, // The GPU can use atomic operations on textures with the pixel format. |
| Filter = 0x2, // The GPU can filter a texture with the pixel format during sampling. |
| Write = 0x4, // The GPU can write to a texture on a per-pixel basis with the format. |
| Color = 0x8, // The GPU can use a texture with the format as a color render target. |
| Blend = 0x10, // The GPU can blend a texture with the pixel format. |
| MSAA = 0x20, // The GPU can use a texture with the pixel format as a destination for |
| // multisample antialias (MSAA) data. |
| Sparse = 0x40, // The GPU supports sparse-texture allocations for textures in this format |
| Resolve = 0x80, // The GPU can use a texture with the pixel format as a source for |
| // multisample antialias (MSAA) resolve operations. |
| |
| // Sparse isn’t included in All since the Mac2, Metal3, and Apple2 through Apple5 family GPUs, |
| // don’t support the sparse texture feature. Apple6+ references to All in the table implicitly |
| // include Sparse. |
| // ERRATA: The PDF claims Apple6 does not support Sparse, but the column for Apple6 adds Sparse |
| // to rows that weren't already listed as "All", and |
| // https://developer.apple.com/documentation/metal/managing-sparse-texture-memory |
| // suggests Apple6 is when sparse texture support was added. |
| All = Filter | Write | Color | Blend | MSAA | Resolve, |
| }; |
| SK_MAKE_BITMASK_OPS(MTLFeatureFlag) |
| |
| // This returns the static features for a format and given GPU family. It does not apply any |
| // MTLDevice-specific checks required for some formats. |
| SkEnumBitMask<MTLFeatureFlag> MTLPixelFormatSupport(MTLGPUFamily, MTLPixelFormat); |
| |
| } // namespace skgpu::graphite |
| |
| #endif // skgpu_graphite_MtlGraphiteTypesPriv_DEFINED |