Use ES3 texture swizzling.
R=jvanverth@google.com
Author: bsalomon@google.com
Review URL: https://chromiumcodereview.appspot.com/23128009
git-svn-id: http://skia.googlecode.com/svn/trunk@10837 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 0a99258..685d4e8 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -1981,15 +1981,8 @@
}
}
}
-namespace {
-inline void set_tex_swizzle(GrGLenum swizzle[4], const GrGLInterface* gl) {
- GR_GL_CALL(gl, TexParameteriv(GR_GL_TEXTURE_2D,
- GR_GL_TEXTURE_SWIZZLE_RGBA,
- reinterpret_cast<const GrGLint*>(swizzle)));
-}
-
-inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) {
+static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) {
static const GrGLenum gWrapModes[] = {
GR_GL_CLAMP_TO_EDGE,
GR_GL_REPEAT,
@@ -2002,8 +1995,6 @@
return gWrapModes[tm];
}
-}
-
void GrGpuGL::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTexture* texture) {
SkASSERT(NULL != texture);
@@ -2082,8 +2073,18 @@
oldTexParams.fSwizzleRGBA,
sizeof(newTexParams.fSwizzleRGBA)))) {
this->setTextureUnit(unitIdx);
- set_tex_swizzle(newTexParams.fSwizzleRGBA,
- this->glInterface());
+ if (this->glBinding() == kES_GrGLBinding) {
+ // ES3 added swizzle support but not GL_TEXTURE_SWIZZLE_RGBA.
+ const GrGLenum* swizzle = newTexParams.fSwizzleRGBA;
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_R, swizzle[0]));
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_G, swizzle[1]));
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_B, swizzle[2]));
+ GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_A, swizzle[3]));
+ } else {
+ GR_STATIC_ASSERT(sizeof(newTexParams.fSwizzleRGBA[0]) == sizeof(GrGLint));
+ const GrGLint* swizzle = reinterpret_cast<const GrGLint*>(newTexParams.fSwizzleRGBA);
+ GL_CALL(TexParameteriv(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_RGBA, swizzle));
+ }
}
texture->setCachedTexParams(newTexParams, this->getResetTimestamp());
}