| Index: src/gpu/gl/GrGLGpu.cpp
|
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
|
| index dc3ea0c3d782afd8afdd6e6172e395b08d87f180..6c47baf9d319858d96ed3ba4f90f3e80cfe7d1e1 100644
|
| --- a/src/gpu/gl/GrGLGpu.cpp
|
| +++ b/src/gpu/gl/GrGLGpu.cpp
|
| @@ -2396,19 +2396,30 @@ static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) {
|
| return gWrapModes[tm];
|
| }
|
|
|
| -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;
|
| +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 = caps.getSwizzleMap(config);
|
| + for (int i = 0; i < 4; ++i) {
|
| + glSwizzle[i] = get_component_enum_from_char(swizzle[i]);
|
| }
|
| }
|
|
|
| @@ -2477,9 +2488,7 @@ void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
|
|
| newTexParams.fWrapS = tile_to_gl_wrap(params.getTileModeX());
|
| newTexParams.fWrapT = tile_to_gl_wrap(params.getTileModeY());
|
| - memcpy(newTexParams.fSwizzleRGBA,
|
| - GetTexParamSwizzle(texture->config(), this->glCaps()),
|
| - sizeof(newTexParams.fSwizzleRGBA));
|
| + get_tex_param_swizzle(texture->config(), *this->glCaps().glslCaps(), newTexParams.fSwizzleRGBA);
|
| if (setAll || newTexParams.fMagFilter != oldTexParams.fMagFilter) {
|
| this->setTextureUnit(unitIdx);
|
| GL_CALL(TexParameteri(target, GR_GL_TEXTURE_MAG_FILTER, newTexParams.fMagFilter));
|
| @@ -2496,7 +2505,7 @@ void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
|
| this->setTextureUnit(unitIdx);
|
| GL_CALL(TexParameteri(target, GR_GL_TEXTURE_WRAP_T, newTexParams.fWrapT));
|
| }
|
| - if (this->glCaps().textureSwizzleSupport() &&
|
| + if (!this->glCaps().glslCaps()->mustSwizzleInShader() &&
|
| (setAll || memcmp(newTexParams.fSwizzleRGBA,
|
| oldTexParams.fSwizzleRGBA,
|
| sizeof(newTexParams.fSwizzleRGBA)))) {
|
|
|