diff options
Diffstat (limited to 'src/gpu/effects/GrTextureDomainEffect.cpp')
-rw-r--r-- | src/gpu/effects/GrTextureDomainEffect.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/gpu/effects/GrTextureDomainEffect.cpp b/src/gpu/effects/GrTextureDomainEffect.cpp index 39c992eb8c..5b1c72f77a 100644 --- a/src/gpu/effects/GrTextureDomainEffect.cpp +++ b/src/gpu/effects/GrTextureDomainEffect.cpp @@ -70,12 +70,33 @@ void GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder, builder->fFSCode.append(";\n"); } else { GrAssert(GrTextureDomainEffect::kDecal_WrapMode == effect.wrapMode()); - builder->fFSCode.append("\tbvec4 outside;\n"); - builder->fFSCode.appendf("\toutside.xy = lessThan(%s, %s.xy);\n", coords, domain); - builder->fFSCode.appendf("\toutside.zw = greaterThan(%s, %s.zw);\n", coords, domain); - builder->fFSCode.appendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", outputColor); - builder->appendTextureLookupAndModulate(&builder->fFSCode, inputColor, samplers[0], coords); - builder->fFSCode.append(";\n"); + + if (kImagination_GrGLVendor == builder->ctxInfo().vendor()) { + // On the NexusS and GalaxyNexus, the other path (with the 'any' + // call) causes the compilation error "Calls to any function that + // may require a gradient calculation inside a conditional block + // may return undefined results". This appears to be an issue with + // the 'any' call since even the simple "result=black; if (any()) + // result=white;" code fails to compile. + builder->fFSCode.appendf("\tvec4 outside = vec4(0.0, 0.0, 0.0, 0.0);\n"); + builder->fFSCode.appendf("\tvec4 inside = "); + builder->appendTextureLookupAndModulate(&builder->fFSCode, inputColor, samplers[0], coords); + builder->fFSCode.appendf(";\n"); + + builder->fFSCode.appendf("\tfloat x = abs(2.0*(%s.x - %s.x)/(%s.z - %s.x) - 1.0);\n", + coords, domain, domain, domain); + builder->fFSCode.appendf("\tfloat y = abs(2.0*(%s.y - %s.y)/(%s.w - %s.y) - 1.0);\n", + coords, domain, domain, domain); + builder->fFSCode.appendf("\tfloat blend = step(1.0, max(x, y));\n"); + builder->fFSCode.appendf("\t%s = mix(inside, outside, blend);\n", outputColor); + } else { + builder->fFSCode.append("\tbvec4 outside;\n"); + builder->fFSCode.appendf("\toutside.xy = lessThan(%s, %s.xy);\n", coords, domain); + builder->fFSCode.appendf("\toutside.zw = greaterThan(%s, %s.zw);\n", coords, domain); + builder->fFSCode.appendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", outputColor); + builder->appendTextureLookupAndModulate(&builder->fFSCode, inputColor, samplers[0], coords); + builder->fFSCode.append(";\n"); + } } } |