/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLUtil_DEFINED #define GrGLUtil_DEFINED #include "include/gpu/gl/GrGLInterface.h" #include "include/private/GrTypesPriv.h" #include "include/private/SkImageInfoPriv.h" #include "src/gpu/GrDataUtils.h" #include "src/gpu/GrStencilSettings.h" #include "src/gpu/gl/GrGLDefines.h" class SkMatrix; //////////////////////////////////////////////////////////////////////////////// typedef uint32_t GrGLVersion; typedef uint32_t GrGLSLVersion; typedef uint64_t GrGLDriverVersion; #define GR_GL_VER(major, minor) ((static_cast(major) << 16) | \ static_cast(minor)) #define GR_GLSL_VER(major, minor) ((static_cast(major) << 16) | \ static_cast(minor)) #define GR_GL_DRIVER_VER(major, minor, point) ((static_cast(major) << 32) | \ (static_cast(minor) << 16) | \ static_cast(point)) #define GR_GL_MAJOR_VER(version) (static_cast(version) >> 16) #define GR_GL_MINOR_VER(version) (static_cast(version) & 0xFFFF) #define GR_GL_INVALID_VER GR_GL_VER(0, 0) #define GR_GLSL_INVALID_VER GR_GLSL_VER(0, 0) #define GR_GL_DRIVER_UNKNOWN_VER GR_GL_DRIVER_VER(0, 0, 0) static constexpr uint32_t GrGLFormatChannels(GrGLFormat format) { switch (format) { case GrGLFormat::kUnknown: return 0; case GrGLFormat::kRGBA8: return kRGBA_SkColorChannelFlags; case GrGLFormat::kR8: return kRed_SkColorChannelFlag; case GrGLFormat::kALPHA8: return kAlpha_SkColorChannelFlag; case GrGLFormat::kLUMINANCE8: return kGray_SkColorChannelFlag; case GrGLFormat::kLUMINANCE8_ALPHA8: return kGrayAlpha_SkColorChannelFlags; case GrGLFormat::kBGRA8: return kRGBA_SkColorChannelFlags; case GrGLFormat::kRGB565: return kRGB_SkColorChannelFlags; case GrGLFormat::kRGBA16F: return kRGBA_SkColorChannelFlags; case GrGLFormat::kR16F: return kRed_SkColorChannelFlag; case GrGLFormat::kRGB8: return kRGB_SkColorChannelFlags; case GrGLFormat::kRG8: return kRG_SkColorChannelFlags; case GrGLFormat::kRGB10_A2: return kRGBA_SkColorChannelFlags; case GrGLFormat::kRGBA4: return kRGBA_SkColorChannelFlags; case GrGLFormat::kSRGB8_ALPHA8: return kRGBA_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return kRGB_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return kRGB_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_RGB8_BC1: return kRGB_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return kRGBA_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: return kRGBA_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: return kRGBA_SkColorChannelFlags; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: return kRGBA_SkColorChannelFlags; case GrGLFormat::kR16: return kRed_SkColorChannelFlag; case GrGLFormat::kRG16: return kRG_SkColorChannelFlags; case GrGLFormat::kRGBA16: return kRGBA_SkColorChannelFlags; case GrGLFormat::kRG16F: return kRG_SkColorChannelFlags; case GrGLFormat::kLUMINANCE16F: return kGray_SkColorChannelFlag; case GrGLFormat::kSTENCIL_INDEX8: return 0; case GrGLFormat::kSTENCIL_INDEX16: return 0; case GrGLFormat::kDEPTH24_STENCIL8: return 0; } SkUNREACHABLE; } static constexpr GrColorFormatDesc GrGLFormatDesc(GrGLFormat format) { switch (format) { case GrGLFormat::kUnknown: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kRGBA8: return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kR8: return GrColorFormatDesc::MakeR(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kALPHA8: return GrColorFormatDesc::MakeAlpha(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kLUMINANCE8: return GrColorFormatDesc::MakeGray(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kLUMINANCE8_ALPHA8: return GrColorFormatDesc::MakeGrayAlpha(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kBGRA8: return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRGB565: return GrColorFormatDesc::MakeRGB(5, 6, 5, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRGBA16F: return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kFloat); case GrGLFormat::kR16F: return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kFloat); case GrGLFormat::kRGB8: return GrColorFormatDesc::MakeRGB(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRG8: return GrColorFormatDesc::MakeRG(8, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRGB10_A2: return GrColorFormatDesc::MakeRGBA(10, 2, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRGBA4: return GrColorFormatDesc::MakeRGBA(4, GrColorTypeEncoding::kUnorm); case GrGLFormat::kSRGB8_ALPHA8: return GrColorFormatDesc::MakeRGBA(8, GrColorTypeEncoding::kSRGBUnorm); case GrGLFormat::kR16: return GrColorFormatDesc::MakeR(16, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRG16: return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRGBA16: return GrColorFormatDesc::MakeRGBA(16, GrColorTypeEncoding::kUnorm); case GrGLFormat::kRG16F: return GrColorFormatDesc::MakeRG(16, GrColorTypeEncoding::kFloat); case GrGLFormat::kLUMINANCE16F: return GrColorFormatDesc::MakeGray(16, GrColorTypeEncoding::kFloat); // Compressed texture formats are not expected to have a description. case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_RGB8_BC1: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: return GrColorFormatDesc::MakeInvalid(); // This type only describes color channels. case GrGLFormat::kSTENCIL_INDEX8: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kSTENCIL_INDEX16: return GrColorFormatDesc::MakeInvalid(); case GrGLFormat::kDEPTH24_STENCIL8: return GrColorFormatDesc::MakeInvalid(); } SkUNREACHABLE; } /** * The Vendor and Renderer enum values are lazily updated as required. */ enum class GrGLVendor { kARM, kGoogle, kImagination, kIntel, kQualcomm, kNVIDIA, kATI, kOther }; enum class GrGLRenderer { kTegra_PreK1, // Legacy Tegra architecture (pre-K1). kTegra, // Tegra with the same architecture as NVIDIA desktop GPUs (K1+). kPowerVR54x, kPowerVRRogue, kAdreno3xx, kAdreno430, kAdreno4xx_other, kAdreno530, kAdreno5xx_other, kAdreno615, // Pixel3a kAdreno620, // Pixel5 kAdreno630, // Pixel3 kAdreno640, // Pixel4 kAdreno6xx_other, kGoogleSwiftShader, /** Intel GPU families, ordered by generation **/ // 6th gen kIntelSandyBridge, // 7th gen kIntelIvyBridge, kIntelValleyView, // aka BayTrail kIntelHaswell, // 8th gen kIntelCherryView, // aka Braswell kIntelBroadwell, // 9th gen kIntelApolloLake, kIntelSkyLake, kIntelGeminiLake, kIntelKabyLake, kIntelCoffeeLake, // 11th gen kIntelIceLake, kGalliumLLVM, kVirgl, kMali4xx, /** G-3x, G-5x, or G-7x */ kMaliG, /** T-6xx, T-7xx, or T-8xx */ kMaliT, kAMDRadeonHD7xxx, // AMD Radeon HD 7000 Series kAMDRadeonR9M3xx, // AMD Radeon R9 M300 Series kAMDRadeonR9M4xx, // AMD Radeon R9 M400 Series kAMDRadeonPro5xxx, // AMD Radeon Pro 5000 Series kAMDRadeonProVegaxx, // AMD Radeon Pro Vega kOther }; enum class GrGLDriver { kMesa, kNVIDIA, kIntel, kSwiftShader, kQualcomm, kFreedreno, kAndroidEmulator, kImagination, kARM, kUnknown }; enum class GrGLANGLEBackend { kUnknown, kD3D9, kD3D11, kOpenGL }; //////////////////////////////////////////////////////////////////////////////// /** * Some drivers want the var-int arg to be zero-initialized on input. */ #define GR_GL_INIT_ZERO 0 #define GR_GL_GetIntegerv(gl, e, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetIntegerv(e, p)); \ } while (0) #define GR_GL_GetFramebufferAttachmentParameteriv(gl, t, a, pname, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetFramebufferAttachmentParameteriv(t, a, pname, p)); \ } while (0) #define GR_GL_GetInternalformativ(gl, t, f, n, s, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetInternalformativ(t, f, n, s, p)); \ } while (0) #define GR_GL_GetNamedFramebufferAttachmentParameteriv(gl, fb, a, pname, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetNamedFramebufferAttachmentParameteriv(fb, a, pname, p)); \ } while (0) #define GR_GL_GetRenderbufferParameteriv(gl, t, pname, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetRenderbufferParameteriv(t, pname, p)); \ } while (0) #define GR_GL_GetTexLevelParameteriv(gl, t, l, pname, p) \ do { \ *(p) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetTexLevelParameteriv(t, l, pname, p)); \ } while (0) #define GR_GL_GetShaderPrecisionFormat(gl, st, pt, range, precision) \ do { \ (range)[0] = GR_GL_INIT_ZERO; \ (range)[1] = GR_GL_INIT_ZERO; \ (*precision) = GR_GL_INIT_ZERO; \ GR_GL_CALL(gl, GetShaderPrecisionFormat(st, pt, range, precision)); \ } while (0) //////////////////////////////////////////////////////////////////////////////// GrGLStandard GrGLGetStandardInUseFromString(const char* versionString); GrGLSLVersion GrGLGetVersion(const GrGLInterface*); GrGLSLVersion GrGLGetVersionFromString(const char*); struct GrGLDriverInfo { GrGLStandard fStandard = kNone_GrGLStandard; GrGLVersion fVersion = GR_GL_INVALID_VER; GrGLSLVersion fGLSLVersion = GR_GLSL_INVALID_VER; GrGLVendor fVendor = GrGLVendor::kOther; GrGLRenderer fRenderer = GrGLRenderer::kOther; GrGLDriver fDriver = GrGLDriver::kUnknown; GrGLDriverVersion fDriverVersion = GR_GL_DRIVER_UNKNOWN_VER; GrGLANGLEBackend fANGLEBackend = GrGLANGLEBackend::kUnknown; GrGLVendor fANGLEVendor = GrGLVendor::kOther; GrGLRenderer fANGLERenderer = GrGLRenderer::kOther; GrGLDriver fANGLEDriver = GrGLDriver::kUnknown; GrGLDriverVersion fANGLEDriverVersion = GR_GL_DRIVER_UNKNOWN_VER; // Are we running over the Chrome interprocess command buffer? bool fIsOverCommandBuffer = false; }; GrGLDriverInfo GrGLGetDriverInfo(const GrGLInterface*); /** * Helpers for glGetError() */ void GrGLCheckErr(const GrGLInterface* gl, const char* location, const char* call); //////////////////////////////////////////////////////////////////////////////// /** * Macros for using GrGLInterface to make GL calls */ // Conditionally checks glGetError based on compile-time and run-time flags. #if GR_GL_CHECK_ERROR extern bool gCheckErrorGL; #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \ do { \ if (gCheckErrorGL) { \ IFACE->checkError(GR_FILE_AND_LINE_STR, #X); \ } \ } while (false) #else #define GR_GL_CHECK_ERROR_IMPL(IFACE, X) \ do { \ } while (false) #endif // internal macro to conditionally log the gl call using SkDebugf based on // compile-time and run-time flags. #if GR_GL_LOG_CALLS extern bool gLogCallsGL; #define GR_GL_LOG_CALLS_IMPL(X) \ if (gLogCallsGL) \ SkDebugf(GR_FILE_AND_LINE_STR "GL: " #X "\n") #else #define GR_GL_LOG_CALLS_IMPL(X) #endif // makes a GL call on the interface and does any error checking and logging #define GR_GL_CALL(IFACE, X) \ do { \ GR_GL_CALL_NOERRCHECK(IFACE, X); \ GR_GL_CHECK_ERROR_IMPL(IFACE, X); \ } while (false) // Variant of above that always skips the error check. This is useful when // the caller wants to do its own glGetError() call and examine the error value. #define GR_GL_CALL_NOERRCHECK(IFACE, X) \ do { \ (IFACE)->fFunctions.f##X; \ GR_GL_LOG_CALLS_IMPL(X); \ } while (false) // same as GR_GL_CALL but stores the return value of the gl call in RET #define GR_GL_CALL_RET(IFACE, RET, X) \ do { \ GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X); \ GR_GL_CHECK_ERROR_IMPL(IFACE, X); \ } while (false) // same as GR_GL_CALL_RET but always skips the error check. #define GR_GL_CALL_RET_NOERRCHECK(IFACE, RET, X) \ do { \ (RET) = (IFACE)->fFunctions.f##X; \ GR_GL_LOG_CALLS_IMPL(X); \ } while (false) static constexpr GrGLFormat GrGLFormatFromGLEnum(GrGLenum glFormat) { switch (glFormat) { case GR_GL_RGBA8: return GrGLFormat::kRGBA8; case GR_GL_R8: return GrGLFormat::kR8; case GR_GL_ALPHA8: return GrGLFormat::kALPHA8; case GR_GL_LUMINANCE8: return GrGLFormat::kLUMINANCE8; case GR_GL_LUMINANCE8_ALPHA8: return GrGLFormat::kLUMINANCE8_ALPHA8; case GR_GL_BGRA8: return GrGLFormat::kBGRA8; case GR_GL_RGB565: return GrGLFormat::kRGB565; case GR_GL_RGBA16F: return GrGLFormat::kRGBA16F; case GR_GL_LUMINANCE16F: return GrGLFormat::kLUMINANCE16F; case GR_GL_R16F: return GrGLFormat::kR16F; case GR_GL_RGB8: return GrGLFormat::kRGB8; case GR_GL_RG8: return GrGLFormat::kRG8; case GR_GL_RGB10_A2: return GrGLFormat::kRGB10_A2; case GR_GL_RGBA4: return GrGLFormat::kRGBA4; case GR_GL_SRGB8_ALPHA8: return GrGLFormat::kSRGB8_ALPHA8; case GR_GL_COMPRESSED_ETC1_RGB8: return GrGLFormat::kCOMPRESSED_ETC1_RGB8; case GR_GL_COMPRESSED_RGB8_ETC2: return GrGLFormat::kCOMPRESSED_RGB8_ETC2; case GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return GrGLFormat::kCOMPRESSED_RGB8_BC1; case GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return GrGLFormat::kCOMPRESSED_RGBA8_BC1; case GR_GL_COMPRESSED_RGBA_ASTC_4x4: return GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4; case GR_GL_COMPRESSED_RGBA_ASTC_6x6: return GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6; case GR_GL_COMPRESSED_RGBA_ASTC_8x8: return GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8; case GR_GL_R16: return GrGLFormat::kR16; case GR_GL_RG16: return GrGLFormat::kRG16; case GR_GL_RGBA16: return GrGLFormat::kRGBA16; case GR_GL_RG16F: return GrGLFormat::kRG16F; case GR_GL_STENCIL_INDEX8: return GrGLFormat::kSTENCIL_INDEX8; case GR_GL_STENCIL_INDEX16: return GrGLFormat::kSTENCIL_INDEX16; case GR_GL_DEPTH24_STENCIL8: return GrGLFormat::kDEPTH24_STENCIL8; default: return GrGLFormat::kUnknown; } } /** Returns either the sized internal format or compressed internal format of the GrGLFormat. */ static constexpr GrGLenum GrGLFormatToEnum(GrGLFormat format) { switch (format) { case GrGLFormat::kRGBA8: return GR_GL_RGBA8; case GrGLFormat::kR8: return GR_GL_R8; case GrGLFormat::kALPHA8: return GR_GL_ALPHA8; case GrGLFormat::kLUMINANCE8: return GR_GL_LUMINANCE8; case GrGLFormat::kLUMINANCE8_ALPHA8: return GR_GL_LUMINANCE8_ALPHA8; case GrGLFormat::kBGRA8: return GR_GL_BGRA8; case GrGLFormat::kRGB565: return GR_GL_RGB565; case GrGLFormat::kRGBA16F: return GR_GL_RGBA16F; case GrGLFormat::kLUMINANCE16F: return GR_GL_LUMINANCE16F; case GrGLFormat::kR16F: return GR_GL_R16F; case GrGLFormat::kRGB8: return GR_GL_RGB8; case GrGLFormat::kRG8: return GR_GL_RG8; case GrGLFormat::kRGB10_A2: return GR_GL_RGB10_A2; case GrGLFormat::kRGBA4: return GR_GL_RGBA4; case GrGLFormat::kSRGB8_ALPHA8: return GR_GL_SRGB8_ALPHA8; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return GR_GL_COMPRESSED_ETC1_RGB8; case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return GR_GL_COMPRESSED_RGB8_ETC2; case GrGLFormat::kCOMPRESSED_RGB8_BC1: return GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT; case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: return GR_GL_COMPRESSED_RGBA_ASTC_4x4; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: return GR_GL_COMPRESSED_RGBA_ASTC_6x6; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: return GR_GL_COMPRESSED_RGBA_ASTC_8x8; case GrGLFormat::kR16: return GR_GL_R16; case GrGLFormat::kRG16: return GR_GL_RG16; case GrGLFormat::kRGBA16: return GR_GL_RGBA16; case GrGLFormat::kRG16F: return GR_GL_RG16F; case GrGLFormat::kSTENCIL_INDEX8: return GR_GL_STENCIL_INDEX8; case GrGLFormat::kSTENCIL_INDEX16: return GR_GL_STENCIL_INDEX16; case GrGLFormat::kDEPTH24_STENCIL8: return GR_GL_DEPTH24_STENCIL8; case GrGLFormat::kUnknown: return 0; } SkUNREACHABLE; } static constexpr size_t GrGLFormatBytesPerBlock(GrGLFormat format) { switch (format) { case GrGLFormat::kRGBA8: return 4; case GrGLFormat::kR8: return 1; case GrGLFormat::kALPHA8: return 1; case GrGLFormat::kLUMINANCE8: return 1; case GrGLFormat::kLUMINANCE8_ALPHA8: return 2; case GrGLFormat::kBGRA8: return 4; case GrGLFormat::kRGB565: return 2; case GrGLFormat::kRGBA16F: return 8; case GrGLFormat::kLUMINANCE16F: return 2; case GrGLFormat::kR16F: return 2; // We assume the GPU stores this format 4 byte aligned case GrGLFormat::kRGB8: return 4; case GrGLFormat::kRG8: return 2; case GrGLFormat::kRGB10_A2: return 4; case GrGLFormat::kRGBA4: return 2; case GrGLFormat::kSRGB8_ALPHA8: return 4; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: return 8; case GrGLFormat::kCOMPRESSED_RGB8_ETC2: return 8; case GrGLFormat::kCOMPRESSED_RGB8_BC1: return 8; case GrGLFormat::kCOMPRESSED_RGBA8_BC1: return 8; // Each ASTC pixel block occupying 16 bytes case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: return 16; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: return 16; case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: return 16; case GrGLFormat::kR16: return 2; case GrGLFormat::kRG16: return 4; case GrGLFormat::kRGBA16: return 8; case GrGLFormat::kRG16F: return 4; case GrGLFormat::kSTENCIL_INDEX8: return 1; case GrGLFormat::kSTENCIL_INDEX16: return 2; case GrGLFormat::kDEPTH24_STENCIL8: return 4; case GrGLFormat::kUnknown: return 0; } SkUNREACHABLE; } static constexpr int GrGLFormatStencilBits(GrGLFormat format) { switch (format) { case GrGLFormat::kSTENCIL_INDEX8: return 8; case GrGLFormat::kSTENCIL_INDEX16: return 16; case GrGLFormat::kDEPTH24_STENCIL8: return 8; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: case GrGLFormat::kCOMPRESSED_RGB8_ETC2: case GrGLFormat::kCOMPRESSED_RGB8_BC1: case GrGLFormat::kCOMPRESSED_RGBA8_BC1: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: case GrGLFormat::kRGBA8: case GrGLFormat::kR8: case GrGLFormat::kALPHA8: case GrGLFormat::kLUMINANCE8: case GrGLFormat::kLUMINANCE8_ALPHA8: case GrGLFormat::kBGRA8: case GrGLFormat::kRGB565: case GrGLFormat::kRGBA16F: case GrGLFormat::kR16F: case GrGLFormat::kLUMINANCE16F: case GrGLFormat::kRGB8: case GrGLFormat::kRG8: case GrGLFormat::kRGB10_A2: case GrGLFormat::kRGBA4: case GrGLFormat::kSRGB8_ALPHA8: case GrGLFormat::kR16: case GrGLFormat::kRG16: case GrGLFormat::kRGBA16: case GrGLFormat::kRG16F: case GrGLFormat::kUnknown: return 0; } SkUNREACHABLE; } static constexpr bool GrGLFormatIsPackedDepthStencil(GrGLFormat format) { switch (format) { case GrGLFormat::kDEPTH24_STENCIL8: return true; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: case GrGLFormat::kCOMPRESSED_RGB8_ETC2: case GrGLFormat::kCOMPRESSED_RGB8_BC1: case GrGLFormat::kCOMPRESSED_RGBA8_BC1: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: case GrGLFormat::kRGBA8: case GrGLFormat::kR8: case GrGLFormat::kALPHA8: case GrGLFormat::kLUMINANCE8: case GrGLFormat::kLUMINANCE8_ALPHA8: case GrGLFormat::kBGRA8: case GrGLFormat::kRGB565: case GrGLFormat::kRGBA16F: case GrGLFormat::kR16F: case GrGLFormat::kLUMINANCE16F: case GrGLFormat::kRGB8: case GrGLFormat::kRG8: case GrGLFormat::kRGB10_A2: case GrGLFormat::kRGBA4: case GrGLFormat::kSRGB8_ALPHA8: case GrGLFormat::kR16: case GrGLFormat::kRG16: case GrGLFormat::kRGBA16: case GrGLFormat::kRG16F: case GrGLFormat::kSTENCIL_INDEX8: case GrGLFormat::kSTENCIL_INDEX16: case GrGLFormat::kUnknown: return false; } SkUNREACHABLE; } static constexpr bool GrGLFormatIsSRGB(GrGLFormat format) { switch (format) { case GrGLFormat::kSRGB8_ALPHA8: return true; case GrGLFormat::kCOMPRESSED_ETC1_RGB8: case GrGLFormat::kCOMPRESSED_RGB8_ETC2: case GrGLFormat::kCOMPRESSED_RGB8_BC1: case GrGLFormat::kCOMPRESSED_RGBA8_BC1: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_4x4: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_6x6: case GrGLFormat::kCOMPRESSED_ASTC_RGBA8_8x8: case GrGLFormat::kRGBA8: case GrGLFormat::kR8: case GrGLFormat::kALPHA8: case GrGLFormat::kLUMINANCE8: case GrGLFormat::kLUMINANCE8_ALPHA8: case GrGLFormat::kBGRA8: case GrGLFormat::kRGB565: case GrGLFormat::kRGBA16F: case GrGLFormat::kR16F: case GrGLFormat::kLUMINANCE16F: case GrGLFormat::kRGB8: case GrGLFormat::kRG8: case GrGLFormat::kRGB10_A2: case GrGLFormat::kRGBA4: case GrGLFormat::kR16: case GrGLFormat::kRG16: case GrGLFormat::kRGBA16: case GrGLFormat::kRG16F: case GrGLFormat::kSTENCIL_INDEX8: case GrGLFormat::kSTENCIL_INDEX16: case GrGLFormat::kDEPTH24_STENCIL8: case GrGLFormat::kUnknown: return false; } SkUNREACHABLE; } #if defined(SK_DEBUG) || GR_TEST_UTILS static constexpr const char* GrGLFormatToStr(GrGLenum glFormat) { switch (glFormat) { case GR_GL_RGBA8: return "RGBA8"; case GR_GL_R8: return "R8"; case GR_GL_ALPHA8: return "ALPHA8"; case GR_GL_LUMINANCE8: return "LUMINANCE8"; case GR_GL_LUMINANCE8_ALPHA8: return "LUMINANCE8_ALPHA8"; case GR_GL_BGRA8: return "BGRA8"; case GR_GL_RGB565: return "RGB565"; case GR_GL_RGBA16F: return "RGBA16F"; case GR_GL_LUMINANCE16F: return "LUMINANCE16F"; case GR_GL_R16F: return "R16F"; case GR_GL_RGB8: return "RGB8"; case GR_GL_RG8: return "RG8"; case GR_GL_RGB10_A2: return "RGB10_A2"; case GR_GL_RGBA4: return "RGBA4"; case GR_GL_RGBA32F: return "RGBA32F"; case GR_GL_SRGB8_ALPHA8: return "SRGB8_ALPHA8"; case GR_GL_COMPRESSED_ETC1_RGB8: return "ETC1"; case GR_GL_COMPRESSED_RGB8_ETC2: return "ETC2"; case GR_GL_COMPRESSED_RGB_S3TC_DXT1_EXT: return "RGB8_BC1"; case GR_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: return "RGBA8_BC1"; case GR_GL_COMPRESSED_RGBA_ASTC_4x4: return "ASTC_4x4"; case GR_GL_COMPRESSED_RGBA_ASTC_6x6: return "ASTC_6x6"; case GR_GL_COMPRESSED_RGBA_ASTC_8x8: return "ASTC_8x8"; case GR_GL_R16: return "R16"; case GR_GL_RG16: return "RG16"; case GR_GL_RGBA16: return "RGBA16"; case GR_GL_RG16F: return "RG16F"; case GR_GL_STENCIL_INDEX8: return "STENCIL_INDEX8"; case GR_GL_STENCIL_INDEX16: return "STENCIL_INDEX16"; case GR_GL_DEPTH24_STENCIL8: return "DEPTH24_STENCIL8"; default: return "Unknown"; } } #endif GrGLenum GrToGLStencilFunc(GrStencilTest test); /** * Returns true if the format is compressed. */ bool GrGLFormatIsCompressed(GrGLFormat); #endif