| 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)))) {
|
|
|