Chromium Code Reviews| Index: src/gpu/gl/GrGLCaps.cpp |
| diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp |
| index 6523e032335f30925587a34e51a6cbe868283f50..88abe76d50a4907355817d08536f0d4a9de13370 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) { |
|
robertphillips
2014/05/29 20:08:43
Yoda-fy this ?
krajcevski
2014/05/29 20:31:28
Done.
|
| + if (formats[i] == GR_GL_PALETTE8_RGBA8) { |
| + 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 |
|
robertphillips
2014/05/29 20:08:43
>= ?!?
krajcevski
2014/05/29 20:31:28
Done.
|
| - 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")); |