1/* 2 * Copyright 2021 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "src/gpu/mtl/MtlUtilsPriv.h" 9 10#include "include/gpu/ShaderErrorHandler.h" 11#include "src/core/SkImageInfoPriv.h" 12#include "src/sksl/SkSLCompiler.h" 13#include "src/sksl/SkSLProgramSettings.h" 14#include "src/utils/SkShaderUtils.h" 15 16namespace skgpu { 17 18bool MtlFormatIsDepthOrStencil(MTLPixelFormat format) { 19 switch (format) { 20 case MTLPixelFormatStencil8: [[fallthrough]]; 21 case MTLPixelFormatDepth16Unorm: 22 case MTLPixelFormatDepth32Float: 23#if defined(SK_BUILD_FOR_MAC) 24 case MTLPixelFormatDepth24Unorm_Stencil8: 25#endif 26 case MTLPixelFormatDepth32Float_Stencil8: 27 return true; 28 default: 29 return false; 30 } 31 32 SkUNREACHABLE; 33} 34 35bool MtlFormatIsDepth(MTLPixelFormat format) { 36 switch (format) { 37 case MTLPixelFormatDepth16Unorm: [[fallthrough]]; 38 case MTLPixelFormatDepth32Float: 39#if defined(SK_BUILD_FOR_MAC) 40 case MTLPixelFormatDepth24Unorm_Stencil8: 41#endif 42 case MTLPixelFormatDepth32Float_Stencil8: 43 return true; 44 default: 45 return false; 46 } 47 48 SkUNREACHABLE; 49} 50 51bool MtlFormatIsStencil(MTLPixelFormat format) { 52 switch (format) { 53 case MTLPixelFormatStencil8: [[fallthrough]]; 54#if defined(SK_BUILD_FOR_MAC) 55 case MTLPixelFormatDepth24Unorm_Stencil8: 56#endif 57 case MTLPixelFormatDepth32Float_Stencil8: 58 return true; 59 default: 60 return false; 61 } 62 63 SkUNREACHABLE; 64} 65 66bool MtlFormatIsCompressed(MTLPixelFormat mtlFormat) { 67 switch (mtlFormat) { 68 case MTLPixelFormatETC2_RGB8: 69 return true; 70#ifdef SK_BUILD_FOR_MAC 71 case MTLPixelFormatBC1_RGBA: 72 return true; 73#endif 74 default: 75 return false; 76 } 77 78 SkUNREACHABLE; 79} 80 81const char* MtlFormatToString(MTLPixelFormat mtlFormat) { 82 switch (mtlFormat) { 83 case MTLPixelFormatInvalid: return "Invalid"; 84 case MTLPixelFormatRGBA8Unorm: return "RGBA8Unorm"; 85 case MTLPixelFormatR8Unorm: return "R8Unorm"; 86 case MTLPixelFormatA8Unorm: return "A8Unorm"; 87 case MTLPixelFormatBGRA8Unorm: return "BGRA8Unorm"; 88 case MTLPixelFormatB5G6R5Unorm: return "B5G6R5Unorm"; 89 case MTLPixelFormatRGBA16Float: return "RGBA16Float"; 90 case MTLPixelFormatR16Float: return "R16Float"; 91 case MTLPixelFormatRG8Unorm: return "RG8Unorm"; 92 case MTLPixelFormatRGB10A2Unorm: return "RGB10A2Unorm"; 93 case MTLPixelFormatBGR10A2Unorm: return "BGR10A2Unorm"; 94 case MTLPixelFormatABGR4Unorm: return "ABGR4Unorm"; 95 case MTLPixelFormatRGBA8Unorm_sRGB: return "RGBA8Unorm_sRGB"; 96 case MTLPixelFormatR16Unorm: return "R16Unorm"; 97 case MTLPixelFormatRG16Unorm: return "RG16Unorm"; 98 case MTLPixelFormatETC2_RGB8: return "ETC2_RGB8"; 99#ifdef SK_BUILD_FOR_MAC 100 case MTLPixelFormatBC1_RGBA: return "BC1_RGBA"; 101#endif 102 case MTLPixelFormatRGBA16Unorm: return "RGBA16Unorm"; 103 case MTLPixelFormatRG16Float: return "RG16Float"; 104 case MTLPixelFormatStencil8: return "Stencil8"; 105 106 default: return "Unknown"; 107 } 108 109 SkUNREACHABLE; 110} 111 112uint32_t MtlFormatChannels(MTLPixelFormat mtlFormat) { 113 switch (mtlFormat) { 114 case MTLPixelFormatRGBA8Unorm: return kRGBA_SkColorChannelFlags; 115 case MTLPixelFormatR8Unorm: return kRed_SkColorChannelFlag; 116 case MTLPixelFormatA8Unorm: return kAlpha_SkColorChannelFlag; 117 case MTLPixelFormatBGRA8Unorm: return kRGBA_SkColorChannelFlags; 118 case MTLPixelFormatB5G6R5Unorm: return kRGB_SkColorChannelFlags; 119 case MTLPixelFormatRGBA16Float: return kRGBA_SkColorChannelFlags; 120 case MTLPixelFormatR16Float: return kRed_SkColorChannelFlag; 121 case MTLPixelFormatRG8Unorm: return kRG_SkColorChannelFlags; 122 case MTLPixelFormatRGB10A2Unorm: return kRGBA_SkColorChannelFlags; 123 case MTLPixelFormatBGR10A2Unorm: return kRGBA_SkColorChannelFlags; 124 case MTLPixelFormatABGR4Unorm: return kRGBA_SkColorChannelFlags; 125 case MTLPixelFormatRGBA8Unorm_sRGB: return kRGBA_SkColorChannelFlags; 126 case MTLPixelFormatR16Unorm: return kRed_SkColorChannelFlag; 127 case MTLPixelFormatRG16Unorm: return kRG_SkColorChannelFlags; 128 case MTLPixelFormatETC2_RGB8: return kRGB_SkColorChannelFlags; 129#ifdef SK_BUILD_FOR_MAC 130 case MTLPixelFormatBC1_RGBA: return kRGBA_SkColorChannelFlags; 131#endif 132 case MTLPixelFormatRGBA16Unorm: return kRGBA_SkColorChannelFlags; 133 case MTLPixelFormatRG16Float: return kRG_SkColorChannelFlags; 134 case MTLPixelFormatStencil8: return 0; 135 136 default: return 0; 137 } 138 139 SkUNREACHABLE; 140} 141 142size_t MtlFormatBytesPerBlock(MTLPixelFormat mtlFormat) { 143 switch (mtlFormat) { 144 case MTLPixelFormatInvalid: return 0; 145 case MTLPixelFormatRGBA8Unorm: return 4; 146 case MTLPixelFormatR8Unorm: return 1; 147 case MTLPixelFormatA8Unorm: return 1; 148 case MTLPixelFormatBGRA8Unorm: return 4; 149 case MTLPixelFormatB5G6R5Unorm: return 2; 150 case MTLPixelFormatRGBA16Float: return 8; 151 case MTLPixelFormatR16Float: return 2; 152 case MTLPixelFormatRG8Unorm: return 2; 153 case MTLPixelFormatRGB10A2Unorm: return 4; 154 case MTLPixelFormatBGR10A2Unorm: return 4; 155 case MTLPixelFormatABGR4Unorm: return 2; 156 case MTLPixelFormatRGBA8Unorm_sRGB: return 4; 157 case MTLPixelFormatR16Unorm: return 2; 158 case MTLPixelFormatRG16Unorm: return 4; 159 case MTLPixelFormatETC2_RGB8: return 8; 160#ifdef SK_BUILD_FOR_MAC 161 case MTLPixelFormatBC1_RGBA: return 8; 162#endif 163 case MTLPixelFormatRGBA16Unorm: return 8; 164 case MTLPixelFormatRG16Float: return 4; 165 case MTLPixelFormatStencil8: return 1; 166 167 default: return 0; 168 } 169 170 SkUNREACHABLE; 171} 172 173SkTextureCompressionType MtlFormatToCompressionType(MTLPixelFormat mtlFormat) { 174 switch (mtlFormat) { 175 case MTLPixelFormatETC2_RGB8: return SkTextureCompressionType::kETC2_RGB8_UNORM; 176#ifdef SK_BUILD_FOR_MAC 177 case MTLPixelFormatBC1_RGBA: return SkTextureCompressionType::kBC1_RGBA8_UNORM; 178#endif 179 default: return SkTextureCompressionType::kNone; 180 } 181 182 SkUNREACHABLE; 183} 184 185} // namespace skgpu 186