diff options
Diffstat (limited to 'src/gpu/effects/GrTextureDomain.cpp')
-rw-r--r-- | src/gpu/effects/GrTextureDomain.cpp | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp index 2bad5e8fc5..40006a3f49 100644 --- a/src/gpu/effects/GrTextureDomain.cpp +++ b/src/gpu/effects/GrTextureDomain.cpp @@ -5,11 +5,11 @@ * found in the LICENSE file. */ +#include "gl/builders/GrGLProgramBuilder.h" #include "GrTextureDomain.h" #include "GrSimpleTextureEffect.h" #include "GrTBackendEffectFactory.h" #include "gl/GrGLEffect.h" -#include "gl/GrGLShaderBuilder.h" #include "SkFloatingPoint.h" @@ -49,23 +49,25 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLShaderBuilder* builder, SkASSERT((Mode)-1 == fMode || textureDomain.mode() == fMode); SkDEBUGCODE(fMode = textureDomain.mode();) + GrGLProgramBuilder* program = builder->getProgramBuilder(); + if (textureDomain.mode() != kIgnore_Mode && !fDomainUni.isValid()) { const char* name; SkString uniName("TexDom"); if (textureDomain.fIndex >= 0) { uniName.appendS32(textureDomain.fIndex); } - fDomainUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, - kVec4f_GrSLType, uniName.c_str(), &name); + fDomainUni = program->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, + uniName.c_str(), &name); fDomainName = name; } switch (textureDomain.mode()) { case kIgnore_Mode: { - builder->fsCodeAppendf("\t%s = ", outColor); - builder->fsAppendTextureLookupAndModulate(inModulateColor, sampler, + builder->codeAppendf("\t%s = ", outColor); + builder->appendTextureLookupAndModulate(inModulateColor, sampler, inCoords.c_str()); - builder->fsCodeAppend(";\n"); + builder->codeAppend(";\n"); break; } case kClamp_Mode: { @@ -73,49 +75,49 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLShaderBuilder* builder, clampedCoords.appendf("\tclamp(%s, %s.xy, %s.zw)", inCoords.c_str(), fDomainName.c_str(), fDomainName.c_str()); - builder->fsCodeAppendf("\t%s = ", outColor); - builder->fsAppendTextureLookupAndModulate(inModulateColor, sampler, + builder->codeAppendf("\t%s = ", outColor); + builder->appendTextureLookupAndModulate(inModulateColor, sampler, clampedCoords.c_str()); - builder->fsCodeAppend(";\n"); + builder->codeAppend(";\n"); break; } case kDecal_Mode: { // Add a block since we're going to declare variables. - GrGLShaderBuilder::FSBlock block(builder); + GrGLShaderBuilder::ShaderBlock block(builder); const char* domain = fDomainName.c_str(); - if (kImagination_GrGLVendor == builder->ctxInfo().vendor()) { + if (kImagination_GrGLVendor == program->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->fsCodeAppend("\tvec4 outside = vec4(0.0, 0.0, 0.0, 0.0);\n"); - builder->fsCodeAppend("\tvec4 inside = "); - builder->fsAppendTextureLookupAndModulate(inModulateColor, sampler, + builder->codeAppend("\tvec4 outside = vec4(0.0, 0.0, 0.0, 0.0);\n"); + builder->codeAppend("\tvec4 inside = "); + builder->appendTextureLookupAndModulate(inModulateColor, sampler, inCoords.c_str()); - builder->fsCodeAppend(";\n"); - builder->fsCodeAppendf("\tfloat x = (%s).x;\n", inCoords.c_str()); - builder->fsCodeAppendf("\tfloat y = (%s).y;\n", inCoords.c_str()); + builder->codeAppend(";\n"); + builder->codeAppendf("\tfloat x = (%s).x;\n", inCoords.c_str()); + builder->codeAppendf("\tfloat y = (%s).y;\n", inCoords.c_str()); - builder->fsCodeAppendf("\tx = abs(2.0*(x - %s.x)/(%s.z - %s.x) - 1.0);\n", + builder->codeAppendf("\tx = abs(2.0*(x - %s.x)/(%s.z - %s.x) - 1.0);\n", domain, domain, domain); - builder->fsCodeAppendf("\ty = abs(2.0*(y - %s.y)/(%s.w - %s.y) - 1.0);\n", + builder->codeAppendf("\ty = abs(2.0*(y - %s.y)/(%s.w - %s.y) - 1.0);\n", domain, domain, domain); - builder->fsCodeAppend("\tfloat blend = step(1.0, max(x, y));\n"); - builder->fsCodeAppendf("\t%s = mix(inside, outside, blend);\n", outColor); + builder->codeAppend("\tfloat blend = step(1.0, max(x, y));\n"); + builder->codeAppendf("\t%s = mix(inside, outside, blend);\n", outColor); } else { - builder->fsCodeAppend("\tbvec4 outside;\n"); - builder->fsCodeAppendf("\toutside.xy = lessThan(%s, %s.xy);\n", inCoords.c_str(), + builder->codeAppend("\tbvec4 outside;\n"); + builder->codeAppendf("\toutside.xy = lessThan(%s, %s.xy);\n", inCoords.c_str(), domain); - builder->fsCodeAppendf("\toutside.zw = greaterThan(%s, %s.zw);\n", inCoords.c_str(), + builder->codeAppendf("\toutside.zw = greaterThan(%s, %s.zw);\n", inCoords.c_str(), domain); - builder->fsCodeAppendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", + builder->codeAppendf("\t%s = any(outside) ? vec4(0.0, 0.0, 0.0, 0.0) : ", outColor); - builder->fsAppendTextureLookupAndModulate(inModulateColor, sampler, + builder->appendTextureLookupAndModulate(inModulateColor, sampler, inCoords.c_str()); - builder->fsCodeAppend(";\n"); + builder->codeAppend(";\n"); } break; } @@ -125,10 +127,10 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLShaderBuilder* builder, inCoords.c_str(), fDomainName.c_str(), fDomainName.c_str(), fDomainName.c_str(), fDomainName.c_str()); - builder->fsCodeAppendf("\t%s = ", outColor); - builder->fsAppendTextureLookupAndModulate(inModulateColor, sampler, + builder->codeAppendf("\t%s = ", outColor); + builder->appendTextureLookupAndModulate(inModulateColor, sampler, clampedCoords.c_str()); - builder->fsCodeAppend(";\n"); + builder->codeAppend(";\n"); break; } } @@ -167,7 +169,7 @@ class GrGLTextureDomainEffect : public GrGLEffect { public: GrGLTextureDomainEffect(const GrBackendEffectFactory&, const GrDrawEffect&); - virtual void emitCode(GrGLShaderBuilder*, + virtual void emitCode(GrGLProgramBuilder*, const GrDrawEffect&, const GrEffectKey&, const char* outputColor, @@ -189,7 +191,7 @@ GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& f : INHERITED(factory) { } -void GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder, +void GrGLTextureDomainEffect::emitCode(GrGLProgramBuilder* builder, const GrDrawEffect& drawEffect, const GrEffectKey& key, const char* outputColor, @@ -199,8 +201,9 @@ void GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder, const GrTextureDomainEffect& effect = drawEffect.castEffect<GrTextureDomainEffect>(); const GrTextureDomain& domain = effect.textureDomain(); - SkString coords2D = builder->ensureFSCoords2D(coords, 0); - fGLDomain.sampleTexture(builder, domain, outputColor, coords2D, samplers[0], inputColor); + GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); + SkString coords2D = fsBuilder->ensureFSCoords2D(coords, 0); + fGLDomain.sampleTexture(fsBuilder, domain, outputColor, coords2D, samplers[0], inputColor); } void GrGLTextureDomainEffect::setData(const GrGLProgramDataManager& pdman, |