xref: /aosp_15_r20/external/skia/src/gpu/mtl/MtlUtils.mm (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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