Index: src/gpu/gl/GrGLCaps.cpp |
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp |
index c568646db6b37e189ca25777b5ab015bdef4601e..923c392d31b110d535665a8885c41bf572a9ec4c 100644 |
--- a/src/gpu/gl/GrGLCaps.cpp |
+++ b/src/gpu/gl/GrGLCaps.cpp |
@@ -20,14 +20,11 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions, |
fStencilFormats.reset(); |
fMSFBOType = kNone_MSFBOType; |
fInvalidateFBType = kNone_InvalidateFBType; |
- fLATCAlias = kLATC_LATCAlias; |
fMapBufferType = kNone_MapBufferType; |
fTransferBufferType = kNone_TransferBufferType; |
fMaxFragmentUniformVectors = 0; |
fMaxVertexAttributes = 0; |
fMaxFragmentTextureUnits = 0; |
- fRGBA8RenderbufferSupport = false; |
- fBGRAIsInternalFormat = false; |
fUnpackRowLengthSupport = false; |
fUnpackFlipYSupport = false; |
fPackRowLengthSupport = false; |
@@ -82,14 +79,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &fMaxFragmentTextureUnits); |
if (kGL_GrGLStandard == standard) { |
- fRGBA8RenderbufferSupport = true; |
- } else { |
- fRGBA8RenderbufferSupport = version >= GR_GL_VER(3,0) || |
- ctxInfo.hasExtension("GL_OES_rgb8_rgba8") || |
- ctxInfo.hasExtension("GL_ARM_rgba8"); |
- } |
- |
- if (kGL_GrGLStandard == standard) { |
fUnpackRowLengthSupport = true; |
fUnpackFlipYSupport = false; |
fPackRowLengthSupport = true; |
@@ -141,28 +130,6 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
fImagingSupport = kGL_GrGLStandard == standard && |
ctxInfo.hasExtension("GL_ARB_imaging"); |
- // We only enable srgb support if both textures and FBOs support srgb. |
- bool srgbSupport = false; |
- if (kGL_GrGLStandard == standard) { |
- if (ctxInfo.version() >= GR_GL_VER(3,0)) { |
- srgbSupport = true; |
- } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) { |
- if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") || |
- ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) { |
- srgbSupport = true; |
- } |
- } |
- // All the above srgb extensions support toggling srgb writes |
- fSRGBWriteControl = srgbSupport; |
- } else { |
- // See https://bug.skia.org/4148 for PowerVR issue. |
- srgbSupport = kPowerVRRogue_GrGLRenderer != ctxInfo.renderer() && |
- (ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_sRGB")); |
- // ES through 3.1 requires EXT_srgb_write_control to support toggling |
- // sRGB writing for destinations. |
- fSRGBWriteControl = ctxInfo.hasExtension("GL_EXT_sRGB_write_control"); |
- } |
- |
// SGX and Mali GPUs that are based on a tiled-deferred architecture that have trouble with |
// frequently changing VBOs. We've measured a performance increase using non-VBO vertex |
// data for dynamic content on these GPUs. Perhaps we should read the renderer string and |
@@ -469,13 +436,12 @@ void GrGLCaps::init(const GrContextOptions& contextOptions, |
ctxInfo.hasExtension("GL_EXT_instanced_arrays")); |
} |
- this->initConfigTexturableTable(ctxInfo, gli, srgbSupport); |
- this->initConfigRenderableTable(ctxInfo, srgbSupport); |
this->initShaderPrecisionTable(ctxInfo, gli, glslCaps); |
// Requires fTexutreSwizzleSupport and fTextureRedSupport to be set before this point. |
this->initConfigSwizzleTable(ctxInfo, glslCaps); |
- // Requires various members are already correctly initialized (e.g. fTextureRedSupport). |
- this->initConfigTable(ctxInfo); |
+ // Requires various members are already correctly initialized (e.g. fTextureRedSupport, |
+ // msaa support). |
+ this->initConfigTable(ctxInfo, gli); |
this->applyOptionsOverrides(contextOptions); |
glslCaps->applyOptionsOverrides(contextOptions); |
@@ -645,313 +611,6 @@ bool GrGLCaps::hasPathRenderingSupport(const GrGLContextInfo& ctxInfo, const GrG |
} |
return true; |
} |
- |
-void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo, bool srgbSupport) { |
- // OpenGL < 3.0 |
- // no support for render targets unless the GL_ARB_framebuffer_object |
- // extension is supported (in which case we get ALPHA, RED, RG, RGB, |
- // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we |
- // probably don't get R8 in this case. |
- |
- // OpenGL 3.0 |
- // base color renderable: ALPHA, RED, RG, RGB, and RGBA |
- // sized derivatives: ALPHA8, R8, RGBA4, RGBA8 |
- |
- // >= OpenGL 3.1 |
- // base color renderable: RED, RG, RGB, and RGBA |
- // sized derivatives: R8, RGBA4, RGBA8 |
- // if the GL_ARB_compatibility extension is supported then we get back |
- // support for GL_ALPHA and ALPHA8 |
- |
- // GL_EXT_bgra adds BGRA render targets to any version |
- |
- // ES 2.0 |
- // color renderable: RGBA4, RGB5_A1, RGB565 |
- // GL_EXT_texture_rg adds support for R8 as a color render target |
- // GL_OES_rgb8_rgba8 and/or GL_ARM_rgba8 adds support for RGBA8 |
- // GL_EXT_texture_format_BGRA8888 and/or GL_APPLE_texture_format_BGRA8888 added BGRA support |
- |
- // ES 3.0 |
- // Same as ES 2.0 except R8 and RGBA8 are supported without extensions (the functions called |
- // below already account for this). |
- |
- GrGLStandard standard = ctxInfo.standard(); |
- |
- enum { |
- kNo_MSAA = 0, |
- kYes_MSAA = 1, |
- }; |
- |
- if (kGL_GrGLStandard == standard) { |
- // Post 3.0 we will get R8 |
- // Prior to 3.0 we will get ALPHA8 (with GL_ARB_framebuffer_object) |
- if (ctxInfo.version() >= GR_GL_VER(3,0) || |
- ctxInfo.hasExtension("GL_ARB_framebuffer_object")) { |
- fConfigRenderSupport[kAlpha_8_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kAlpha_8_GrPixelConfig][kYes_MSAA] = true; |
- } |
- } else { |
- // On ES we can only hope for R8 |
- fConfigRenderSupport[kAlpha_8_GrPixelConfig][kNo_MSAA] = fTextureRedSupport; |
- fConfigRenderSupport[kAlpha_8_GrPixelConfig][kYes_MSAA] = fTextureRedSupport; |
- } |
- |
- if (kGL_GrGLStandard != standard) { |
- // only available in ES |
- fConfigRenderSupport[kRGB_565_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kRGB_565_GrPixelConfig][kYes_MSAA] = true; |
- } |
- |
- // we no longer support 444 as a render target |
- fConfigRenderSupport[kRGBA_4444_GrPixelConfig][kNo_MSAA] = false; |
- fConfigRenderSupport[kRGBA_4444_GrPixelConfig][kYes_MSAA] = false; |
- |
- if (this->fRGBA8RenderbufferSupport) { |
- fConfigRenderSupport[kRGBA_8888_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kRGBA_8888_GrPixelConfig][kYes_MSAA] = true; |
- } |
- |
- if (this->isConfigTexturable(kBGRA_8888_GrPixelConfig)) { |
- // On iOS, BGRA is not supported as a renderable target on ES 3.0+ |
- if (!ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888") || |
- ctxInfo.version() < GR_GL_VER(3,0)) { |
- fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kNo_MSAA] = true; |
- // The GL_EXT_texture_format_BGRA8888 extension does not add BGRA to the list of |
- // configs that are color-renderable and can be passed to |
- // glRenderBufferStorageMultisample. Chromium may have an extension to allow BGRA |
- // renderbuffers to work on desktop platforms. |
- if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888")) { |
- fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kYes_MSAA] = true; |
- } else { |
- fConfigRenderSupport[kBGRA_8888_GrPixelConfig][kYes_MSAA] = |
- !fBGRAIsInternalFormat || !this->usesMSAARenderBuffers(); |
- } |
- } |
- } |
- |
- if (this->fRGBA8RenderbufferSupport && srgbSupport) { |
- fConfigRenderSupport[kSRGBA_8888_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kSRGBA_8888_GrPixelConfig][kYes_MSAA] = true; |
- } |
- |
- if (this->isConfigTexturable(kRGBA_float_GrPixelConfig)) { |
- if (kGL_GrGLStandard == standard) { |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = true; |
- } else { |
- // for now we only enable this on desktop, because on ES we'd have to solve many |
- // precision issues and no clients actually want this yet |
- /* |
- if (ctxInfo.hasExtension("GL_EXT_color_buffer_float")) { |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = true; |
- } else { |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = false; |
- } |
- // for now we don't support floating point MSAA on ES |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = false;*/ |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = false; |
- fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = false; |
- } |
- } |
- |
- if (this->isConfigTexturable(kAlpha_half_GrPixelConfig)) { |
- if (kGL_GrGLStandard == standard) { |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = true; |
- } else if (ctxInfo.version() >= GR_GL_VER(3,0)) { |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; |
- // for now we don't support floating point MSAA on ES |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false; |
- } else { |
- if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float") && fTextureRedSupport) { |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; |
- } else { |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = false; |
- } |
- // for now we don't support floating point MSAA on ES |
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false; |
- } |
- } |
- |
- if (this->isConfigTexturable(kRGBA_half_GrPixelConfig)) { |
- if (kGL_GrGLStandard == standard) { |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true; |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = true; |
- } else if (ctxInfo.version() >= GR_GL_VER(3, 0)) { |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true; |
- // for now we don't support floating point MSAA on ES |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false; |
- } else { |
- if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) { |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true; |
- } else { |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = false; |
- } |
- // for now we don't support floating point MSAA on ES |
- fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false; |
- } |
- } |
- |
- // If we don't support MSAA then undo any places above where we set a config as renderable with |
- // msaa. |
- if (kNone_MSFBOType == fMSFBOType) { |
- for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
- fConfigRenderSupport[i][kYes_MSAA] = false; |
- } |
- } |
-} |
- |
-void GrGLCaps::initConfigTexturableTable(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli, |
- bool srgbSupport) { |
- GrGLStandard standard = ctxInfo.standard(); |
- GrGLVersion version = ctxInfo.version(); |
- |
- // Base texture support |
- fConfigTextureSupport[kAlpha_8_GrPixelConfig] = true; |
- fConfigTextureSupport[kRGB_565_GrPixelConfig] = true; |
- fConfigTextureSupport[kRGBA_4444_GrPixelConfig] = true; |
- fConfigTextureSupport[kRGBA_8888_GrPixelConfig] = true; |
- |
- // Disable this for now, while we investigate https://bug.skia.org/4333 |
- if (false) { |
- // Check for 8-bit palette.. |
- GrGLint numFormats; |
- GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats); |
- if (numFormats) { |
- SkAutoSTMalloc<10, GrGLint> formats(numFormats); |
- GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats); |
- for (int i = 0; i < numFormats; ++i) { |
- if (GR_GL_PALETTE8_RGBA8 == formats[i]) { |
- fConfigTextureSupport[kIndex_8_GrPixelConfig] = true; |
- break; |
- } |
- } |
- } |
- } |
- |
- // Check for BGRA |
- if (kGL_GrGLStandard == standard) { |
- fConfigTextureSupport[kBGRA_8888_GrPixelConfig] = |
- version >= GR_GL_VER(1,2) || ctxInfo.hasExtension("GL_EXT_bgra"); |
- } else { |
- if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) { |
- fConfigTextureSupport[kBGRA_8888_GrPixelConfig] = true; |
- if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_texture_storage")) { |
- fBGRAIsInternalFormat = true; |
- } |
- } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) { |
- fConfigTextureSupport[kBGRA_8888_GrPixelConfig] = true; |
- fBGRAIsInternalFormat = true; |
- } |
- SkASSERT(fConfigTextureSupport[kBGRA_8888_GrPixelConfig] || |
- kSkia8888_GrPixelConfig != kBGRA_8888_GrPixelConfig); |
- } |
- |
- fConfigTextureSupport[kSRGBA_8888_GrPixelConfig] = srgbSupport; |
- |
- // Compressed texture support |
- |
- // glCompressedTexImage2D is available on all OpenGL ES devices... |
- // however, it is only available on standard OpenGL after version 1.3 |
- bool hasCompressTex2D = (kGL_GrGLStandard != standard || version >= GR_GL_VER(1, 3)); |
- |
- fCompressedTexSubImageSupport = |
- hasCompressTex2D && (gli->fFunctions.fCompressedTexSubImage2D); |
- |
- // Check for ETC1 |
- bool hasETC1 = false; |
- |
- // First check version for support |
- if (kGL_GrGLStandard == standard) { |
- hasETC1 = hasCompressTex2D && |
- (version >= GR_GL_VER(4, 3) || |
- ctxInfo.hasExtension("GL_ARB_ES3_compatibility")); |
- } else { |
- hasETC1 = hasCompressTex2D && |
- (version >= GR_GL_VER(3, 0) || |
- ctxInfo.hasExtension("GL_OES_compressed_ETC1_RGB8_texture") || |
- // ETC2 is a superset of ETC1, so we can just check for that, too. |
- (ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGB8_texture") && |
- ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGBA8_texture"))); |
- } |
- fConfigTextureSupport[kETC1_GrPixelConfig] = hasETC1; |
- |
- // Check for LATC under its various forms |
- LATCAlias alias = kLATC_LATCAlias; |
- bool hasLATC = hasCompressTex2D && |
- (ctxInfo.hasExtension("GL_EXT_texture_compression_latc") || |
- ctxInfo.hasExtension("GL_NV_texture_compression_latc")); |
- |
- // Check for RGTC |
- if (!hasLATC) { |
- // If we're using OpenGL 3.0 or later, then we have RGTC, an identical compression format. |
- if (kGL_GrGLStandard == standard) { |
- hasLATC = version >= GR_GL_VER(3, 0); |
- } |
- |
- if (!hasLATC) { |
- hasLATC = |
- ctxInfo.hasExtension("GL_EXT_texture_compression_rgtc") || |
- ctxInfo.hasExtension("GL_ARB_texture_compression_rgtc"); |
- } |
- |
- if (hasLATC) { |
- alias = kRGTC_LATCAlias; |
- } |
- } |
- |
- // Check for 3DC |
- if (!hasLATC) { |
- hasLATC = ctxInfo.hasExtension("GL_AMD_compressed_3DC_texture"); |
- if (hasLATC) { |
- alias = k3DC_LATCAlias; |
- } |
- } |
- |
- fConfigTextureSupport[kLATC_GrPixelConfig] = hasLATC; |
- fLATCAlias = alias; |
- |
- // Check for R11_EAC ... We don't support R11_EAC on desktop, as most |
- // cards default to decompressing the textures in the driver, and is |
- // generally slower. |
- if (kGL_GrGLStandard != standard) { |
- fConfigTextureSupport[kR11_EAC_GrPixelConfig] = version >= GR_GL_VER(3, 0); |
- } |
- |
- // Check for ASTC |
- fConfigTextureSupport[kASTC_12x12_GrPixelConfig] = |
- ctxInfo.hasExtension("GL_KHR_texture_compression_astc_hdr") || |
- ctxInfo.hasExtension("GL_KHR_texture_compression_astc_ldr") || |
- ctxInfo.hasExtension("GL_OES_texture_compression_astc"); |
- |
- // Check for floating point texture support |
- // NOTE: We disallow floating point textures on ES devices if linear |
- // filtering modes are not supported. This is for simplicity, but a more |
- // granular approach is possible. Coincidentally, floating point textures became part of |
- // the standard in ES3.1 / OGL 3.1, hence the shorthand |
- bool hasFPTextures = version >= GR_GL_VER(3, 1); |
- if (!hasFPTextures) { |
- hasFPTextures = ctxInfo.hasExtension("GL_ARB_texture_float") || |
- (ctxInfo.hasExtension("GL_OES_texture_float_linear") && |
- ctxInfo.hasExtension("GL_OES_texture_float")); |
- } |
- fConfigTextureSupport[kRGBA_float_GrPixelConfig] = hasFPTextures; |
- |
- // Check for fp16 texture support |
- // NOTE: We disallow floating point textures on ES devices if linear |
- // filtering modes are not supported. This is for simplicity, but a more |
- // granular approach is possible. Coincidentally, 16-bit floating point textures became part of |
- // the standard in ES3.1 / OGL 3.1, hence the shorthand |
- bool hasHalfFPTextures = version >= GR_GL_VER(3, 1); |
- if (!hasHalfFPTextures) { |
- hasHalfFPTextures = ctxInfo.hasExtension("GL_ARB_texture_float") || |
- (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") && |
- ctxInfo.hasExtension("GL_OES_texture_half_float")); |
- } |
- fConfigTextureSupport[kAlpha_half_GrPixelConfig] = hasHalfFPTextures; |
- fConfigTextureSupport[kRGBA_half_GrPixelConfig] = hasHalfFPTextures; |
-} |
- |
bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, |
GrPixelConfig readConfig, |
GrPixelConfig currFBOConfig) const { |
@@ -1188,8 +847,6 @@ SkString GrGLCaps::dump() const { |
r.appendf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors); |
r.appendf("Max FS Texture Units: %d\n", fMaxFragmentTextureUnits); |
r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); |
- r.appendf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ? "YES": "NO")); |
- r.appendf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES": "NO")); |
r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES": "NO")); |
r.appendf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO")); |
r.appendf("Pack Row length support: %s\n", (fPackRowLengthSupport ? "YES": "NO")); |
@@ -1209,6 +866,21 @@ SkString GrGLCaps::dump() const { |
r.appendf("RGBA 8888 pixel ops are slow: %s\n", (fRGBA8888PixelsOpsAreSlow ? "YES" : "NO")); |
r.appendf("Partial FBO read is slow: %s\n", (fPartialFBOReadIsSlow ? "YES" : "NO")); |
r.appendf("Bind uniform location support: %s\n", (fBindUniformLocationSupport ? "YES" : "NO")); |
+ |
+ r.append("Configs\n-------\n"); |
+ for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
+ r.appendf(" cfg: %d flags: 0x%04x, b_internal: 0x%08x s_internal: 0x%08x, e_format: " |
+ "0x%08x, e_type: 0x%08x, i_for_teximage: 0x%08x, e_for_teximage: 0x%08x\n", |
+ i, |
+ fConfigTable[i].fFlags, |
+ fConfigTable[i].fFormats.fBaseInternalFormat, |
+ fConfigTable[i].fFormats.fSizedInternalFormat, |
+ fConfigTable[i].fFormats.fExternalFormat, |
+ fConfigTable[i].fFormats.fExternalType, |
+ fConfigTable[i].fFormats.fInternalFormatTexImage, |
+ fConfigTable[i].fFormats.fExternalFormatForTexImage); |
+ } |
+ |
return r; |
} |
@@ -1334,7 +1006,88 @@ void GrGLCaps::initConfigSwizzleTable(const GrGLContextInfo& ctxInfo, GrGLSLCaps |
} |
-void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
+bool GrGLCaps::bgraIsInternalFormat() const { |
+ return fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat == GR_GL_BGRA; |
+} |
+ |
+void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
+ /* |
+ Comments on renderability of configs on various GL versions. |
+ OpenGL < 3.0: |
+ no built in support for render targets. |
+ GL_EXT_framebuffer_object adds possible support for any sized format with base internal |
+ format RGB, RGBA and NV float formats we don't use. |
+ This is the following: |
+ R3_G3_B2, RGB4, RGB5, RGB8, RGB10, RGB12, RGB16, RGBA2, RGBA4, RGB5_A1, RGBA8 |
+ RGB10_A2, RGBA12,RGBA16 |
+ Though, it is hard to believe the more obscure formats such as RGBA12 would work |
+ since they aren't required by later standards and the driver can simply return |
+ FRAMEBUFFER_UNSUPPORTED for anything it doesn't allow. |
+ GL_ARB_framebuffer_object adds everything added by the EXT extension and additionally |
+ any sized internal format with a base internal format of ALPHA, LUMINANCE, |
+ LUMINANCE_ALPHA, INTENSITY, RED, and RG. |
+ This adds a lot of additional renderable sized formats, including ALPHA8. |
+ The GL_ARB_texture_rg brings in the RED and RG formats (8, 8I, 8UI, 16, 16I, 16UI, |
+ 16F, 32I, 32UI, and 32F variants). |
+ Again, the driver has an escape hatch via FRAMEBUFFER_UNSUPPORTED. |
+ |
+ For both the above extensions we limit ourselves to those that are also required by |
+ OpenGL 3.0. |
+ |
+ OpenGL 3.0: |
+ Any format with base internal format ALPHA, RED, RG, RGB or RGBA is "color-renderable" |
+ but are not required to be supported as renderable textures/renderbuffer. |
+ Required renderable color formats: |
+ - RGBA32F, RGBA32I, RGBA32UI, RGBA16, RGBA16F, RGBA16I, |
+ RGBA16UI, RGBA8, RGBA8I, RGBA8UI, SRGB8_ALPHA8, and |
+ RGB10_A2. |
+ - R11F_G11F_B10F. |
+ - RG32F, RG32I, RG32UI, RG16, RG16F, RG16I, RG16UI, RG8, RG8I, |
+ and RG8UI. |
+ - R32F, R32I, R32UI, R16F, R16I, R16UI, R16, R8, R8I, and R8UI. |
+ - ALPHA8 |
+ |
+ OpenGL 3.1, 3.2, 3.3 |
+ Same as 3.0 except ALPHA8 requires GL_ARB_compatibility/compatibility profile. |
+ OpengGL 3.3, 4.0, 4.1 |
+ Adds RGB10_A2UI. |
+ OpengGL 4.2 |
+ Adds |
+ - RGB5_A1, RGBA4 |
+ - RGB565 |
+ OpenGL 4.4 |
+ Does away with the separate list and adds a column to the sized internal color format |
+ table. However, no new formats become required color renderable. |
+ |
+ ES 2.0 |
+ color renderable: RGBA4, RGB5_A1, RGB565 |
+ GL_EXT_texture_rg adds support for R8, RG5 as a color render target |
+ GL_OES_rgb8_rgba8 adds support for RGB8 and RGBA8 |
+ GL_ARM_rgba8 adds support for RGBA8 (but not RGB8) |
+ GL_EXT_texture_format_BGRA8888 does not add renderbuffer support |
+ GL_CHROMIUM_renderbuffer_format_BGRA8888 adds BGRA8 as color-renderable |
+ GL_APPLE_texture_format_BGRA8888 does not add renderbuffer support |
+ |
+ ES 3.0 |
+ - RGBA32I, RGBA32UI, RGBA16I, RGBA16UI, RGBA8, RGBA8I, |
+ RGBA8UI, SRGB8_ALPHA8, RGB10_A2, RGB10_A2UI, RGBA4, and |
+ RGB5_A1. |
+ - RGB8 and RGB565. |
+ - RG32I, RG32UI, RG16I, RG16UI, RG8, RG8I, and RG8UI. |
+ - R32I, R32UI, R16I, R16UI, R8, R8I, and R8UI |
+ ES 3.1 |
+ Adds RGB10_A2, RGB10_A2UI, |
+ ES 3.2 |
+ Adds R16F, RG16F, RGBA16F, R32F, RG32F, RGBA32F, R11F_G11F_B10F. |
+ */ |
+ uint32_t allRenderFlags = ConfigInfo::kRenderable_Flag; |
+ if (kNone_MSFBOType != fMSFBOType) { |
+ allRenderFlags |= ConfigInfo::kRenderableWithMSAA_Flag; |
+ } |
+ |
+ GrGLStandard standard = ctxInfo.standard(); |
+ GrGLVersion version = ctxInfo.version(); |
+ |
fConfigTable[kUnknown_GrPixelConfig].fFormats.fBaseInternalFormat = 0; |
fConfigTable[kUnknown_GrPixelConfig].fFormats.fSizedInternalFormat = 0; |
fConfigTable[kUnknown_GrPixelConfig].fFormats.fExternalFormat = 0; |
@@ -1346,19 +1099,73 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; |
fConfigTable[kRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
- |
- if (this->bgraIsInternalFormat()) { |
- fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_BGRA; |
- fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_BGRA8; |
+ fConfigTable[kRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ if (kGL_GrGLStandard == standard) { |
+ // We require some form of FBO support and all GLs with FBO support can render to RGBA8 |
+ fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags; |
} else { |
- fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
- fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8; |
+ if (version >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_OES_rgb8_rgba8") || |
+ ctxInfo.hasExtension("GL_ARM_rgba8")) { |
+ fConfigTable[kRGBA_8888_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
} |
+ |
fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalFormat= GR_GL_BGRA; |
fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; |
fConfigTable[kBGRA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ if (kGL_GrGLStandard == standard) { |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8; |
+ if (version >= GR_GL_VER(1, 2) || ctxInfo.hasExtension("GL_EXT_bgra")) { |
+ // Since the internal format is RGBA8, it is also renderable. |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | |
+ allRenderFlags; |
+ } |
+ } else { |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_BGRA; |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_BGRA8; |
+ if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) { |
+ // The APPLE extension doesn't make this renderable. |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ if (version < GR_GL_VER(3,0) && !ctxInfo.hasExtension("GL_EXT_texture_storage")) { |
+ // On ES2 the internal format of a BGRA texture is RGBA with the APPLE extension. |
+ // Though, that seems to not be the case if the texture storage extension is |
+ // present. The specs don't exactly make that clear. |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA8; |
+ } |
+ } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) { |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | |
+ ConfigInfo::kRenderable_Flag; |
+ if (ctxInfo.hasExtension("GL_CHROMIUM_renderbuffer_format_BGRA8888") && |
+ this->usesMSAARenderBuffers()) { |
+ fConfigTable[kBGRA_8888_GrPixelConfig].fFlags |= |
+ ConfigInfo::kRenderableWithMSAA_Flag; |
+ } |
+ } |
+ } |
- |
+ // We only enable srgb support if both textures and FBOs support srgb. |
+ bool srgbSupport = false; |
+ if (kGL_GrGLStandard == standard) { |
+ if (ctxInfo.version() >= GR_GL_VER(3,0)) { |
+ srgbSupport = true; |
+ } else if (ctxInfo.hasExtension("GL_EXT_texture_sRGB")) { |
+ if (ctxInfo.hasExtension("GL_ARB_framebuffer_sRGB") || |
+ ctxInfo.hasExtension("GL_EXT_framebuffer_sRGB")) { |
+ srgbSupport = true; |
+ } |
+ } |
+ // All the above srgb extensions support toggling srgb writes |
+ fSRGBWriteControl = srgbSupport; |
+ } else { |
+ // See https://bug.skia.org/4148 for PowerVR issue. |
+ srgbSupport = kPowerVRRogue_GrGLRenderer != ctxInfo.renderer() && |
+ (ctxInfo.version() >= GR_GL_VER(3,0) || ctxInfo.hasExtension("GL_EXT_sRGB")); |
+ // ES through 3.1 requires EXT_srgb_write_control to support toggling |
+ // sRGB writing for destinations. |
+ fSRGBWriteControl = ctxInfo.hasExtension("GL_EXT_sRGB_write_control"); |
+ } |
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_SRGB_ALPHA; |
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_SRGB8_ALPHA8; |
// GL does not do srgb<->rgb conversions when transferring between cpu and gpu. Thus, the |
@@ -1366,6 +1173,10 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA; |
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; |
fConfigTable[kSRGBA_8888_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ if (srgbSupport) { |
+ fConfigTable[kSRGBA_8888_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag | |
+ allRenderFlags; |
+ } |
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGB; |
if (this->ES2CompatibilitySupport()) { |
@@ -1376,13 +1187,28 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGB; |
fConfigTable[kRGB_565_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_5_6_5; |
fConfigTable[kRGB_565_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ fConfigTable[kRGB_565_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ if (kGL_GrGLStandard == standard) { |
+ if (version >= GR_GL_VER(4, 2) || ctxInfo.hasExtension("GL_ES2_compatibility")) { |
+ fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
+ } else { |
+ fConfigTable[kRGB_565_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA4; |
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_4444_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; |
fConfigTable[kRGBA_4444_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
- |
+ fConfigTable[kRGBA_4444_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ if (kGL_GrGLStandard == standard) { |
+ if (version >= GR_GL_VER(4, 2)) { |
+ fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
+ } else { |
+ fConfigTable[kRGBA_4444_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
if (this->textureRedSupport()) { |
fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RED; |
@@ -1395,12 +1221,58 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
} |
fConfigTable[kAlpha_8_GrPixelConfig].fFormats.fExternalType = GR_GL_UNSIGNED_BYTE; |
fConfigTable[kAlpha_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ fConfigTable[kAlpha_8_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ if (this->textureRedSupport() || kDesktop_ARB_MSFBOType == this->msFBOType()) { |
+ // desktop ARB extension/3.0+ supports ALPHA8 as renderable. |
+ // Core profile removes ALPHA8 support, but we should have chosen R8 in that case. |
+ fConfigTable[kAlpha_8_GrPixelConfig].fFlags |= allRenderFlags; |
+ } |
+ |
+ // Check for [half] floating point texture support |
+ // NOTE: We disallow floating point textures on ES devices if linear filtering modes are not |
+ // supported. This is for simplicity, but a more granular approach is possible. Coincidentally, |
+ // [half] floating point textures became part of the standard in ES3.1 / OGL 3.0. |
+ bool hasFPTextures = false; |
+ bool hasHalfFPTextures = false; |
+ // for now we don't support floating point MSAA on ES |
+ uint32_t fpRenderFlags = (kGL_GrGLStandard == standard) ? |
+ allRenderFlags : (uint32_t)ConfigInfo::kRenderable_Flag; |
+ |
+ if (kGL_GrGLStandard == standard) { |
+ if (version >= GR_GL_VER(3, 0) || ctxInfo.hasExtension("GL_ARB_texture_float")) { |
+ hasFPTextures = true; |
+ hasHalfFPTextures = true; |
+ } |
+ } else { |
+ if (version >= GR_GL_VER(3, 1)) { |
+ hasFPTextures = true; |
+ hasHalfFPTextures = true; |
+ } else { |
+ if (ctxInfo.hasExtension("GL_OES_texture_float_linear") && |
+ ctxInfo.hasExtension("GL_OES_texture_float")) { |
+ hasFPTextures = true; |
+ } |
+ if (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") && |
+ ctxInfo.hasExtension("GL_OES_texture_half_float")) { |
+ hasHalfFPTextures = true; |
+ } |
+ } |
+ } |
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA32F; |
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_float_GrPixelConfig].fFormats.fExternalType = GR_GL_FLOAT; |
fConfigTable[kRGBA_float_GrPixelConfig].fFormatType = kFloat_FormatType; |
+ if (hasFPTextures) { |
+ fConfigTable[kRGBA_float_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ // For now we only enable rendering to float on desktop, because on ES we'd have to solve |
+ // many precision issues and no clients actually want this yet. |
+ if (kGL_GrGLStandard == standard /* || version >= GR_GL_VER(3,2) || |
+ ctxInfo.hasExtension("GL_EXT_color_buffer_float")*/) { |
+ fConfigTable[kRGBA_float_GrPixelConfig].fFlags |= fpRenderFlags; |
+ } |
+ } |
if (this->textureRedSupport()) { |
fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RED; |
@@ -1417,6 +1289,16 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kAlpha_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES; |
} |
fConfigTable[kAlpha_half_GrPixelConfig].fFormatType = kFloat_FormatType; |
+ if (hasHalfFPTextures) { |
+ fConfigTable[kAlpha_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ // ES requires either 3.2 or the combination of EXT_color_buffer_half_float and support for |
+ // GL_RED internal format. |
+ if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) || |
+ (this->textureRedSupport() && |
+ ctxInfo.hasExtension("GL_EXT_color_buffer_half_float"))) { |
+ fConfigTable[kAlpha_half_GrPixelConfig].fFlags |= fpRenderFlags; |
+ } |
+ } |
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_RGBA; |
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_RGBA16F; |
@@ -1427,33 +1309,71 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kRGBA_half_GrPixelConfig].fFormats.fExternalType = GR_GL_HALF_FLOAT_OES; |
} |
fConfigTable[kRGBA_half_GrPixelConfig].fFormatType = kFloat_FormatType; |
+ if (hasHalfFPTextures) { |
+ fConfigTable[kRGBA_half_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ // ES requires 3.2 or EXT_color_buffer_half_float. |
+ if (kGL_GrGLStandard == standard || version >= GR_GL_VER(3,2) || |
+ ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) { |
+ fConfigTable[kRGBA_half_GrPixelConfig].fFlags |= fpRenderFlags; |
+ } |
+ } |
+ |
+ // Compressed texture support |
+ |
+ // glCompressedTexImage2D is available on all OpenGL ES devices. It is available on standard |
+ // OpenGL after version 1.3. We'll assume at least that level of OpenGL support. |
+ |
+ // TODO: Fix command buffer bindings and remove this. |
+ fCompressedTexSubImageSupport = SkToBool(gli->fFunctions.fCompressedTexSubImage2D); |
// No sized/unsized internal format distinction for compressed formats, no external format. |
+ // Below we set the external formats and types to 0. |
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_PALETTE8_RGBA8; |
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_PALETTE8_RGBA8; |
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalFormat = 0; |
fConfigTable[kIndex_8_GrPixelConfig].fFormats.fExternalType = 0; |
fConfigTable[kIndex_8_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ // Disable this for now, while we investigate https://bug.skia.org/4333 |
+ if (false) { |
+ // Check for 8-bit palette.. |
+ GrGLint numFormats; |
+ GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats); |
+ if (numFormats) { |
+ SkAutoSTMalloc<10, GrGLint> formats(numFormats); |
+ GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats); |
+ for (int i = 0; i < numFormats; ++i) { |
+ if (GR_GL_PALETTE8_RGBA8 == formats[i]) { |
+ fConfigTable[kIndex_8_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ break; |
+ } |
+ } |
+ } |
+ } |
+ |
+ // May change the internal format based on extensions. |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = |
+ GR_GL_COMPRESSED_LUMINANCE_LATC1; |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
+ GR_GL_COMPRESSED_LUMINANCE_LATC1; |
+ if (ctxInfo.hasExtension("GL_EXT_texture_compression_latc") || |
+ ctxInfo.hasExtension("GL_NV_texture_compression_latc")) { |
+ fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ } else if ((kGL_GrGLStandard == standard && version >= GR_GL_VER(3, 0)) || |
+ ctxInfo.hasExtension("GL_EXT_texture_compression_rgtc") || |
+ ctxInfo.hasExtension("GL_ARB_texture_compression_rgtc")) { |
+ // RGTC is identical and available on OpenGL 3.0+ as well as with extensions |
+ fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = |
+ GR_GL_COMPRESSED_RED_RGTC1; |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
+ GR_GL_COMPRESSED_RED_RGTC1; |
+ } else if (ctxInfo.hasExtension("GL_AMD_compressed_3DC_texture")) { |
+ fConfigTable[kLATC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_3DC_X; |
+ fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
+ GR_GL_COMPRESSED_3DC_X; |
- switch(this->latcAlias()) { |
- case GrGLCaps::kLATC_LATCAlias: |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = |
- GR_GL_COMPRESSED_LUMINANCE_LATC1; |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
- GR_GL_COMPRESSED_LUMINANCE_LATC1; |
- break; |
- case GrGLCaps::kRGTC_LATCAlias: |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = |
- GR_GL_COMPRESSED_RED_RGTC1; |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
- GR_GL_COMPRESSED_RED_RGTC1; |
- break; |
- case GrGLCaps::k3DC_LATCAlias: |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_3DC_X; |
- fConfigTable[kLATC_GrPixelConfig].fFormats.fSizedInternalFormat = |
- GR_GL_COMPRESSED_3DC_X; |
- break; |
} |
fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalFormat = 0; |
fConfigTable[kLATC_GrPixelConfig].fFormats.fExternalType = 0; |
@@ -1464,12 +1384,30 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalFormat = 0; |
fConfigTable[kETC1_GrPixelConfig].fFormats.fExternalType = 0; |
fConfigTable[kETC1_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ if (kGL_GrGLStandard == standard) { |
+ if (version >= GR_GL_VER(4, 3) || ctxInfo.hasExtension("GL_ARB_ES3_compatibility")) { |
+ fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ } |
+ } else { |
+ if (version >= GR_GL_VER(3, 0) || |
+ ctxInfo.hasExtension("GL_OES_compressed_ETC1_RGB8_texture") || |
+ // ETC2 is a superset of ETC1, so we can just check for that, too. |
+ (ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGB8_texture") && |
+ ctxInfo.hasExtension("GL_OES_compressed_ETC2_RGBA8_texture"))) { |
+ fConfigTable[kETC1_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ } |
+ } |
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fBaseInternalFormat = GR_GL_COMPRESSED_R11_EAC; |
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fSizedInternalFormat = GR_GL_COMPRESSED_R11_EAC; |
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalFormat = 0; |
fConfigTable[kR11_EAC_GrPixelConfig].fFormats.fExternalType = 0; |
fConfigTable[kR11_EAC_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ // Check for R11_EAC. We don't support R11_EAC on desktop, as most cards default to |
+ // decompressing the textures in the driver, and is generally slower. |
+ if (kGLES_GrGLStandard == standard && version >= GR_GL_VER(3,0)) { |
+ fConfigTable[kR11_EAC_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ } |
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fBaseInternalFormat = |
GR_GL_COMPRESSED_RGBA_ASTC_12x12; |
@@ -1478,6 +1416,11 @@ void GrGLCaps::initConfigTable(const GrGLContextInfo& ctxInfo) { |
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalFormat = 0; |
fConfigTable[kASTC_12x12_GrPixelConfig].fFormats.fExternalType = 0; |
fConfigTable[kASTC_12x12_GrPixelConfig].fFormatType = kNormalizedFixedPoint_FormatType; |
+ if (ctxInfo.hasExtension("GL_KHR_texture_compression_astc_hdr") || |
+ ctxInfo.hasExtension("GL_KHR_texture_compression_astc_ldr") || |
+ ctxInfo.hasExtension("GL_OES_texture_compression_astc")) { |
+ fConfigTable[kASTC_12x12_GrPixelConfig].fFlags = ConfigInfo::kTextureable_Flag; |
+ } |
// Bulk populate the texture internal/external formats here and then deal with exceptions below. |