| /* |
| * Copyright 2021 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "src/gpu/mtl/MtlUtilsPriv.h" |
| |
| #include "include/gpu/ShaderErrorHandler.h" |
| #include "src/core/SkImageInfoPriv.h" |
| #include "src/sksl/SkSLCompiler.h" |
| #include "src/sksl/SkSLProgramSettings.h" |
| #include "src/utils/SkShaderUtils.h" |
| |
| namespace skgpu { |
| |
| bool MtlFormatIsDepthOrStencil(MTLPixelFormat format) { |
| switch (format) { |
| case MTLPixelFormatStencil8: // fallthrough |
| case MTLPixelFormatDepth16Unorm: |
| case MTLPixelFormatDepth32Float: |
| #if defined(SK_BUILD_FOR_MAC) |
| case MTLPixelFormatDepth24Unorm_Stencil8: |
| #endif |
| case MTLPixelFormatDepth32Float_Stencil8: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool MtlFormatIsDepth(MTLPixelFormat format) { |
| switch (format) { |
| case MTLPixelFormatDepth16Unorm: |
| case MTLPixelFormatDepth32Float: |
| #if defined(SK_BUILD_FOR_MAC) |
| case MTLPixelFormatDepth24Unorm_Stencil8: |
| #endif |
| case MTLPixelFormatDepth32Float_Stencil8: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool MtlFormatIsStencil(MTLPixelFormat format) { |
| switch (format) { |
| case MTLPixelFormatStencil8: // fallthrough |
| #if defined(SK_BUILD_FOR_MAC) |
| case MTLPixelFormatDepth24Unorm_Stencil8: |
| #endif |
| case MTLPixelFormatDepth32Float_Stencil8: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool MtlFormatIsCompressed(MTLPixelFormat mtlFormat) { |
| switch (mtlFormat) { |
| case MTLPixelFormatETC2_RGB8: |
| return true; |
| #ifdef SK_BUILD_FOR_MAC |
| case MTLPixelFormatBC1_RGBA: |
| return true; |
| #endif |
| default: |
| return false; |
| } |
| } |
| |
| const char* MtlFormatToString(MTLPixelFormat mtlFormat) { |
| switch (mtlFormat) { |
| case MTLPixelFormatInvalid: return "Invalid"; |
| case MTLPixelFormatRGBA8Unorm: return "RGBA8Unorm"; |
| case MTLPixelFormatR8Unorm: return "R8Unorm"; |
| case MTLPixelFormatA8Unorm: return "A8Unorm"; |
| case MTLPixelFormatBGRA8Unorm: return "BGRA8Unorm"; |
| case MTLPixelFormatB5G6R5Unorm: return "B5G6R5Unorm"; |
| case MTLPixelFormatRGBA16Float: return "RGBA16Float"; |
| case MTLPixelFormatR16Float: return "R16Float"; |
| case MTLPixelFormatRG8Unorm: return "RG8Unorm"; |
| case MTLPixelFormatRGB10A2Unorm: return "RGB10A2Unorm"; |
| case MTLPixelFormatBGR10A2Unorm: return "BGR10A2Unorm"; |
| case MTLPixelFormatABGR4Unorm: return "ABGR4Unorm"; |
| case MTLPixelFormatRGBA8Unorm_sRGB: return "RGBA8Unorm_sRGB"; |
| case MTLPixelFormatR16Unorm: return "R16Unorm"; |
| case MTLPixelFormatRG16Unorm: return "RG16Unorm"; |
| case MTLPixelFormatETC2_RGB8: return "ETC2_RGB8"; |
| #ifdef SK_BUILD_FOR_MAC |
| case MTLPixelFormatBC1_RGBA: return "BC1_RGBA"; |
| #endif |
| case MTLPixelFormatRGBA16Unorm: return "RGBA16Unorm"; |
| case MTLPixelFormatRG16Float: return "RG16Float"; |
| case MTLPixelFormatStencil8: return "Stencil8"; |
| |
| default: return "Unknown"; |
| } |
| } |
| |
| uint32_t MtlFormatChannels(MTLPixelFormat mtlFormat) { |
| switch (mtlFormat) { |
| case MTLPixelFormatRGBA8Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatR8Unorm: return kRed_SkColorChannelFlag; |
| case MTLPixelFormatA8Unorm: return kAlpha_SkColorChannelFlag; |
| case MTLPixelFormatBGRA8Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatB5G6R5Unorm: return kRGB_SkColorChannelFlags; |
| case MTLPixelFormatRGBA16Float: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatR16Float: return kRed_SkColorChannelFlag; |
| case MTLPixelFormatRG8Unorm: return kRG_SkColorChannelFlags; |
| case MTLPixelFormatRGB10A2Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatBGR10A2Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatABGR4Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatRGBA8Unorm_sRGB: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatR16Unorm: return kRed_SkColorChannelFlag; |
| case MTLPixelFormatRG16Unorm: return kRG_SkColorChannelFlags; |
| case MTLPixelFormatETC2_RGB8: return kRGB_SkColorChannelFlags; |
| #ifdef SK_BUILD_FOR_MAC |
| case MTLPixelFormatBC1_RGBA: return kRGBA_SkColorChannelFlags; |
| #endif |
| case MTLPixelFormatRGBA16Unorm: return kRGBA_SkColorChannelFlags; |
| case MTLPixelFormatRG16Float: return kRG_SkColorChannelFlags; |
| case MTLPixelFormatStencil8: return 0; |
| |
| default: return 0; |
| } |
| } |
| |
| size_t MtlFormatBytesPerBlock(MTLPixelFormat mtlFormat) { |
| switch (mtlFormat) { |
| case MTLPixelFormatInvalid: return 0; |
| case MTLPixelFormatRGBA8Unorm: return 4; |
| case MTLPixelFormatR8Unorm: return 1; |
| case MTLPixelFormatA8Unorm: return 1; |
| case MTLPixelFormatBGRA8Unorm: return 4; |
| case MTLPixelFormatB5G6R5Unorm: return 2; |
| case MTLPixelFormatRGBA16Float: return 8; |
| case MTLPixelFormatR16Float: return 2; |
| case MTLPixelFormatRG8Unorm: return 2; |
| case MTLPixelFormatRGB10A2Unorm: return 4; |
| case MTLPixelFormatBGR10A2Unorm: return 4; |
| case MTLPixelFormatABGR4Unorm: return 2; |
| case MTLPixelFormatRGBA8Unorm_sRGB: return 4; |
| case MTLPixelFormatR16Unorm: return 2; |
| case MTLPixelFormatRG16Unorm: return 4; |
| case MTLPixelFormatETC2_RGB8: return 8; |
| #ifdef SK_BUILD_FOR_MAC |
| case MTLPixelFormatBC1_RGBA: return 8; |
| #endif |
| case MTLPixelFormatRGBA16Unorm: return 8; |
| case MTLPixelFormatRG16Float: return 4; |
| case MTLPixelFormatStencil8: return 1; |
| |
| default: return 0; |
| } |
| } |
| |
| SkTextureCompressionType MtlFormatToCompressionType(MTLPixelFormat mtlFormat) { |
| switch (mtlFormat) { |
| case MTLPixelFormatETC2_RGB8: return SkTextureCompressionType::kETC2_RGB8_UNORM; |
| #ifdef SK_BUILD_FOR_MAC |
| case MTLPixelFormatBC1_RGBA: return SkTextureCompressionType::kBC1_RGBA8_UNORM; |
| #endif |
| default: return SkTextureCompressionType::kNone; |
| } |
| } |
| |
| } // namespace skgpu |