• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
33bool MtlFormatIsDepth(MTLPixelFormat format) {
34    switch (format) {
35        case MTLPixelFormatDepth16Unorm:
36        case MTLPixelFormatDepth32Float:
37#if defined(SK_BUILD_FOR_MAC)
38        case MTLPixelFormatDepth24Unorm_Stencil8:
39#endif
40        case MTLPixelFormatDepth32Float_Stencil8:
41            return true;
42        default:
43            return false;
44    }
45}
46
47bool MtlFormatIsStencil(MTLPixelFormat format) {
48    switch (format) {
49        case MTLPixelFormatStencil8: // fallthrough
50#if defined(SK_BUILD_FOR_MAC)
51        case MTLPixelFormatDepth24Unorm_Stencil8:
52#endif
53        case MTLPixelFormatDepth32Float_Stencil8:
54            return true;
55        default:
56            return false;
57    }
58}
59
60bool MtlFormatIsCompressed(MTLPixelFormat mtlFormat) {
61    switch (mtlFormat) {
62        case MTLPixelFormatETC2_RGB8:
63            return true;
64#ifdef SK_BUILD_FOR_MAC
65        case MTLPixelFormatBC1_RGBA:
66            return true;
67#endif
68        default:
69            return false;
70    }
71}
72
73const char* MtlFormatToString(MTLPixelFormat mtlFormat) {
74    switch (mtlFormat) {
75        case MTLPixelFormatInvalid:         return "Invalid";
76        case MTLPixelFormatRGBA8Unorm:      return "RGBA8Unorm";
77        case MTLPixelFormatR8Unorm:         return "R8Unorm";
78        case MTLPixelFormatA8Unorm:         return "A8Unorm";
79        case MTLPixelFormatBGRA8Unorm:      return "BGRA8Unorm";
80        case MTLPixelFormatB5G6R5Unorm:     return "B5G6R5Unorm";
81        case MTLPixelFormatRGBA16Float:     return "RGBA16Float";
82        case MTLPixelFormatR16Float:        return "R16Float";
83        case MTLPixelFormatRG8Unorm:        return "RG8Unorm";
84        case MTLPixelFormatRGB10A2Unorm:    return "RGB10A2Unorm";
85        case MTLPixelFormatBGR10A2Unorm:    return "BGR10A2Unorm";
86        case MTLPixelFormatABGR4Unorm:      return "ABGR4Unorm";
87        case MTLPixelFormatRGBA8Unorm_sRGB: return "RGBA8Unorm_sRGB";
88        case MTLPixelFormatR16Unorm:        return "R16Unorm";
89        case MTLPixelFormatRG16Unorm:       return "RG16Unorm";
90        case MTLPixelFormatETC2_RGB8:       return "ETC2_RGB8";
91#ifdef SK_BUILD_FOR_MAC
92        case MTLPixelFormatBC1_RGBA:        return "BC1_RGBA";
93#endif
94        case MTLPixelFormatRGBA16Unorm:     return "RGBA16Unorm";
95        case MTLPixelFormatRG16Float:       return "RG16Float";
96        case MTLPixelFormatStencil8:        return "Stencil8";
97
98        default:                            return "Unknown";
99    }
100}
101
102uint32_t MtlFormatChannels(MTLPixelFormat mtlFormat) {
103    switch (mtlFormat) {
104        case MTLPixelFormatRGBA8Unorm:      return kRGBA_SkColorChannelFlags;
105        case MTLPixelFormatR8Unorm:         return kRed_SkColorChannelFlag;
106        case MTLPixelFormatA8Unorm:         return kAlpha_SkColorChannelFlag;
107        case MTLPixelFormatBGRA8Unorm:      return kRGBA_SkColorChannelFlags;
108        case MTLPixelFormatB5G6R5Unorm:     return kRGB_SkColorChannelFlags;
109        case MTLPixelFormatRGBA16Float:     return kRGBA_SkColorChannelFlags;
110        case MTLPixelFormatR16Float:        return kRed_SkColorChannelFlag;
111        case MTLPixelFormatRG8Unorm:        return kRG_SkColorChannelFlags;
112        case MTLPixelFormatRGB10A2Unorm:    return kRGBA_SkColorChannelFlags;
113        case MTLPixelFormatBGR10A2Unorm:    return kRGBA_SkColorChannelFlags;
114        case MTLPixelFormatABGR4Unorm:      return kRGBA_SkColorChannelFlags;
115        case MTLPixelFormatRGBA8Unorm_sRGB: return kRGBA_SkColorChannelFlags;
116        case MTLPixelFormatR16Unorm:        return kRed_SkColorChannelFlag;
117        case MTLPixelFormatRG16Unorm:       return kRG_SkColorChannelFlags;
118        case MTLPixelFormatETC2_RGB8:       return kRGB_SkColorChannelFlags;
119#ifdef SK_BUILD_FOR_MAC
120        case MTLPixelFormatBC1_RGBA:        return kRGBA_SkColorChannelFlags;
121#endif
122        case MTLPixelFormatRGBA16Unorm:     return kRGBA_SkColorChannelFlags;
123        case MTLPixelFormatRG16Float:       return kRG_SkColorChannelFlags;
124        case MTLPixelFormatStencil8:        return 0;
125
126        default:                            return 0;
127    }
128}
129
130size_t MtlFormatBytesPerBlock(MTLPixelFormat mtlFormat) {
131    switch (mtlFormat) {
132        case MTLPixelFormatInvalid:         return 0;
133        case MTLPixelFormatRGBA8Unorm:      return 4;
134        case MTLPixelFormatR8Unorm:         return 1;
135        case MTLPixelFormatA8Unorm:         return 1;
136        case MTLPixelFormatBGRA8Unorm:      return 4;
137        case MTLPixelFormatB5G6R5Unorm:     return 2;
138        case MTLPixelFormatRGBA16Float:     return 8;
139        case MTLPixelFormatR16Float:        return 2;
140        case MTLPixelFormatRG8Unorm:        return 2;
141        case MTLPixelFormatRGB10A2Unorm:    return 4;
142        case MTLPixelFormatBGR10A2Unorm:    return 4;
143        case MTLPixelFormatABGR4Unorm:      return 2;
144        case MTLPixelFormatRGBA8Unorm_sRGB: return 4;
145        case MTLPixelFormatR16Unorm:        return 2;
146        case MTLPixelFormatRG16Unorm:       return 4;
147        case MTLPixelFormatETC2_RGB8:       return 8;
148#ifdef SK_BUILD_FOR_MAC
149        case MTLPixelFormatBC1_RGBA:        return 8;
150#endif
151        case MTLPixelFormatRGBA16Unorm:     return 8;
152        case MTLPixelFormatRG16Float:       return 4;
153        case MTLPixelFormatStencil8:        return 1;
154
155        default:                            return 0;
156    }
157}
158
159SkTextureCompressionType MtlFormatToCompressionType(MTLPixelFormat mtlFormat) {
160    switch (mtlFormat) {
161        case MTLPixelFormatETC2_RGB8: return SkTextureCompressionType::kETC2_RGB8_UNORM;
162#ifdef SK_BUILD_FOR_MAC
163        case MTLPixelFormatBC1_RGBA:  return SkTextureCompressionType::kBC1_RGBA8_UNORM;
164#endif
165        default:                      return SkTextureCompressionType::kNone;
166    }
167}
168
169} // namespace skgpu
170