1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 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 #ifndef GrGLUtil_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrGLUtil_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLConfig.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLInterface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/gl/GrGLTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/gl/GrGLDefines.h"
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
21*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker enum class GrStencilTest : uint16_t;
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker typedef uint32_t GrGLVersion;
28*c8dee2aaSAndroid Build Coastguard Worker typedef uint32_t GrGLSLVersion;
29*c8dee2aaSAndroid Build Coastguard Worker typedef uint64_t GrGLDriverVersion;
30*c8dee2aaSAndroid Build Coastguard Worker
31*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_VER(major, minor) ((static_cast<uint32_t>(major) << 16) | \
32*c8dee2aaSAndroid Build Coastguard Worker static_cast<uint32_t>(minor))
33*c8dee2aaSAndroid Build Coastguard Worker #define GR_GLSL_VER(major, minor) ((static_cast<uint32_t>(major) << 16) | \
34*c8dee2aaSAndroid Build Coastguard Worker static_cast<uint32_t>(minor))
35*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_DRIVER_VER(major, minor, point) ((static_cast<uint64_t>(major) << 32) | \
36*c8dee2aaSAndroid Build Coastguard Worker (static_cast<uint64_t>(minor) << 16) | \
37*c8dee2aaSAndroid Build Coastguard Worker static_cast<uint64_t>(point))
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_MAJOR_VER(version) (static_cast<uint32_t>(version) >> 16)
40*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_MINOR_VER(version) (static_cast<uint32_t>(version) & 0xFFFF)
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_INVALID_VER GR_GL_VER(0, 0)
43*c8dee2aaSAndroid Build Coastguard Worker #define GR_GLSL_INVALID_VER GR_GLSL_VER(0, 0)
44*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_DRIVER_UNKNOWN_VER GR_GL_DRIVER_VER(0, 0, 0)
45*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatChannels(GrGLFormat format)46*c8dee2aaSAndroid Build Coastguard Worker static constexpr uint32_t GrGLFormatChannels(GrGLFormat format) {
47*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
48*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown: return 0;
49*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8: return kRGBA_SkColorChannelFlags;
50*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8: return kRed_SkColorChannelFlag;
51*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8: return kAlpha_SkColorChannelFlag;
52*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8: return kGray_SkColorChannelFlag;
53*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8: return kGrayAlpha_SkColorChannelFlags;
54*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8: return kRGBA_SkColorChannelFlags;
55*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565: return kRGB_SkColorChannelFlags;
56*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F: return kRGBA_SkColorChannelFlags;
57*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F: return kRed_SkColorChannelFlag;
58*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8: return kRGB_SkColorChannelFlags;
59*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8: return kRGB_SkColorChannelFlags;
60*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8: return kRG_SkColorChannelFlags;
61*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2: return kRGBA_SkColorChannelFlags;
62*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4: return kRGBA_SkColorChannelFlags;
63*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8: return kRGBA_SkColorChannelFlags;
64*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return kRGB_SkColorChannelFlags;
65*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return kRGB_SkColorChannelFlags;
66*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1: return kRGB_SkColorChannelFlags;
67*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return kRGBA_SkColorChannelFlags;
68*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16: return kRed_SkColorChannelFlag;
69*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16: return kRG_SkColorChannelFlags;
70*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16: return kRGBA_SkColorChannelFlags;
71*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F: return kRG_SkColorChannelFlags;
72*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F: return kGray_SkColorChannelFlag;
73*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8: return 0;
74*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16: return 0;
75*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8: return 0;
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatDesc(GrGLFormat format)80*c8dee2aaSAndroid Build Coastguard Worker static constexpr GrColorFormatDesc GrGLFormatDesc(GrGLFormat format) {
81*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
82*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown: return GrColorFormatDesc::MakeInvalid();
83*c8dee2aaSAndroid Build Coastguard Worker
84*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8:
85*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
86*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8:
87*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeR(8, GrColorTypeEncoding::kUnorm);
88*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8:
89*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeAlpha(8, GrColorTypeEncoding::kUnorm);
90*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8:
91*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeGray(8, GrColorTypeEncoding::kUnorm);
92*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8:
93*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeGrayAlpha(8, GrColorTypeEncoding::kUnorm);
94*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8:
95*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm);
96*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565:
97*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGB(5, 6, 5, GrColorTypeEncoding::kUnorm);
98*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F:
99*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kFloat);
100*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F:
101*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kFloat);
102*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8:
103*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGB(8, GrColorTypeEncoding::kUnorm);
104*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8:
105*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGB(8, GrColorTypeEncoding::kUnorm);
106*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8:
107*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRG(8, GrColorTypeEncoding::kUnorm);
108*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2:
109*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(10, 2, GrColorTypeEncoding::kUnorm);
110*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4:
111*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm);
112*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8:
113*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kSRGBUnorm);
114*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16:
115*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kUnorm);
116*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16:
117*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kUnorm);
118*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16:
119*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kUnorm);
120*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F:
121*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kFloat);
122*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F:
123*c8dee2aaSAndroid Build Coastguard Worker return GrColorFormatDesc::MakeGray(16, GrColorTypeEncoding::kFloat);
124*c8dee2aaSAndroid Build Coastguard Worker
125*c8dee2aaSAndroid Build Coastguard Worker // Compressed texture formats are not expected to have a description.
126*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return GrColorFormatDesc::MakeInvalid();
127*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return GrColorFormatDesc::MakeInvalid();
128*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1: return GrColorFormatDesc::MakeInvalid();
129*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return GrColorFormatDesc::MakeInvalid();
130*c8dee2aaSAndroid Build Coastguard Worker
131*c8dee2aaSAndroid Build Coastguard Worker // This type only describes color channels.
132*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8: return GrColorFormatDesc::MakeInvalid();
133*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16: return GrColorFormatDesc::MakeInvalid();
134*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8: return GrColorFormatDesc::MakeInvalid();
135*c8dee2aaSAndroid Build Coastguard Worker }
136*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
137*c8dee2aaSAndroid Build Coastguard Worker }
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker /**
140*c8dee2aaSAndroid Build Coastguard Worker * The Vendor and Renderer enum values are lazily updated as required.
141*c8dee2aaSAndroid Build Coastguard Worker */
142*c8dee2aaSAndroid Build Coastguard Worker enum class GrGLVendor {
143*c8dee2aaSAndroid Build Coastguard Worker kARM,
144*c8dee2aaSAndroid Build Coastguard Worker kGoogle,
145*c8dee2aaSAndroid Build Coastguard Worker kImagination,
146*c8dee2aaSAndroid Build Coastguard Worker kIntel,
147*c8dee2aaSAndroid Build Coastguard Worker kQualcomm,
148*c8dee2aaSAndroid Build Coastguard Worker kNVIDIA,
149*c8dee2aaSAndroid Build Coastguard Worker kATI,
150*c8dee2aaSAndroid Build Coastguard Worker kApple,
151*c8dee2aaSAndroid Build Coastguard Worker
152*c8dee2aaSAndroid Build Coastguard Worker kOther
153*c8dee2aaSAndroid Build Coastguard Worker };
154*c8dee2aaSAndroid Build Coastguard Worker
155*c8dee2aaSAndroid Build Coastguard Worker enum class GrGLRenderer {
156*c8dee2aaSAndroid Build Coastguard Worker kTegra_PreK1, // Legacy Tegra architecture (pre-K1).
157*c8dee2aaSAndroid Build Coastguard Worker kTegra, // Tegra with the same architecture as NVIDIA desktop GPUs (K1+).
158*c8dee2aaSAndroid Build Coastguard Worker
159*c8dee2aaSAndroid Build Coastguard Worker kPowerVR54x,
160*c8dee2aaSAndroid Build Coastguard Worker kPowerVRBSeries,
161*c8dee2aaSAndroid Build Coastguard Worker kPowerVRRogue,
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Worker kAdreno3xx,
164*c8dee2aaSAndroid Build Coastguard Worker kAdreno430,
165*c8dee2aaSAndroid Build Coastguard Worker kAdreno4xx_other,
166*c8dee2aaSAndroid Build Coastguard Worker kAdreno530,
167*c8dee2aaSAndroid Build Coastguard Worker kAdreno5xx_other,
168*c8dee2aaSAndroid Build Coastguard Worker kAdreno615, // Pixel3a
169*c8dee2aaSAndroid Build Coastguard Worker kAdreno620, // Pixel5
170*c8dee2aaSAndroid Build Coastguard Worker kAdreno630, // Pixel3
171*c8dee2aaSAndroid Build Coastguard Worker kAdreno640, // Pixel4
172*c8dee2aaSAndroid Build Coastguard Worker kAdreno6xx_other,
173*c8dee2aaSAndroid Build Coastguard Worker
174*c8dee2aaSAndroid Build Coastguard Worker /** Intel GPU families, ordered by generation **/
175*c8dee2aaSAndroid Build Coastguard Worker // 6th gen
176*c8dee2aaSAndroid Build Coastguard Worker kIntelSandyBridge,
177*c8dee2aaSAndroid Build Coastguard Worker
178*c8dee2aaSAndroid Build Coastguard Worker // 7th gen
179*c8dee2aaSAndroid Build Coastguard Worker kIntelIvyBridge,
180*c8dee2aaSAndroid Build Coastguard Worker kIntelValleyView, // aka BayTrail
181*c8dee2aaSAndroid Build Coastguard Worker kIntelHaswell,
182*c8dee2aaSAndroid Build Coastguard Worker
183*c8dee2aaSAndroid Build Coastguard Worker // 8th gen
184*c8dee2aaSAndroid Build Coastguard Worker kIntelCherryView, // aka Braswell
185*c8dee2aaSAndroid Build Coastguard Worker kIntelBroadwell,
186*c8dee2aaSAndroid Build Coastguard Worker
187*c8dee2aaSAndroid Build Coastguard Worker // 9th gen
188*c8dee2aaSAndroid Build Coastguard Worker kIntelApolloLake,
189*c8dee2aaSAndroid Build Coastguard Worker kIntelSkyLake,
190*c8dee2aaSAndroid Build Coastguard Worker kIntelGeminiLake,
191*c8dee2aaSAndroid Build Coastguard Worker kIntelKabyLake,
192*c8dee2aaSAndroid Build Coastguard Worker kIntelCoffeeLake,
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker // 11th gen
195*c8dee2aaSAndroid Build Coastguard Worker kIntelIceLake,
196*c8dee2aaSAndroid Build Coastguard Worker
197*c8dee2aaSAndroid Build Coastguard Worker // 12th gen
198*c8dee2aaSAndroid Build Coastguard Worker kIntelRocketLake,
199*c8dee2aaSAndroid Build Coastguard Worker kIntelTigerLake,
200*c8dee2aaSAndroid Build Coastguard Worker kIntelAlderLake,
201*c8dee2aaSAndroid Build Coastguard Worker
202*c8dee2aaSAndroid Build Coastguard Worker kGalliumLLVM,
203*c8dee2aaSAndroid Build Coastguard Worker
204*c8dee2aaSAndroid Build Coastguard Worker kMali4xx,
205*c8dee2aaSAndroid Build Coastguard Worker /** G-3x, G-5x, or G-7x */
206*c8dee2aaSAndroid Build Coastguard Worker kMaliG,
207*c8dee2aaSAndroid Build Coastguard Worker /** T-6xx, T-7xx, or T-8xx */
208*c8dee2aaSAndroid Build Coastguard Worker kMaliT,
209*c8dee2aaSAndroid Build Coastguard Worker
210*c8dee2aaSAndroid Build Coastguard Worker kAMDRadeonHD7xxx, // AMD Radeon HD 7000 Series
211*c8dee2aaSAndroid Build Coastguard Worker kAMDRadeonR9M3xx, // AMD Radeon R9 M300 Series
212*c8dee2aaSAndroid Build Coastguard Worker kAMDRadeonR9M4xx, // AMD Radeon R9 M400 Series
213*c8dee2aaSAndroid Build Coastguard Worker kAMDRadeonPro5xxx, // AMD Radeon Pro 5000 Series
214*c8dee2aaSAndroid Build Coastguard Worker kAMDRadeonProVegaxx, // AMD Radeon Pro Vega
215*c8dee2aaSAndroid Build Coastguard Worker
216*c8dee2aaSAndroid Build Coastguard Worker kApple,
217*c8dee2aaSAndroid Build Coastguard Worker
218*c8dee2aaSAndroid Build Coastguard Worker kWebGL,
219*c8dee2aaSAndroid Build Coastguard Worker
220*c8dee2aaSAndroid Build Coastguard Worker kOther
221*c8dee2aaSAndroid Build Coastguard Worker };
222*c8dee2aaSAndroid Build Coastguard Worker
223*c8dee2aaSAndroid Build Coastguard Worker enum class GrGLDriver {
224*c8dee2aaSAndroid Build Coastguard Worker kMesa,
225*c8dee2aaSAndroid Build Coastguard Worker kNVIDIA,
226*c8dee2aaSAndroid Build Coastguard Worker kIntel,
227*c8dee2aaSAndroid Build Coastguard Worker kQualcomm,
228*c8dee2aaSAndroid Build Coastguard Worker kFreedreno,
229*c8dee2aaSAndroid Build Coastguard Worker kAndroidEmulator,
230*c8dee2aaSAndroid Build Coastguard Worker kImagination,
231*c8dee2aaSAndroid Build Coastguard Worker kARM,
232*c8dee2aaSAndroid Build Coastguard Worker kApple,
233*c8dee2aaSAndroid Build Coastguard Worker kUnknown
234*c8dee2aaSAndroid Build Coastguard Worker };
235*c8dee2aaSAndroid Build Coastguard Worker
236*c8dee2aaSAndroid Build Coastguard Worker enum class GrGLANGLEBackend {
237*c8dee2aaSAndroid Build Coastguard Worker kUnknown,
238*c8dee2aaSAndroid Build Coastguard Worker kD3D9,
239*c8dee2aaSAndroid Build Coastguard Worker kD3D11,
240*c8dee2aaSAndroid Build Coastguard Worker kMetal,
241*c8dee2aaSAndroid Build Coastguard Worker kOpenGL,
242*c8dee2aaSAndroid Build Coastguard Worker kVulkan,
243*c8dee2aaSAndroid Build Coastguard Worker };
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
246*c8dee2aaSAndroid Build Coastguard Worker
247*c8dee2aaSAndroid Build Coastguard Worker /**
248*c8dee2aaSAndroid Build Coastguard Worker * Some drivers want the var-int arg to be zero-initialized on input.
249*c8dee2aaSAndroid Build Coastguard Worker */
250*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_INIT_ZERO 0
251*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetIntegerv(gl, e, p) \
252*c8dee2aaSAndroid Build Coastguard Worker do { \
253*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
254*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetIntegerv(e, p)); \
255*c8dee2aaSAndroid Build Coastguard Worker } while (0)
256*c8dee2aaSAndroid Build Coastguard Worker
257*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetQueryObjectui64v(gl, id, pname, params) \
258*c8dee2aaSAndroid Build Coastguard Worker do { \
259*c8dee2aaSAndroid Build Coastguard Worker *(params) = GR_GL_INIT_ZERO; \
260*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetQueryObjectui64v(id, pname, params)); \
261*c8dee2aaSAndroid Build Coastguard Worker } while (0)
262*c8dee2aaSAndroid Build Coastguard Worker
263*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetFloatv(gl, e, p) \
264*c8dee2aaSAndroid Build Coastguard Worker do { \
265*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
266*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetFloatv(e, p)); \
267*c8dee2aaSAndroid Build Coastguard Worker } while (0)
268*c8dee2aaSAndroid Build Coastguard Worker
269*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \
270*c8dee2aaSAndroid Build Coastguard Worker do { \
271*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
272*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \
273*c8dee2aaSAndroid Build Coastguard Worker } while (0)
274*c8dee2aaSAndroid Build Coastguard Worker
275*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetInternalformativ(gl, t, f, n, s, p) \
276*c8dee2aaSAndroid Build Coastguard Worker do { \
277*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
278*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetInternalformativ(t, f, n, s, p)); \
279*c8dee2aaSAndroid Build Coastguard Worker } while (0)
280*c8dee2aaSAndroid Build Coastguard Worker
281*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetNamedFramebufferAttachmentParameteriv(gl, fb, a, pname, p) \
282*c8dee2aaSAndroid Build Coastguard Worker do { \
283*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
284*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetNamedFramebufferAttachmentParameteriv(fb, a, pname, p)); \
285*c8dee2aaSAndroid Build Coastguard Worker } while (0)
286*c8dee2aaSAndroid Build Coastguard Worker
287*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \
288*c8dee2aaSAndroid Build Coastguard Worker do { \
289*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
290*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \
291*c8dee2aaSAndroid Build Coastguard Worker } while (0)
292*c8dee2aaSAndroid Build Coastguard Worker
293*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \
294*c8dee2aaSAndroid Build Coastguard Worker do { \
295*c8dee2aaSAndroid Build Coastguard Worker *(p) = GR_GL_INIT_ZERO; \
296*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \
297*c8dee2aaSAndroid Build Coastguard Worker } while (0)
298*c8dee2aaSAndroid Build Coastguard Worker
299*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_GetShaderPrecisionFormat(gl, st, pt, range, precision) \
300*c8dee2aaSAndroid Build Coastguard Worker do { \
301*c8dee2aaSAndroid Build Coastguard Worker (range)[0] = GR_GL_INIT_ZERO; \
302*c8dee2aaSAndroid Build Coastguard Worker (range)[1] = GR_GL_INIT_ZERO; \
303*c8dee2aaSAndroid Build Coastguard Worker (*precision) = GR_GL_INIT_ZERO; \
304*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL(gl, GetShaderPrecisionFormat(st, pt, range, precision)); \
305*c8dee2aaSAndroid Build Coastguard Worker } while (0)
306*c8dee2aaSAndroid Build Coastguard Worker
307*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
308*c8dee2aaSAndroid Build Coastguard Worker
309*c8dee2aaSAndroid Build Coastguard Worker GrGLStandard GrGLGetStandardInUseFromString(const char* versionString);
310*c8dee2aaSAndroid Build Coastguard Worker GrGLSLVersion GrGLGetVersion(const GrGLInterface*);
311*c8dee2aaSAndroid Build Coastguard Worker GrGLSLVersion GrGLGetVersionFromString(const char*);
312*c8dee2aaSAndroid Build Coastguard Worker
313*c8dee2aaSAndroid Build Coastguard Worker struct GrGLDriverInfo {
314*c8dee2aaSAndroid Build Coastguard Worker GrGLStandard fStandard = kNone_GrGLStandard;
315*c8dee2aaSAndroid Build Coastguard Worker GrGLVersion fVersion = GR_GL_INVALID_VER;
316*c8dee2aaSAndroid Build Coastguard Worker GrGLSLVersion fGLSLVersion = GR_GLSL_INVALID_VER;
317*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor fVendor = GrGLVendor::kOther;
318*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer fRenderer = GrGLRenderer::kOther;
319*c8dee2aaSAndroid Build Coastguard Worker GrGLDriver fDriver = GrGLDriver::kUnknown;
320*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverVersion fDriverVersion = GR_GL_DRIVER_UNKNOWN_VER;
321*c8dee2aaSAndroid Build Coastguard Worker
322*c8dee2aaSAndroid Build Coastguard Worker GrGLANGLEBackend fANGLEBackend = GrGLANGLEBackend::kUnknown;
323*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor fANGLEVendor = GrGLVendor::kOther;
324*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer fANGLERenderer = GrGLRenderer::kOther;
325*c8dee2aaSAndroid Build Coastguard Worker GrGLDriver fANGLEDriver = GrGLDriver::kUnknown;
326*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverVersion fANGLEDriverVersion = GR_GL_DRIVER_UNKNOWN_VER;
327*c8dee2aaSAndroid Build Coastguard Worker
328*c8dee2aaSAndroid Build Coastguard Worker GrGLVendor fWebGLVendor = GrGLVendor::kOther;
329*c8dee2aaSAndroid Build Coastguard Worker GrGLRenderer fWebGLRenderer = GrGLRenderer::kOther;
330*c8dee2aaSAndroid Build Coastguard Worker
331*c8dee2aaSAndroid Build Coastguard Worker // Are we running over the Chrome interprocess command buffer?
332*c8dee2aaSAndroid Build Coastguard Worker bool fIsOverCommandBuffer = false;
333*c8dee2aaSAndroid Build Coastguard Worker
334*c8dee2aaSAndroid Build Coastguard Worker // Running over virgl guest driver.
335*c8dee2aaSAndroid Build Coastguard Worker bool fIsRunningOverVirgl = false;
336*c8dee2aaSAndroid Build Coastguard Worker };
337*c8dee2aaSAndroid Build Coastguard Worker
338*c8dee2aaSAndroid Build Coastguard Worker GrGLDriverInfo GrGLGetDriverInfo(const GrGLInterface*);
339*c8dee2aaSAndroid Build Coastguard Worker
340*c8dee2aaSAndroid Build Coastguard Worker /**
341*c8dee2aaSAndroid Build Coastguard Worker * Helpers for glGetError()
342*c8dee2aaSAndroid Build Coastguard Worker */
343*c8dee2aaSAndroid Build Coastguard Worker
344*c8dee2aaSAndroid Build Coastguard Worker void GrGLCheckErr(const GrGLInterface* gl,
345*c8dee2aaSAndroid Build Coastguard Worker const char* location,
346*c8dee2aaSAndroid Build Coastguard Worker const char* call);
347*c8dee2aaSAndroid Build Coastguard Worker
348*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
349*c8dee2aaSAndroid Build Coastguard Worker
350*c8dee2aaSAndroid Build Coastguard Worker /**
351*c8dee2aaSAndroid Build Coastguard Worker * GR_STRING makes a string of X where X is expanded before conversion to a string
352*c8dee2aaSAndroid Build Coastguard Worker * if X itself contains macros.
353*c8dee2aaSAndroid Build Coastguard Worker */
354*c8dee2aaSAndroid Build Coastguard Worker #define GR_STRING(X) GR_STRING_IMPL(X)
355*c8dee2aaSAndroid Build Coastguard Worker #define GR_STRING_IMPL(X) #X
356*c8dee2aaSAndroid Build Coastguard Worker
357*c8dee2aaSAndroid Build Coastguard Worker /**
358*c8dee2aaSAndroid Build Coastguard Worker * Creates a string of the form "<filename>(<linenumber>) : "
359*c8dee2aaSAndroid Build Coastguard Worker */
360*c8dee2aaSAndroid Build Coastguard Worker #define GR_FILE_AND_LINE_STR __FILE__ "(" GR_STRING(__LINE__) ") : "
361*c8dee2aaSAndroid Build Coastguard Worker
362*c8dee2aaSAndroid Build Coastguard Worker /**
363*c8dee2aaSAndroid Build Coastguard Worker * Macros for using GrGLInterface to make GL calls
364*c8dee2aaSAndroid Build Coastguard Worker */
365*c8dee2aaSAndroid Build Coastguard Worker
366*c8dee2aaSAndroid Build Coastguard Worker // Conditionally checks glGetError based on compile-time and run-time flags.
367*c8dee2aaSAndroid Build Coastguard Worker #if GR_GL_CHECK_ERROR
368*c8dee2aaSAndroid Build Coastguard Worker extern bool gCheckErrorGL;
369*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \
370*c8dee2aaSAndroid Build Coastguard Worker do { \
371*c8dee2aaSAndroid Build Coastguard Worker if (gCheckErrorGL) { \
372*c8dee2aaSAndroid Build Coastguard Worker IFACE->checkError(GR_FILE_AND_LINE_STR, #X); \
373*c8dee2aaSAndroid Build Coastguard Worker } \
374*c8dee2aaSAndroid Build Coastguard Worker } while (false)
375*c8dee2aaSAndroid Build Coastguard Worker #else
376*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \
377*c8dee2aaSAndroid Build Coastguard Worker do { \
378*c8dee2aaSAndroid Build Coastguard Worker } while (false)
379*c8dee2aaSAndroid Build Coastguard Worker #endif
380*c8dee2aaSAndroid Build Coastguard Worker
381*c8dee2aaSAndroid Build Coastguard Worker // internal macro to conditionally log the gl call using SkDebugf based on
382*c8dee2aaSAndroid Build Coastguard Worker // compile-time and run-time flags.
383*c8dee2aaSAndroid Build Coastguard Worker #if GR_GL_LOG_CALLS
384*c8dee2aaSAndroid Build Coastguard Worker extern bool gLogCallsGL;
385*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_LOG_CALLS_IMPL(X) \
386*c8dee2aaSAndroid Build Coastguard Worker if (gLogCallsGL) \
387*c8dee2aaSAndroid Build Coastguard Worker SkDebugf(GR_FILE_AND_LINE_STR "GL: " #X "\n")
388*c8dee2aaSAndroid Build Coastguard Worker #else
389*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_LOG_CALLS_IMPL(X)
390*c8dee2aaSAndroid Build Coastguard Worker #endif
391*c8dee2aaSAndroid Build Coastguard Worker
392*c8dee2aaSAndroid Build Coastguard Worker // makes a GL call on the interface and does any error checking and logging
393*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CALL(IFACE, X) \
394*c8dee2aaSAndroid Build Coastguard Worker do { \
395*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL_NOERRCHECK(IFACE, X); \
396*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
397*c8dee2aaSAndroid Build Coastguard Worker } while (false)
398*c8dee2aaSAndroid Build Coastguard Worker
399*c8dee2aaSAndroid Build Coastguard Worker // Variant of above that always skips the error check. This is useful when
400*c8dee2aaSAndroid Build Coastguard Worker // the caller wants to do its own glGetError() call and examine the error value.
401*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CALL_NOERRCHECK(IFACE, X) \
402*c8dee2aaSAndroid Build Coastguard Worker do { \
403*c8dee2aaSAndroid Build Coastguard Worker (IFACE)->fFunctions.f##X; \
404*c8dee2aaSAndroid Build Coastguard Worker GR_GL_LOG_CALLS_IMPL(X); \
405*c8dee2aaSAndroid Build Coastguard Worker } while (false)
406*c8dee2aaSAndroid Build Coastguard Worker
407*c8dee2aaSAndroid Build Coastguard Worker // same as GR_GL_CALL but stores the return value of the gl call in RET
408*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CALL_RET(IFACE, RET, X) \
409*c8dee2aaSAndroid Build Coastguard Worker do { \
410*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \
411*c8dee2aaSAndroid Build Coastguard Worker GR_GL_CHECK_ERROR_IMPL(IFACE, X); \
412*c8dee2aaSAndroid Build Coastguard Worker } while (false)
413*c8dee2aaSAndroid Build Coastguard Worker
414*c8dee2aaSAndroid Build Coastguard Worker // same as GR_GL_CALL_RET but always skips the error check.
415*c8dee2aaSAndroid Build Coastguard Worker #define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \
416*c8dee2aaSAndroid Build Coastguard Worker do { \
417*c8dee2aaSAndroid Build Coastguard Worker (RET) = (IFACE)->fFunctions.f##X; \
418*c8dee2aaSAndroid Build Coastguard Worker GR_GL_LOG_CALLS_IMPL(X); \
419*c8dee2aaSAndroid Build Coastguard Worker } while (false)
420*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatFromGLEnum(GrGLenum glFormat)421*c8dee2aaSAndroid Build Coastguard Worker static constexpr GrGLFormat GrGLFormatFromGLEnum(GrGLenum glFormat) {
422*c8dee2aaSAndroid Build Coastguard Worker switch (glFormat) {
423*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA8: return GrGLFormat::kRGBA8;
424*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R8: return GrGLFormat::kR8;
425*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_ALPHA8: return GrGLFormat::kALPHA8;
426*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE8: return GrGLFormat::kLUMINANCE8;
427*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE8_ALPHA8: return GrGLFormat::kLUMINANCE8_ALPHA8;
428*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_BGRA8: return GrGLFormat::kBGRA8;
429*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB565: return GrGLFormat::kRGB565;
430*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA16F: return GrGLFormat::kRGBA16F;
431*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE16F: return GrGLFormat::kLUMINANCE16F;
432*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R16F: return GrGLFormat::kR16F;
433*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB8: return GrGLFormat::kRGB8;
434*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBX8: return GrGLFormat::kRGBX8;
435*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG8: return GrGLFormat::kRG8;
436*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB10_A2: return GrGLFormat::kRGB10_A2;
437*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA4: return GrGLFormat::kRGBA4;
438*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_SRGB8_ALPHA8: return GrGLFormat::kSRGB8_ALPHA8;
439*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_ETC1_RGB8: return GrGLFormat::kCOMPRESSED_ETC1_RGB8;
440*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGB8_ETC2: return GrGLFormat::kCOMPRESSED_RGB8_ETC2;
441*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GrGLFormat::kCOMPRESSED_RGB8_BC1;
442*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GrGLFormat::kCOMPRESSED_RGBA8_BC1;
443*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R16: return GrGLFormat::kR16;
444*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG16: return GrGLFormat::kRG16;
445*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA16: return GrGLFormat::kRGBA16;
446*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG16F: return GrGLFormat::kRG16F;
447*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_STENCIL_INDEX8: return GrGLFormat::kSTENCIL_INDEX8;
448*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_STENCIL_INDEX16: return GrGLFormat::kSTENCIL_INDEX16;
449*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_DEPTH24_STENCIL8: return GrGLFormat::kDEPTH24_STENCIL8;
450*c8dee2aaSAndroid Build Coastguard Worker
451*c8dee2aaSAndroid Build Coastguard Worker
452*c8dee2aaSAndroid Build Coastguard Worker default: return GrGLFormat::kUnknown;
453*c8dee2aaSAndroid Build Coastguard Worker }
454*c8dee2aaSAndroid Build Coastguard Worker }
455*c8dee2aaSAndroid Build Coastguard Worker
456*c8dee2aaSAndroid Build Coastguard Worker /** Returns either the sized internal format or compressed internal format of the GrGLFormat. */
GrGLFormatToEnum(GrGLFormat format)457*c8dee2aaSAndroid Build Coastguard Worker static constexpr GrGLenum GrGLFormatToEnum(GrGLFormat format) {
458*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
459*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8: return GR_GL_RGBA8;
460*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8: return GR_GL_R8;
461*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8: return GR_GL_ALPHA8;
462*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8: return GR_GL_LUMINANCE8;
463*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8: return GR_GL_LUMINANCE8_ALPHA8;
464*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8: return GR_GL_BGRA8;
465*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565: return GR_GL_RGB565;
466*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F: return GR_GL_RGBA16F;
467*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F: return GR_GL_LUMINANCE16F;
468*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F: return GR_GL_R16F;
469*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8: return GR_GL_RGB8;
470*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8: return GR_GL_RGBX8;
471*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8: return GR_GL_RG8;
472*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2: return GR_GL_RGB10_A2;
473*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4: return GR_GL_RGBA4;
474*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8: return GR_GL_SRGB8_ALPHA8;
475*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return GR_GL_COMPRESSED_ETC1_RGB8;
476*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return GR_GL_COMPRESSED_RGB8_ETC2;
477*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1: return GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
478*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
479*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16: return GR_GL_R16;
480*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16: return GR_GL_RG16;
481*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16: return GR_GL_RGBA16;
482*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F: return GR_GL_RG16F;
483*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8: return GR_GL_STENCIL_INDEX8;
484*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16: return GR_GL_STENCIL_INDEX16;
485*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8: return GR_GL_DEPTH24_STENCIL8;
486*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown: return 0;
487*c8dee2aaSAndroid Build Coastguard Worker }
488*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
489*c8dee2aaSAndroid Build Coastguard Worker }
490*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatBytesPerBlock(GrGLFormat format)491*c8dee2aaSAndroid Build Coastguard Worker static constexpr size_t GrGLFormatBytesPerBlock(GrGLFormat format) {
492*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
493*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8: return 4;
494*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8: return 1;
495*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8: return 1;
496*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8: return 1;
497*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8: return 2;
498*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8: return 4;
499*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565: return 2;
500*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F: return 8;
501*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F: return 2;
502*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F: return 2;
503*c8dee2aaSAndroid Build Coastguard Worker // We assume the GPU stores this format 4 byte aligned
504*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8: return 4;
505*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8: return 4;
506*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8: return 2;
507*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2: return 4;
508*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4: return 2;
509*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8: return 4;
510*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return 8;
511*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return 8;
512*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1: return 8;
513*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return 8;
514*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16: return 2;
515*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16: return 4;
516*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16: return 8;
517*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F: return 4;
518*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8: return 1;
519*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16: return 2;
520*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8: return 4;
521*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown: return 0;
522*c8dee2aaSAndroid Build Coastguard Worker }
523*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
524*c8dee2aaSAndroid Build Coastguard Worker }
525*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatStencilBits(GrGLFormat format)526*c8dee2aaSAndroid Build Coastguard Worker static constexpr int GrGLFormatStencilBits(GrGLFormat format) {
527*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
528*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8:
529*c8dee2aaSAndroid Build Coastguard Worker return 8;
530*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16:
531*c8dee2aaSAndroid Build Coastguard Worker return 16;
532*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8:
533*c8dee2aaSAndroid Build Coastguard Worker return 8;
534*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8:
535*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2:
536*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1:
537*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1:
538*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8:
539*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8:
540*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8:
541*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8:
542*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8:
543*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8:
544*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565:
545*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F:
546*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F:
547*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F:
548*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8:
549*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8:
550*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8:
551*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2:
552*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4:
553*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8:
554*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16:
555*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16:
556*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16:
557*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F:
558*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown:
559*c8dee2aaSAndroid Build Coastguard Worker return 0;
560*c8dee2aaSAndroid Build Coastguard Worker }
561*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
562*c8dee2aaSAndroid Build Coastguard Worker }
563*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatIsPackedDepthStencil(GrGLFormat format)564*c8dee2aaSAndroid Build Coastguard Worker static constexpr bool GrGLFormatIsPackedDepthStencil(GrGLFormat format) {
565*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
566*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8:
567*c8dee2aaSAndroid Build Coastguard Worker return true;
568*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8:
569*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2:
570*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1:
571*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1:
572*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8:
573*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8:
574*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8:
575*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8:
576*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8:
577*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8:
578*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565:
579*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F:
580*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F:
581*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F:
582*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8:
583*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8:
584*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8:
585*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2:
586*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4:
587*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8:
588*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16:
589*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16:
590*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16:
591*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F:
592*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8:
593*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16:
594*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown:
595*c8dee2aaSAndroid Build Coastguard Worker return false;
596*c8dee2aaSAndroid Build Coastguard Worker }
597*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
598*c8dee2aaSAndroid Build Coastguard Worker }
599*c8dee2aaSAndroid Build Coastguard Worker
GrGLFormatIsSRGB(GrGLFormat format)600*c8dee2aaSAndroid Build Coastguard Worker static constexpr bool GrGLFormatIsSRGB(GrGLFormat format) {
601*c8dee2aaSAndroid Build Coastguard Worker switch (format) {
602*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSRGB8_ALPHA8:
603*c8dee2aaSAndroid Build Coastguard Worker return true;
604*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_ETC1_RGB8:
605*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_ETC2:
606*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGB8_BC1:
607*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kCOMPRESSED_RGBA8_BC1:
608*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA8:
609*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR8:
610*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kALPHA8:
611*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8:
612*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE8_ALPHA8:
613*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kBGRA8:
614*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB565:
615*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16F:
616*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16F:
617*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kLUMINANCE16F:
618*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB8:
619*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBX8:
620*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG8:
621*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGB10_A2:
622*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA4:
623*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kR16:
624*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16:
625*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRGBA16:
626*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kRG16F:
627*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX8:
628*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kSTENCIL_INDEX16:
629*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kDEPTH24_STENCIL8:
630*c8dee2aaSAndroid Build Coastguard Worker case GrGLFormat::kUnknown:
631*c8dee2aaSAndroid Build Coastguard Worker return false;
632*c8dee2aaSAndroid Build Coastguard Worker }
633*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE;
634*c8dee2aaSAndroid Build Coastguard Worker }
635*c8dee2aaSAndroid Build Coastguard Worker
636*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DEBUG) || defined(GPU_TEST_UTILS)
GrGLFormatToStr(GrGLenum glFormat)637*c8dee2aaSAndroid Build Coastguard Worker static constexpr const char* GrGLFormatToStr(GrGLenum glFormat) {
638*c8dee2aaSAndroid Build Coastguard Worker switch (glFormat) {
639*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA8: return "RGBA8";
640*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R8: return "R8";
641*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_ALPHA8: return "ALPHA8";
642*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE8: return "LUMINANCE8";
643*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE8_ALPHA8: return "LUMINANCE8_ALPHA8";
644*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_BGRA8: return "BGRA8";
645*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB565: return "RGB565";
646*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA16F: return "RGBA16F";
647*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_LUMINANCE16F: return "LUMINANCE16F";
648*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R16F: return "R16F";
649*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB8: return "RGB8";
650*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG8: return "RG8";
651*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGB10_A2: return "RGB10_A2";
652*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA4: return "RGBA4";
653*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA32F: return "RGBA32F";
654*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_SRGB8_ALPHA8: return "SRGB8_ALPHA8";
655*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_ETC1_RGB8: return "ETC1";
656*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGB8_ETC2: return "ETC2";
657*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return "RGB8_BC1";
658*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return "RGBA8_BC1";
659*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_R16: return "R16";
660*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG16: return "RG16";
661*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RGBA16: return "RGBA16";
662*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_RG16F: return "RG16F";
663*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_STENCIL_INDEX8: return "STENCIL_INDEX8";
664*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_STENCIL_INDEX16: return "STENCIL_INDEX16";
665*c8dee2aaSAndroid Build Coastguard Worker case GR_GL_DEPTH24_STENCIL8: return "DEPTH24_STENCIL8";
666*c8dee2aaSAndroid Build Coastguard Worker
667*c8dee2aaSAndroid Build Coastguard Worker default: return "Unknown";
668*c8dee2aaSAndroid Build Coastguard Worker }
669*c8dee2aaSAndroid Build Coastguard Worker }
670*c8dee2aaSAndroid Build Coastguard Worker #endif
671*c8dee2aaSAndroid Build Coastguard Worker
672*c8dee2aaSAndroid Build Coastguard Worker GrGLenum GrToGLStencilFunc(GrStencilTest test);
673*c8dee2aaSAndroid Build Coastguard Worker
674*c8dee2aaSAndroid Build Coastguard Worker /**
675*c8dee2aaSAndroid Build Coastguard Worker * Returns true if the format is compressed.
676*c8dee2aaSAndroid Build Coastguard Worker */
677*c8dee2aaSAndroid Build Coastguard Worker bool GrGLFormatIsCompressed(GrGLFormat);
678*c8dee2aaSAndroid Build Coastguard Worker
679*c8dee2aaSAndroid Build Coastguard Worker #endif
680