aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-12-09 16:14:25 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-12-09 16:14:25 +0000
commit32e4d2aa488c9bfbd09ad9ff0873c6fccbdfdc97 (patch)
tree4c5a698c7cd0ade493d578e1d1b3cadff7b7a587
parent6b67e21b6549598254c1ffa4243bf32615d90fb6 (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
-rw-r--r--src/gpu/GrGpuGL.cpp51
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: