Index: src/gpu/gl/GrGLCaps.cpp |
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp |
index 6523e032335f30925587a34e51a6cbe868283f50..7c7b5d45bd620ce27c0853982df1807df7ab15da 100644 |
--- a/src/gpu/gl/GrGLCaps.cpp |
+++ b/src/gpu/gl/GrGLCaps.cpp |
@@ -30,7 +30,6 @@ void GrGLCaps::reset() { |
fMaxFragmentTextureUnits = 0; |
fMaxFixedFunctionTextureCoords = 0; |
fRGBA8RenderbufferSupport = false; |
- fBGRAFormatSupport = false; |
fBGRAIsInternalFormat = false; |
fTextureSwizzleSupport = false; |
fUnpackRowLengthSupport = false; |
@@ -68,7 +67,6 @@ GrGLCaps& GrGLCaps::operator= (const GrGLCaps& caps) { |
fInvalidateFBType = caps.fInvalidateFBType; |
fMapBufferType = caps.fMapBufferType; |
fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport; |
- fBGRAFormatSupport = caps.fBGRAFormatSupport; |
fBGRAIsInternalFormat = caps.fBGRAIsInternalFormat; |
fTextureSwizzleSupport = caps.fTextureSwizzleSupport; |
fUnpackRowLengthSupport = caps.fUnpackRowLengthSupport; |
@@ -135,20 +133,6 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
} |
if (kGL_GrGLStandard == standard) { |
- fBGRAFormatSupport = version >= GR_GL_VER(1,2) || |
- ctxInfo.hasExtension("GL_EXT_bgra"); |
- } else { |
- if (ctxInfo.hasExtension("GL_APPLE_texture_format_BGRA8888")) { |
- fBGRAFormatSupport = true; |
- } else if (ctxInfo.hasExtension("GL_EXT_texture_format_BGRA8888")) { |
- fBGRAFormatSupport = true; |
- fBGRAIsInternalFormat = true; |
- } |
- SkASSERT(fBGRAFormatSupport || |
- kSkia8888_GrPixelConfig != kBGRA_8888_GrPixelConfig); |
- } |
- |
- if (kGL_GrGLStandard == standard) { |
fTextureSwizzleSupport = version >= GR_GL_VER(3,3) || |
ctxInfo.hasExtension("GL_ARB_texture_swizzle"); |
} else { |
@@ -262,19 +246,6 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
/************************************************************************** |
* GrDrawTargetCaps fields |
**************************************************************************/ |
- 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 (formats[i] == GR_GL_PALETTE8_RGBA8) { |
- f8BitPaletteSupport = true; |
- break; |
- } |
- } |
- } |
- |
if (kGL_GrGLStandard == standard) { |
// we could also look for GL_ATI_separate_stencil extension or |
// GL_EXT_stencil_two_side but they use different function signatures |
@@ -367,10 +338,9 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES, &fMaxSampleCount); |
} |
+ this->initConfigTexturableTable(ctxInfo, gli); |
this->initConfigRenderableTable(ctxInfo); |
- this->initCompressedTextureSupport(ctxInfo); |
- |
return true; |
} |
@@ -404,12 +374,14 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
// 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 == ctxInfo.standard()) { |
+ 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) || |
@@ -423,7 +395,7 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
fConfigRenderSupport[kAlpha_8_GrPixelConfig][kYes_MSAA] = fTextureRedSupport; |
} |
- if (kGL_GrGLStandard != ctxInfo.standard()) { |
+ if (kGL_GrGLStandard != standard) { |
// only available in ES |
fConfigRenderSupport[kRGB_565_GrPixelConfig][kNo_MSAA] = true; |
fConfigRenderSupport[kRGB_565_GrPixelConfig][kYes_MSAA] = true; |
@@ -438,7 +410,7 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
fConfigRenderSupport[kRGBA_8888_GrPixelConfig][kYes_MSAA] = true; |
} |
- if (this->fBGRAFormatSupport) { |
+ if (this->isConfigTexturable(kBGRA_8888_GrPixelConfig)) { |
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. |
@@ -460,36 +432,103 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { |
} |
} |
-void GrGLCaps::initCompressedTextureSupport(const GrGLContextInfo &ctxInfo) { |
+void GrGLCaps::initConfigTexturableTable(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { |
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; |
+ |
+ // 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; |
+ } 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); |
+ } |
+ |
+ // Compressed texture support |
+ |
// glCompressedTexImage2D is available on all OpenGL ES devices... |
// however, it is only available on standard OpenGL after version 1.3 |
- if (kGL_GrGLStandard == standard && version < GR_GL_VER(1, 3)) { |
- return; |
- } |
+ bool hasCompressTex2D = (kGL_GrGLStandard != standard || version >= GR_GL_VER(1, 3)); |
// Check for ETC1 |
bool hasETC1 = false; |
// First check version for support |
if (kGL_GrGLStandard == standard) { |
- hasETC1 = |
- version >= GR_GL_VER(4, 3) || |
- ctxInfo.hasExtension("GL_ARB_ES3_compatibility"); |
+ hasETC1 = hasCompressTex2D && |
+ (version >= GR_GL_VER(4, 3) || |
+ ctxInfo.hasExtension("GL_ARB_ES3_compatibility")); |
} else { |
- hasETC1 = |
- 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")); |
+ 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; |
+ } |
} |
- fCompressedFormatSupport[kETC1_GrCompressedFormat] = hasETC1; |
- fCompressedFormatSupport[kETC2_GrCompressedFormat] = false; |
- fCompressedFormatSupport[kDXT1_GrCompressedFormat] = false; |
+ fConfigTextureSupport[kLATC_GrPixelConfig] = hasLATC; |
+ fLATCAlias = alias; |
} |
bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, |
@@ -728,7 +767,6 @@ SkString GrGLCaps::dump() const { |
} |
r.appendf("Max Vertex Attributes: %d\n", fMaxVertexAttributes); |
r.appendf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ? "YES": "NO")); |
- r.appendf("BGRA support: %s\n", (fBGRAFormatSupport ? "YES": "NO")); |
r.appendf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES": "NO")); |
r.appendf("Support texture swizzle: %s\n", (fTextureSwizzleSupport ? "YES": "NO")); |
r.appendf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES": "NO")); |