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