1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 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 "experimental/graphite/src/mtl/MtlUtils.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/src/mtl/MtlGpu.h" 11cb93a386Sopenharmony_ci#include "include/private/SkSLString.h" 12cb93a386Sopenharmony_ci#include "src/core/SkTraceEvent.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_cinamespace skgpu::mtl { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cibool FormatIsDepthOrStencil(MTLPixelFormat format) { 17cb93a386Sopenharmony_ci switch (format) { 18cb93a386Sopenharmony_ci case MTLPixelFormatStencil8: // fallthrough 19cb93a386Sopenharmony_ci case MTLPixelFormatDepth32Float_Stencil8: 20cb93a386Sopenharmony_ci return true; 21cb93a386Sopenharmony_ci default: 22cb93a386Sopenharmony_ci return false; 23cb93a386Sopenharmony_ci } 24cb93a386Sopenharmony_ci} 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciMTLPixelFormat SkColorTypeToFormat(SkColorType colorType) { 27cb93a386Sopenharmony_ci switch (colorType) { 28cb93a386Sopenharmony_ci case kRGBA_8888_SkColorType: 29cb93a386Sopenharmony_ci return MTLPixelFormatRGBA8Unorm; 30cb93a386Sopenharmony_ci case kAlpha_8_SkColorType: 31cb93a386Sopenharmony_ci return MTLPixelFormatR8Unorm; 32cb93a386Sopenharmony_ci case kRGBA_F16_SkColorType: 33cb93a386Sopenharmony_ci return MTLPixelFormatRGBA16Float; 34cb93a386Sopenharmony_ci default: 35cb93a386Sopenharmony_ci // TODO: fill in the rest of the formats 36cb93a386Sopenharmony_ci SkUNREACHABLE; 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci} 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ciMTLPixelFormat DepthStencilTypeToFormat(DepthStencilType type) { 41cb93a386Sopenharmony_ci // TODO: Decide if we want to change this to always return a combined depth and stencil format 42cb93a386Sopenharmony_ci // to allow more sharing of depth stencil allocations. 43cb93a386Sopenharmony_ci switch (type) { 44cb93a386Sopenharmony_ci case DepthStencilType::kDepthOnly: 45cb93a386Sopenharmony_ci // MTLPixelFormatDepth16Unorm is also a universally supported option here 46cb93a386Sopenharmony_ci return MTLPixelFormatDepth32Float; 47cb93a386Sopenharmony_ci case DepthStencilType::kStencilOnly: 48cb93a386Sopenharmony_ci return MTLPixelFormatStencil8; 49cb93a386Sopenharmony_ci case DepthStencilType::kDepthStencil: 50cb93a386Sopenharmony_ci // MTLPixelFormatDepth24Unorm_Stencil8 is supported on Mac family GPUs. 51cb93a386Sopenharmony_ci return MTLPixelFormatDepth32Float_Stencil8; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci} 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_cisk_cfp<id<MTLLibrary>> CompileShaderLibrary(const Gpu* gpu, 56cb93a386Sopenharmony_ci const SkSL::String& msl) { 57cb93a386Sopenharmony_ci TRACE_EVENT0("skia.shaders", "driver_compile_shader"); 58cb93a386Sopenharmony_ci auto nsSource = [[NSString alloc] initWithBytesNoCopy:const_cast<char*>(msl.c_str()) 59cb93a386Sopenharmony_ci length:msl.size() 60cb93a386Sopenharmony_ci encoding:NSUTF8StringEncoding 61cb93a386Sopenharmony_ci freeWhenDone:NO]; 62cb93a386Sopenharmony_ci MTLCompileOptions* options = [[MTLCompileOptions alloc] init]; 63cb93a386Sopenharmony_ci // array<> is supported in MSL 2.0 on MacOS 10.13+ and iOS 11+, 64cb93a386Sopenharmony_ci // and in MSL 1.2 on iOS 10+ (but not MacOS). 65cb93a386Sopenharmony_ci if (@available(macOS 10.13, iOS 11.0, *)) { 66cb93a386Sopenharmony_ci options.languageVersion = MTLLanguageVersion2_0; 67cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_IOS) 68cb93a386Sopenharmony_ci } else if (@available(macOS 10.12, iOS 10.0, *)) { 69cb93a386Sopenharmony_ci options.languageVersion = MTLLanguageVersion1_2; 70cb93a386Sopenharmony_ci#endif 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci NSError* error = nil; 74cb93a386Sopenharmony_ci // TODO: do we need a version with a timeout? 75cb93a386Sopenharmony_ci sk_cfp<id<MTLLibrary>> compiledLibrary([gpu->device() newLibraryWithSource:nsSource 76cb93a386Sopenharmony_ci options:options 77cb93a386Sopenharmony_ci error:&error]); 78cb93a386Sopenharmony_ci if (!compiledLibrary) { 79cb93a386Sopenharmony_ci SkDebugf("Shader compilation error\n" 80cb93a386Sopenharmony_ci "------------------------\n"); 81cb93a386Sopenharmony_ci SkDebugf("%s", msl.c_str()); 82cb93a386Sopenharmony_ci SkDebugf("Errors:\n%s", error.debugDescription.UTF8String); 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci return nil; 85cb93a386Sopenharmony_ci } 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci return compiledLibrary; 88cb93a386Sopenharmony_ci} 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci} // namespace skgpu::mtl 91