Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index 815fd02b198ac67a992216f551e042d8a06c3139..dc3ea0c3d782afd8afdd6e6172e395b08d87f180 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -2396,34 +2396,19 @@ |
return gWrapModes[tm]; |
} |
-static GrGLenum get_component_enum_from_char(char component) { |
- switch (component) { |
- case 'r': |
- return GR_GL_RED; |
- case 'g': |
- return GR_GL_GREEN; |
- case 'b': |
- return GR_GL_BLUE; |
- case 'a': |
- return GR_GL_ALPHA; |
- default: |
- SkFAIL("Unsupported component"); |
- return 0; |
- } |
-} |
- |
-/** If texture swizzling is available using tex parameters then it is preferred over mangling |
- the generated shader code. This potentially allows greater reuse of cached shaders. */ |
-static void get_tex_param_swizzle(GrPixelConfig config, |
- const GrGLSLCaps& caps, |
- GrGLenum* glSwizzle) { |
- const char* swizzle = "rgba"; |
- if (!caps.mustSwizzleInShader()) { |
- swizzle = caps.getSwizzleMap(config); |
- } |
- |
- for (int i = 0; i < 4; ++i) { |
- glSwizzle[i] = get_component_enum_from_char(swizzle[i]); |
+const GrGLenum* GrGLGpu::GetTexParamSwizzle(GrPixelConfig config, const GrGLCaps& caps) { |
+ if (caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(config)) { |
+ if (caps.textureRedSupport()) { |
+ static const GrGLenum gRedSmear[] = { GR_GL_RED, GR_GL_RED, GR_GL_RED, GR_GL_RED }; |
+ return gRedSmear; |
+ } else { |
+ static const GrGLenum gAlphaSmear[] = { GR_GL_ALPHA, GR_GL_ALPHA, |
+ GR_GL_ALPHA, GR_GL_ALPHA }; |
+ return gAlphaSmear; |
+ } |
+ } else { |
+ static const GrGLenum gStraight[] = { GR_GL_RED, GR_GL_GREEN, GR_GL_BLUE, GR_GL_ALPHA }; |
+ return gStraight; |
} |
} |
@@ -2492,7 +2477,9 @@ |
newTexParams.fWrapS = tile_to_gl_wrap(params.getTileModeX()); |
newTexParams.fWrapT = tile_to_gl_wrap(params.getTileModeY()); |
- get_tex_param_swizzle(texture->config(), *this->glCaps().glslCaps(), newTexParams.fSwizzleRGBA); |
+ memcpy(newTexParams.fSwizzleRGBA, |
+ GetTexParamSwizzle(texture->config(), this->glCaps()), |
+ sizeof(newTexParams.fSwizzleRGBA)); |
if (setAll || newTexParams.fMagFilter != oldTexParams.fMagFilter) { |
this->setTextureUnit(unitIdx); |
GL_CALL(TexParameteri(target, GR_GL_TEXTURE_MAG_FILTER, newTexParams.fMagFilter)); |
@@ -2509,7 +2496,7 @@ |
this->setTextureUnit(unitIdx); |
GL_CALL(TexParameteri(target, GR_GL_TEXTURE_WRAP_T, newTexParams.fWrapT)); |
} |
- if (!this->glCaps().glslCaps()->mustSwizzleInShader() && |
+ if (this->glCaps().textureSwizzleSupport() && |
(setAll || memcmp(newTexParams.fSwizzleRGBA, |
oldTexParams.fSwizzleRGBA, |
sizeof(newTexParams.fSwizzleRGBA)))) { |