blob: 15e7f624a83fb23f0822035e3c2144829901b1b3 [file] [log] [blame]
/*
* 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