| Index: src/gpu/effects/GrTextureDomain.cpp
|
| diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp
|
| index 2bad5e8fc52e4c8b95c0529fb3175027eea06ccd..40006a3f4998d63fd0f685d741eb01651e64659a 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,
|
|
|