diff options
author | egdaniel <egdaniel@google.com> | 2015-11-19 07:23:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-19 07:23:45 -0800 |
commit | a2e3e0f7f8ceed2ab152428d7ee2812ad8c842c3 (patch) | |
tree | 7de5c916ac1dc4e50f9f679f530a9f7dcde1b1e3 | |
parent | c0604609cef6a14ca25e794b5db4500f96e2e3b4 (diff) |
Move glsl onto EmitArgs struct for emitCode
BUG=skia:
Review URL: https://codereview.chromium.org/1453623003
20 files changed, 90 insertions, 28 deletions
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index a44563ea08..0dedf0208c 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -724,8 +724,7 @@ void GrGLRectBlurEffect::emitCode(EmitArgs& args) { const char *rectName; const char *profileSizeName; - const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fBuilder->glslCaps(), - fPrecision); + const char* precisionString = GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, fPrecision); fProxyRectUniform = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, fPrecision, diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index cd8b741d3d..77d6cb84aa 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -608,7 +608,11 @@ void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) { } fragBuilder->codeAppend("-vec2(0.5));\t\t"); - fGLDomain.sampleTexture(fragBuilder, domain, args.fOutputColor, SkString(cCoords), + fGLDomain.sampleTexture(fragBuilder, + args.fGLSLCaps, + domain, + args.fOutputColor, + SkString(cCoords), args.fSamplers[1]); fragBuilder->codeAppend(";\n"); } diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp index 8c944bae55..e486e08a64 100644 --- a/src/effects/gradients/SkGradientShader.cpp +++ b/src/effects/gradients/SkGradientShader.cpp @@ -1028,6 +1028,7 @@ uint32_t GrGLGradientEffect::GenBaseGradientKey(const GrProcessor& processor) { void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder, GrGLSLFragmentBuilder* fragBuilder, + const GrGLSLCaps* glslCaps, const GrGradientEffect& ge, const char* gradientTValue, const char* outputColor, @@ -1042,7 +1043,8 @@ void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder, // considerations: // The gradient SkShader reporting opaque is more restrictive than necessary in the two pt // case. Make sure the key reflects this optimization (and note that it can use the same - // shader as thekBeforeIterp case). This same optimization applies to the 3 color case below. + // shader as thekBeforeIterp case). This same optimization applies to the 3 color case + // below. if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) { fragBuilder->codeAppend("\tcolorTemp.rgb *= colorTemp.a;\n"); } @@ -1054,7 +1056,7 @@ void GrGLGradientEffect::emitColor(GrGLSLFPBuilder* builder, gradientTValue); fragBuilder->codeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n", builder->getUniformVariable(fColorStartUni).c_str()); - if (!builder->glslCaps()->canUseMinAndAbsTogether()) { + if (!glslCaps->canUseMinAndAbsTogether()) { // The Tegra3 compiler will sometimes never return if we have // min(abs(oneMinus2t), 1.0), or do the abs first in a separate expression. fragBuilder->codeAppend("\tfloat minAbs = abs(oneMinus2t);\n"); diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h index 8af65a47b7..3c19152d90 100644 --- a/src/effects/gradients/SkGradientShaderPriv.h +++ b/src/effects/gradients/SkGradientShaderPriv.h @@ -427,6 +427,7 @@ protected: // native GLSL mix), and 4+ color gradients that use the traditional texture lookup. void emitColor(GrGLSLFPBuilder* builder, GrGLSLFragmentBuilder* fragBuilder, + const GrGLSLCaps* caps, const GrGradientEffect&, const char* gradientTValue, const char* outputColor, diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index b60ee971f8..0bb896959e 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -608,6 +608,7 @@ void GrGLLinearGradient::emitCode(EmitArgs& args) { t.append(".x"); this->emitColor(args.fBuilder, args.fFragBuilder, + args.fGLSLCaps, ge, t.c_str(), args.fOutputColor, args.fInputColor, diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp index efd41c4a8a..7be8ed111b 100644 --- a/src/effects/gradients/SkRadialGradient.cpp +++ b/src/effects/gradients/SkRadialGradient.cpp @@ -505,6 +505,7 @@ void GrGLRadialGradient::emitCode(EmitArgs& args) { t.append(")"); this->emitColor(args.fBuilder, args.fFragBuilder, + args.fGLSLCaps, ge, t.c_str(), args.fOutputColor, args.fInputColor, diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp index f2f14c4b58..3df7144337 100644 --- a/src/effects/gradients/SkSweepGradient.cpp +++ b/src/effects/gradients/SkSweepGradient.cpp @@ -253,7 +253,7 @@ void GrGLSweepGradient::emitCode(EmitArgs& args) { // 0.1591549430918 is 1/(2*pi), used since atan returns values [-pi, pi] // On Intel GPU there is an issue where it reads the second arguement to atan "- %s.x" as an int // thus must us -1.0 * %s.x to work correctly - if (args.fBuilder->glslCaps()->mustForceNegatedAtanParamToFloat()){ + if (args.fGLSLCaps->mustForceNegatedAtanParamToFloat()){ t.printf("atan(- %s.y, -1.0 * %s.x) * 0.1591549430918 + 0.5", coords2D.c_str(), coords2D.c_str()); } else { @@ -262,6 +262,7 @@ void GrGLSweepGradient::emitCode(EmitArgs& args) { } this->emitColor(args.fBuilder, args.fFragBuilder, + args.fGLSLCaps, ge, t.c_str(), args.fOutputColor, args.fInputColor, diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp index 4633bc25e1..31ceda4f2a 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp @@ -272,6 +272,7 @@ void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) { fragBuilder->codeAppend("\t"); this->emitColor(args.fBuilder, fragBuilder, + args.fGLSLCaps, ge, tName.c_str(), args.fOutputColor, @@ -544,6 +545,7 @@ void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) { fragBuilder->codeAppend("\t\t"); this->emitColor(args.fBuilder, fragBuilder, + args.fGLSLCaps, ge, tName.c_str(), args.fOutputColor, @@ -733,6 +735,7 @@ void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { this->emitColor(args.fBuilder, fragBuilder, + args.fGLSLCaps, ge, tName.c_str(), args.fOutputColor, @@ -998,6 +1001,7 @@ void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) { this->emitColor(args.fBuilder, fragBuilder, + args.fGLSLCaps, ge, tName.c_str(), args.fOutputColor, @@ -1248,6 +1252,7 @@ void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) { fragBuilder->codeAppend("\t\t"); this->emitColor(args.fBuilder, fragBuilder, + args.fGLSLCaps, ge, tName.c_str(), args.fOutputColor, diff --git a/src/gpu/effects/GrBicubicEffect.cpp b/src/gpu/effects/GrBicubicEffect.cpp index d9e6182e7b..8efcffdf03 100644 --- a/src/gpu/effects/GrBicubicEffect.cpp +++ b/src/gpu/effects/GrBicubicEffect.cpp @@ -97,7 +97,12 @@ void GrGLBicubicEffect::emitCode(EmitArgs& args) { coord.printf("coord + %s * vec2(%d, %d)", imgInc, x - 1, y - 1); SkString sampleVar; sampleVar.printf("rowColors[%d]", x); - fDomain.sampleTexture(fragBuilder, domain, sampleVar.c_str(), coord, args.fSamplers[0]); + fDomain.sampleTexture(fragBuilder, + args.fGLSLCaps, + domain, + sampleVar.c_str(), + coord, + args.fSamplers[0]); } fragBuilder->codeAppendf( "\tvec4 s%d = %s(%s, f.x, rowColors[0], rowColors[1], rowColors[2], rowColors[3]);\n", diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp index 94ffc39340..2510b5c9d7 100644 --- a/src/gpu/effects/GrConfigConversionEffect.cpp +++ b/src/gpu/effects/GrConfigConversionEffect.cpp @@ -28,7 +28,7 @@ public: // Using highp for GLES here in order to avoid some precision issues on specific GPUs. GrGLSLShaderVar tmpVar("tmpColor", kVec4f_GrSLType, 0, kHigh_GrSLPrecision); SkString tmpDecl; - tmpVar.appendDecl(args.fBuilder->glslCaps(), &tmpDecl); + tmpVar.appendDecl(args.fGLSLCaps, &tmpDecl); GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp index 159f1849b9..1f3fedef76 100644 --- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp +++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp @@ -100,7 +100,7 @@ public: dfTexEffect.inTextureCoords()->fName); // Use highp to work around aliasing issues - fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(pb->glslCaps(), + fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, kHigh_GrSLPrecision)); fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); @@ -338,7 +338,7 @@ public: "TextureSize", &textureSizeUniName); // Use highp to work around aliasing issues - fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(pb->glslCaps(), + fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, kHigh_GrSLPrecision)); fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); @@ -350,7 +350,7 @@ public: fragBuilder->codeAppend("float distance = " SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold ");"); - fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(pb->glslCaps(), + fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, kHigh_GrSLPrecision)); fragBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); fragBuilder->codeAppend("float afwidth;"); @@ -574,10 +574,10 @@ public: // create LCD offset adjusted by inverse of transform // Use highp to work around aliasing issues - fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(pb->glslCaps(), + fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, kHigh_GrSLPrecision)); fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); - fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(pb->glslCaps(), + fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, kHigh_GrSLPrecision)); SkScalar lcdDelta = 1.0f / (3.0f * atlas->width()); diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp index 7cbf8dc9d3..5fb694b0d7 100644 --- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp +++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp @@ -76,7 +76,12 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { fragBuilder->codeAppendf("float k = %s[%d * %d + %d];", kernel, y, kWidth, x); SkString coord; coord.printf("coord + vec2(%d, %d) * %s", x, y, imgInc); - fDomain.sampleTexture(fragBuilder, domain, "c", coord, args.fSamplers[0]); + fDomain.sampleTexture(fragBuilder, + args.fGLSLCaps, + domain, + "c", + coord, + args.fSamplers[0]); if (!fConvolveAlpha) { fragBuilder->codeAppend("c.rgb /= c.a;"); fragBuilder->codeAppend("c.rgb = clamp(c.rgb, 0.0, 1.0);"); @@ -89,7 +94,12 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { fragBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", args.fOutputColor, args.fOutputColor, args.fOutputColor); } else { - fDomain.sampleTexture(fragBuilder, domain, "c", coords2D, args.fSamplers[0]); + fDomain.sampleTexture(fragBuilder, + args.fGLSLCaps, + domain, + "c", + coords2D, + args.fSamplers[0]); fragBuilder->codeAppendf("%s.a = c.a;", args.fOutputColor); fragBuilder->codeAppendf("%s.rgb = sum.rgb * %s + %s;", args.fOutputColor, gain, bias); fragBuilder->codeAppendf("%s.rgb *= %s.a;", args.fOutputColor, args.fOutputColor); diff --git a/src/gpu/effects/GrTextureDomain.cpp b/src/gpu/effects/GrTextureDomain.cpp index cc2f808306..c0902c6176 100644 --- a/src/gpu/effects/GrTextureDomain.cpp +++ b/src/gpu/effects/GrTextureDomain.cpp @@ -42,6 +42,7 @@ GrTextureDomain::GrTextureDomain(const SkRect& domain, Mode mode, int index) ////////////////////////////////////////////////////////////////////////////// void GrTextureDomain::GLDomain::sampleTexture(GrGLSLShaderBuilder* builder, + const GrGLSLCaps* glslCaps, const GrTextureDomain& textureDomain, const char* outColor, const SkString& inCoords, @@ -88,7 +89,7 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLSLShaderBuilder* builder, GrGLSLShaderBuilder::ShaderBlock block(builder); const char* domain = fDomainName.c_str(); - if (!program->glslCaps()->canUseAnyFunctionInShader()) { + if (!glslCaps->canUseAnyFunctionInShader()) { // 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 @@ -101,10 +102,10 @@ void GrTextureDomain::GLDomain::sampleTexture(GrGLSLShaderBuilder* builder, inCoords.c_str()); builder->codeAppend(";"); - builder->codeAppend(GrGLSLShaderVar::PrecisionString(program->glslCaps(), + builder->codeAppend(GrGLSLShaderVar::PrecisionString(glslCaps, kHigh_GrSLPrecision)); builder->codeAppendf("float x = (%s).x;", inCoords.c_str()); - builder->codeAppend(GrGLSLShaderVar::PrecisionString(program->glslCaps(), + builder->codeAppend(GrGLSLShaderVar::PrecisionString(glslCaps, kHigh_GrSLPrecision)); builder->codeAppendf("float y = (%s).y;", inCoords.c_str()); @@ -197,7 +198,12 @@ void GrGLTextureDomainEffect::emitCode(EmitArgs& args) { GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0); - fGLDomain.sampleTexture(fragBuilder, domain, args.fOutputColor, coords2D, args.fSamplers[0], + fGLDomain.sampleTexture(fragBuilder, + args.fGLSLCaps, + domain, + args.fOutputColor, + coords2D, + args.fSamplers[0], args.fInputColor); } diff --git a/src/gpu/effects/GrTextureDomain.h b/src/gpu/effects/GrTextureDomain.h index cd06304639..49e557d18a 100644 --- a/src/gpu/effects/GrTextureDomain.h +++ b/src/gpu/effects/GrTextureDomain.h @@ -114,6 +114,7 @@ public: * expression before being written to outColor. */ void sampleTexture(GrGLSLShaderBuilder* builder, + const GrGLSLCaps* glslCaps, const GrTextureDomain& textureDomain, const char* outColor, const SkString& inCoords, diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp index c9706f61d6..22834053f0 100644 --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp @@ -261,6 +261,7 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrFragmentProcessor& fp, GrGLSLFragmentProcessor::EmitArgs args(this, &fFS, + this->glslCaps(), fp, outColor, inColor, @@ -285,8 +286,16 @@ void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp, SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures()); this->emitSamplers(gp, &samplers, fGeometryProcessor); - GrGLSLGeometryProcessor::EmitArgs args(this, &fVS, &fFS, gp, outColor, outCoverage, samplers, - fCoordTransforms, &fOutCoords); + GrGLSLGeometryProcessor::EmitArgs args(this, + &fVS, + &fFS, + this->glslCaps(), + gp, + outColor, + outCoverage, + samplers, + fCoordTransforms, + &fOutCoords); fGeometryProcessor->fGLProc->emitCode(args); // We have to check that effects and the code they emit are consistent, ie if an effect @@ -321,9 +330,14 @@ void GrGLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures()); this->emitSamplers(xp, &samplers, fXferProcessor); - GrGLSLXferProcessor::EmitArgs args(this, &fFS, xp, colorIn.c_str(), coverageIn.c_str(), + GrGLSLXferProcessor::EmitArgs args(this, + &fFS, + this->glslCaps(), + xp, colorIn.c_str(), + coverageIn.c_str(), fFS.getPrimaryColorOutputName(), - fFS.getSecondaryColorOutputName(), samplers); + fFS.getSecondaryColorOutputName(), + samplers); fXferProcessor->fGLProc->emitCode(args); // We have to check that effects and the code they emit are consistent, ie if an effect diff --git a/src/gpu/glsl/GrGLSLFragmentProcessor.cpp b/src/gpu/glsl/GrGLSLFragmentProcessor.cpp index f32dd090df..a0019669f2 100644 --- a/src/gpu/glsl/GrGLSLFragmentProcessor.cpp +++ b/src/gpu/glsl/GrGLSLFragmentProcessor.cpp @@ -95,6 +95,7 @@ void GrGLSLFragmentProcessor::internalEmitChild(int childIndex, const char* inpu fragBuilder->getMangleString().c_str(), childProc.name()); EmitArgs childArgs(args.fBuilder, fragBuilder, + args.fGLSLCaps, childProc, outputColor, inputColor, diff --git a/src/gpu/glsl/GrGLSLFragmentProcessor.h b/src/gpu/glsl/GrGLSLFragmentProcessor.h index 816b648c47..0fd1ae3c32 100644 --- a/src/gpu/glsl/GrGLSLFragmentProcessor.h +++ b/src/gpu/glsl/GrGLSLFragmentProcessor.h @@ -53,6 +53,7 @@ public: struct EmitArgs { EmitArgs(GrGLSLFPBuilder* builder, GrGLSLFragmentBuilder* fragBuilder, + const GrGLSLCaps* caps, const GrFragmentProcessor& fp, const char* outputColor, const char* inputColor, @@ -60,6 +61,7 @@ public: const TextureSamplerArray& samplers) : fBuilder(builder) , fFragBuilder(fragBuilder) + , fGLSLCaps(caps) , fFp(fp) , fOutputColor(outputColor) , fInputColor(inputColor) @@ -67,6 +69,7 @@ public: , fSamplers(samplers) {} GrGLSLFPBuilder* fBuilder; GrGLSLFragmentBuilder* fFragBuilder; + const GrGLSLCaps* fGLSLCaps; const GrFragmentProcessor& fFp; const char* fOutputColor; const char* fInputColor; diff --git a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h index 9ce65b4079..a4582378c3 100644 --- a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h +++ b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h @@ -15,9 +15,10 @@ class GrBatchTracker; class GrPrimitiveProcessor; -class GrGLSLVertexBuilder; +class GrGLSLCaps; class GrGLSLFragmentBuilder; class GrGLSLGPBuilder; +class GrGLSLVertexBuilder; class GrGLSLPrimitiveProcessor { public: @@ -34,6 +35,7 @@ public: EmitArgs(GrGLSLGPBuilder* pb, GrGLSLVertexBuilder* vertBuilder, GrGLSLFragmentBuilder* fragBuilder, + const GrGLSLCaps* caps, const GrPrimitiveProcessor& gp, const char* outputColor, const char* outputCoverage, @@ -43,6 +45,7 @@ public: : fPB(pb) , fVertBuilder(vertBuilder) , fFragBuilder(fragBuilder) + , fGLSLCaps(caps) , fGP(gp) , fOutputColor(outputColor) , fOutputCoverage(outputCoverage) @@ -52,6 +55,7 @@ public: GrGLSLGPBuilder* fPB; GrGLSLVertexBuilder* fVertBuilder; GrGLSLFragmentBuilder* fFragBuilder; + const GrGLSLCaps* fGLSLCaps; const GrPrimitiveProcessor& fGP; const char* fOutputColor; const char* fOutputCoverage; diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.h b/src/gpu/glsl/GrGLSLProgramBuilder.h index 4f3f8a5291..e87ab0aee9 100644 --- a/src/gpu/glsl/GrGLSLProgramBuilder.h +++ b/src/gpu/glsl/GrGLSLProgramBuilder.h @@ -65,8 +65,6 @@ public: */ virtual const char* getUniformCStr(UniformHandle u) const = 0; - virtual const GrGLSLCaps* glslCaps() const = 0; - /* * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE */ @@ -193,6 +191,8 @@ class GrGLSLProgramBuilder : public GrGLSLGPBuilder, public: typedef GrGpu::DrawArgs DrawArgs; + virtual const GrGLSLCaps* glslCaps() const = 0; + // Handles for program uniforms (other than per-effect uniforms) struct BuiltinUniformHandles { UniformHandle fRTAdjustmentUni; diff --git a/src/gpu/glsl/GrGLSLXferProcessor.h b/src/gpu/glsl/GrGLSLXferProcessor.h index 034835eb86..46d775d405 100644 --- a/src/gpu/glsl/GrGLSLXferProcessor.h +++ b/src/gpu/glsl/GrGLSLXferProcessor.h @@ -11,9 +11,10 @@ #include "glsl/GrGLSLProgramDataManager.h" #include "glsl/GrGLSLTextureSampler.h" -class GrGLSLXPFragmentBuilder; -class GrGLSLXPBuilder; class GrXferProcessor; +class GrGLSLXPBuilder; +class GrGLSLXPFragmentBuilder; +class GrGLSLCaps; class GrGLSLXferProcessor { public: @@ -24,6 +25,7 @@ public: struct EmitArgs { EmitArgs(GrGLSLXPBuilder* pb, GrGLSLXPFragmentBuilder* fragBuilder, + const GrGLSLCaps* caps, const GrXferProcessor& xp, const char* inputColor, const char* inputCoverage, @@ -32,6 +34,7 @@ public: const TextureSamplerArray& samplers) : fPB(pb) , fXPFragBuilder(fragBuilder) + , fGLSLCaps(caps) , fXP(xp) , fInputColor(inputColor) , fInputCoverage(inputCoverage) @@ -41,6 +44,7 @@ public: GrGLSLXPBuilder* fPB; GrGLSLXPFragmentBuilder* fXPFragBuilder; + const GrGLSLCaps* fGLSLCaps; const GrXferProcessor& fXP; const char* fInputColor; const char* fInputCoverage; |