Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index ff53b9c14cdeb5e8e141899249399ed58bff55f7..8bc225e93112bf14a27988eafd7a5f83c8de022c 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -200,7 +200,8 @@ GrPixelConfig GrGpuGL::preferredWritePixelsConfig(GrPixelConfig writeConfig, |
} |
bool GrGpuGL::canWriteTexturePixels(const GrTexture* texture, GrPixelConfig srcConfig) const { |
- if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture->config()) { |
+ if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture->config() || |
+ GrPixelConfigIsCompressed(srcConfig) || GrPixelConfigIsCompressed(texture->config())) { |
return false; |
} |
if (srcConfig != texture->config() && kGLES_GrGLStandard == this->glStandard()) { |
@@ -531,6 +532,9 @@ bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, |
size_t rowBytes) { |
SkASSERT(NULL != data || isNewTexture); |
+ // If we're uploading compressed data then we should be using uploadCompressedTexData |
+ SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); |
+ |
size_t bpp = GrBytesPerPixel(dataConfig); |
if (!adjust_pixel_ops_params(desc.fWidth, desc.fHeight, bpp, &left, &top, |
&width, &height, &data, &rowBytes)) { |
@@ -548,7 +552,7 @@ bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, |
// texture storage. |
bool useTexStorage = false && |
isNewTexture && |
- desc.fConfig != kIndex_8_GrPixelConfig && |
+ kIndex_8_GrPixelConfig != desc.fConfig && |
this->glCaps().texStorageSupport(); |
if (useTexStorage && kGL_GrGLStandard == this->glStandard()) { |
@@ -1432,6 +1436,11 @@ bool GrGpuGL::onReadPixels(GrRenderTarget* target, |
GrPixelConfig config, |
void* buffer, |
size_t rowBytes) { |
+ // We cannot read pixels into a compressed buffer |
+ if (GrPixelConfigIsCompressed(config)) { |
+ return false; |
+ } |
+ |
GrGLenum format; |
GrGLenum type; |
bool flipY = kBottomLeft_GrSurfaceOrigin == target->origin(); |
@@ -2483,6 +2492,22 @@ bool GrGpuGL::configToGLFormats(GrPixelConfig config, |
*externalType = GR_GL_UNSIGNED_BYTE; |
} |
break; |
+ case kETC1_GrPixelConfig: |
+ *internalFormat = GR_GL_COMPRESSED_RGB8_ETC1; |
+ break; |
+ case kLATC_GrPixelConfig: |
+ switch(this->glCaps().latcAlias()) { |
+ case GrGLCaps::kLATC_LATCAlias: |
+ *internalFormat = GR_GL_COMPRESSED_LUMINANCE_LATC1; |
+ break; |
+ case GrGLCaps::kRGTC_LATCAlias: |
+ *internalFormat = GR_GL_COMPRESSED_RED_RGTC1; |
+ break; |
+ case GrGLCaps::k3DC_LATCAlias: |
+ *internalFormat = GR_GL_COMPRESSED_3DC_X; |
+ break; |
+ } |
+ break; |
default: |
return false; |
} |
@@ -2559,7 +2584,8 @@ inline bool can_copy_texsubimage(const GrSurface* dst, |
if (gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt > 0) && |
NULL != dst->asTexture() && |
dst->origin() == src->origin() && |
- kIndex_8_GrPixelConfig != src->config()) { |
+ kIndex_8_GrPixelConfig != src->config() && |
+ !GrPixelConfigIsCompressed(src->config())) { |
if (NULL != wouldNeedTempFBO) { |
*wouldNeedTempFBO = NULL == src->asRenderTarget(); |
} |