diff options
author | 2014-05-27 18:52:24 +0000 | |
---|---|---|
committer | 2014-05-27 18:52:24 +0000 | |
commit | 420b2ff26cbbb3a7585810fbba7a4b95fd577ca6 (patch) | |
tree | 556d96d08181ccd0c0a4dacd8c92befb1fda2d9b /src/gpu | |
parent | fdf2c55fe10175e079bf9b76b208c7f93eac9bb3 (diff) |
Add compressed texture capabilities for GPU devices
BUG=skia:
Committed: http://code.google.com/p/skia/source/detail?r=14880
R=bsalomon@google.com, robertphillips@google.com
Author: krajcevski@google.com
Review URL: https://codereview.chromium.org/292323003
git-svn-id: http://skia.googlecode.com/svn/trunk@14901 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/GrDrawTarget.cpp | 20 | ||||
-rw-r--r-- | src/gpu/GrDrawTargetCaps.h | 7 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.cpp | 34 | ||||
-rw-r--r-- | src/gpu/gl/GrGLCaps.h | 2 |
4 files changed, 63 insertions, 0 deletions
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index 6d8d18463a..a5b6ac6f03 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -1029,6 +1029,7 @@ void GrDrawTargetCaps::reset() { fMaxSampleCount = 0; memset(fConfigRenderSupport, 0, sizeof(fConfigRenderSupport)); + memset(fCompressedFormatSupport, 0, sizeof(fCompressedFormatSupport)); } GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { @@ -1054,6 +1055,8 @@ GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { fMaxSampleCount = other.fMaxSampleCount; memcpy(fConfigRenderSupport, other.fConfigRenderSupport, sizeof(fConfigRenderSupport)); + memcpy(fCompressedFormatSupport, other.fCompressedFormatSupport, + sizeof(fCompressedFormatSupport)); return *this; } @@ -1129,5 +1132,22 @@ SkString GrDrawTargetCaps::dump() const { gNY[fConfigRenderSupport[i][1]]); } } + + static const char* kCompressedFormatNames[] = { + "ETC1", // kETC1_GrCompressedFormat + "ETC2", // kETC2_GrCompressedFormat, + "DXT1", // kDXT1_GrCompressedFormat, + }; + GR_STATIC_ASSERT(0 == kETC1_GrCompressedFormat); + GR_STATIC_ASSERT(1 == kETC2_GrCompressedFormat); + GR_STATIC_ASSERT(2 == kDXT1_GrCompressedFormat); + GR_STATIC_ASSERT(SK_ARRAY_COUNT(kCompressedFormatNames) == kGrCompressedFormatCount); + + for (size_t i = 0; i < SK_ARRAY_COUNT(kCompressedFormatNames); ++i) { + r.appendf("%s Compressed Texture Support: %s\n", + kCompressedFormatNames[i], + gNY[fCompressedFormatSupport[i]]); + } + return r; } diff --git a/src/gpu/GrDrawTargetCaps.h b/src/gpu/GrDrawTargetCaps.h index 648b5c36be..db2b090512 100644 --- a/src/gpu/GrDrawTargetCaps.h +++ b/src/gpu/GrDrawTargetCaps.h @@ -72,6 +72,11 @@ public: return fConfigRenderSupport[config][withMSAA]; } + bool compressedTextureSupport(GrCompressedFormat format) const { + SkASSERT(kGrCompressedFormatCount > format); + return fCompressedFormatSupport[format]; + } + protected: bool f8BitPaletteSupport : 1; bool fNPOTTextureTileSupport : 1; @@ -97,6 +102,8 @@ protected: // The first entry for each config is without msaa and the second is with. bool fConfigRenderSupport[kGrPixelConfigCnt][2]; + bool fCompressedFormatSupport[kGrCompressedFormatCount]; + typedef SkRefCnt INHERITED; }; diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index f577e9d740..6523e03233 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -369,6 +369,8 @@ bool GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { this->initConfigRenderableTable(ctxInfo); + this->initCompressedTextureSupport(ctxInfo); + return true; } @@ -458,6 +460,38 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { } } +void GrGLCaps::initCompressedTextureSupport(const GrGLContextInfo &ctxInfo) { + GrGLStandard standard = ctxInfo.standard(); + GrGLVersion version = ctxInfo.version(); + + // 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; + } + + // 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"); + } 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")); + } + fCompressedFormatSupport[kETC1_GrCompressedFormat] = hasETC1; + + fCompressedFormatSupport[kETC2_GrCompressedFormat] = false; + fCompressedFormatSupport[kDXT1_GrCompressedFormat] = false; +} + bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, GrGLenum format, GrGLenum type) const { diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index ea0f41245d..c2d808e4a5 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -313,6 +313,8 @@ private: // This must be called after initFSAASupport(). void initConfigRenderableTable(const GrGLContextInfo&); + void initCompressedTextureSupport(const GrGLContextInfo &); + // tracks configs that have been verified to pass the FBO completeness when // used as a color attachment VerifiedColorConfigs fVerifiedColorConfigs; |