diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-09 16:14:25 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-12-09 16:14:25 +0000 |
commit | 32e4d2aa488c9bfbd09ad9ff0873c6fccbdfdc97 (patch) | |
tree | 4c5a698c7cd0ade493d578e1d1b3cadff7b7a587 /src | |
parent | 6b67e21b6549598254c1ffa4243bf32615d90fb6 (diff) |
Add back compressed image upload (accidently removed in earlier refactor)
Review URL: http://codereview.appspot.com/5468043/
git-svn-id: http://skia.googlecode.com/svn/trunk@2843 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/GrGpuGL.cpp | 51 |
1 files changed, 38 insertions, 13 deletions
diff --git a/src/gpu/GrGpuGL.cpp b/src/gpu/GrGpuGL.cpp index 2a8634f00c..41df99ddd6 100644 --- a/src/gpu/GrGpuGL.cpp +++ b/src/gpu/GrGpuGL.cpp @@ -147,7 +147,7 @@ static bool fbo_test(const GrGLInterface* gl, int w, int h) { GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, testRTTex)); // some implementations require texture to be mip-map complete before // FBO with level 0 bound as color attachment will be framebuffer complete. - GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, + GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_MIN_FILTER, GR_GL_NEAREST)); GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, w, h, @@ -777,6 +777,11 @@ bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, return false; } + if (!isNewTexture && GR_GL_PALETTE8_RGBA8 == desc.fInternalFormat) { + // paletted textures cannot be updated + return false; + } + /* * check whether to allocate a temporary buffer for flipping y or * because our srcData has extra bytes past each row. If so, we need @@ -831,11 +836,30 @@ bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, 0 == left && 0 == top && desc.fWidth == width && desc.fHeight == height) { GrGLClearErr(this->glInterface()); - GR_GL_CALL_NOERRCHECK(this->glInterface(), - TexImage2D(GR_GL_TEXTURE_2D, 0, - desc.fInternalFormat, - desc.fWidth, desc.fHeight, 0, - externalFormat, externalType, data)); + if (GR_GL_PALETTE8_RGBA8 == desc.fInternalFormat) { + GrGLsizei imageSize = desc.fWidth * desc.fHeight + + kGrColorTableSize; + GR_GL_CALL_NOERRCHECK(this->glInterface(), + CompressedTexImage2D(GR_GL_TEXTURE_2D, + 0, // level + desc.fInternalFormat, + desc.fWidth, + desc.fHeight, + 0, // border + imageSize, + data)); + } else { + GR_GL_CALL_NOERRCHECK(this->glInterface(), + TexImage2D(GR_GL_TEXTURE_2D, + 0, // level + desc.fInternalFormat, + desc.fWidth, + desc.fHeight, + 0, // border + externalFormat, + externalType, + data)); + } if (GR_GL_GET_ERROR(this->glInterface()) != GR_GL_NO_ERROR) { return false; } @@ -2247,8 +2271,8 @@ bool GrGpuGL::canBeTexture(GrPixelConfig config, switch (config) { case kRGBA_8888_PM_GrPixelConfig: case kRGBA_8888_UPM_GrPixelConfig: - *externalFormat = GR_GL_RGBA; *internalFormat = GR_GL_RGBA; + *externalFormat = GR_GL_RGBA; *externalType = GR_GL_UNSIGNED_BYTE; break; case kBGRA_8888_PM_GrPixelConfig: @@ -2256,36 +2280,37 @@ bool GrGpuGL::canBeTexture(GrPixelConfig config, if (!fGLCaps.fBGRAFormatSupport) { return false; } - *externalFormat = GR_GL_BGRA; if (fGLCaps.fBGRAIsInternalFormat) { *internalFormat = GR_GL_BGRA; } else { *internalFormat = GR_GL_RGBA; } + *externalFormat = GR_GL_BGRA; *externalType = GR_GL_UNSIGNED_BYTE; break; case kRGB_565_GrPixelConfig: - *externalFormat = GR_GL_RGB; *internalFormat = GR_GL_RGB; + *externalFormat = GR_GL_RGB; *externalType = GR_GL_UNSIGNED_SHORT_5_6_5; break; case kRGBA_4444_GrPixelConfig: - *externalFormat = GR_GL_RGBA; *internalFormat = GR_GL_RGBA; + *externalFormat = GR_GL_RGBA; *externalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; break; case kIndex_8_GrPixelConfig: if (this->getCaps().f8BitPaletteSupport) { - *externalFormat = GR_GL_PALETTE8_RGBA8; *internalFormat = GR_GL_PALETTE8_RGBA8; - *externalType = GR_GL_UNSIGNED_BYTE; // unused I think + // glCompressedTexImage doesn't take external params + *externalFormat = GR_GL_PALETTE8_RGBA8; + *externalType = GR_GL_UNSIGNED_BYTE; } else { return false; } break; case kAlpha_8_GrPixelConfig: - *externalFormat = GR_GL_ALPHA; *internalFormat = GR_GL_ALPHA; + *externalFormat = GR_GL_ALPHA; *externalType = GR_GL_UNSIGNED_BYTE; break; default: |