| Index: src/effects/SkPerlinNoiseShader.cpp
|
| diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp
|
| index 1d26920c501db288e86babd562c02f34616630c5..428d88a00e2d3fbe380dacd48bd57859263c7929 100644
|
| --- a/src/effects/SkPerlinNoiseShader.cpp
|
| +++ b/src/effects/SkPerlinNoiseShader.cpp
|
| @@ -506,15 +506,15 @@ public:
|
|
|
| static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
|
|
|
| - virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
|
| + virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
|
|
|
| protected:
|
| SkPerlinNoiseShader::Type fType;
|
| bool fStitchTiles;
|
| int fNumOctaves;
|
| - GrGLUniformManager::UniformHandle fBaseFrequencyUni;
|
| - GrGLUniformManager::UniformHandle fAlphaUni;
|
| - GrGLUniformManager::UniformHandle fInvMatrixUni;
|
| + GrGLUniform* fBaseFrequencyUni;
|
| + GrGLUniform* fAlphaUni;
|
| + GrGLUniform* fInvMatrixUni;
|
| GrGLEffectMatrix fEffectMatrix;
|
|
|
| private:
|
| @@ -535,10 +535,10 @@ public:
|
| const char* inputColor,
|
| const TextureSamplerArray&) SK_OVERRIDE;
|
|
|
| - virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
|
| + virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
|
|
|
| private:
|
| - GrGLUniformManager::UniformHandle fStitchDataUni;
|
| + GrGLUniform* fStitchDataUni;
|
|
|
| typedef GrGLNoise INHERITED;
|
| };
|
| @@ -559,10 +559,10 @@ public:
|
| const char* inputColor,
|
| const TextureSamplerArray&) SK_OVERRIDE;
|
|
|
| - virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
|
| + virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
|
|
|
| private:
|
| - GrGLUniformManager::UniformHandle fSeedUni;
|
| + GrGLUniform* fSeedUni;
|
|
|
| typedef GrGLNoise INHERITED;
|
| };
|
| @@ -752,18 +752,21 @@ void GrGLSimplexNoise::emitCode(GrGLShaderBuilder* builder,
|
| const char* vCoords;
|
| fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords);
|
|
|
| - fSeedUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kFloat_GrSLType, "seed");
|
| - const char* seedUni = builder->getUniformCStr(fSeedUni);
|
| - fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kMat33f_GrSLType, "invMatrix");
|
| - const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni);
|
| - fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kVec2f_GrSLType, "baseFrequency");
|
| - const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni);
|
| - fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kFloat_GrSLType, "alpha");
|
| - const char* alphaUni = builder->getUniformCStr(fAlphaUni);
|
| + GrGLShaderBuilder::Uniform* seedUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLType, "seed");
|
| + fSeedUni = seedUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* invMatrixUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kMat33f_GrSLType, "invMatrix");
|
| + fInvMatrixUni = invMatrixUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* baseFrequencyUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSLType, "baseFrequency");
|
| + fBaseFrequencyUni = baseFrequencyUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* alphaUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLType, "alpha");
|
| + fAlphaUni = alphaUni->glUniform();
|
|
|
| // Add vec3 modulo 289 function
|
| static const GrGLShaderVar gVec3Args[] = {
|
| @@ -904,15 +907,15 @@ void GrGLSimplexNoise::emitCode(GrGLShaderBuilder* builder,
|
| // There are rounding errors if the floor operation is not performed here
|
| builder->fsCodeAppendf(
|
| "\t\tvec3 %s = vec3(floor((%s*vec3(%s, 1.0)).xy) * vec2(0.66) * %s, 0.0);\n",
|
| - noiseVecIni, invMatrixUni, vCoords, baseFrequencyUni);
|
| + noiseVecIni, invMatrixUni->c_str(), vCoords, baseFrequencyUni->c_str());
|
|
|
| // Perturb the texcoords with three components of noise
|
| builder->fsCodeAppendf("\t\t%s += 0.1 * vec3(%s(%s + vec3( 0.0, 0.0, %s)),"
|
| "%s(%s + vec3( 43.0, 17.0, %s)),"
|
| "%s(%s + vec3(-17.0, -43.0, %s)));\n",
|
| - noiseVecIni, noiseFuncName.c_str(), noiseVecIni, seedUni,
|
| - noiseFuncName.c_str(), noiseVecIni, seedUni,
|
| - noiseFuncName.c_str(), noiseVecIni, seedUni);
|
| + noiseVecIni, noiseFuncName.c_str(), noiseVecIni, seedUni->c_str(),
|
| + noiseFuncName.c_str(), noiseVecIni, seedUni->c_str(),
|
| + noiseFuncName.c_str(), noiseVecIni, seedUni->c_str());
|
|
|
| builder->fsCodeAppendf("\t\t%s = vec4(0.0);\n", outputColor);
|
|
|
| @@ -928,7 +931,7 @@ void GrGLSimplexNoise::emitCode(GrGLShaderBuilder* builder,
|
| builder->fsCodeAppendf(
|
| "\t\t\t\t%s[channel] += %s.x * %s(%s * %s.yyy - vec3(%s[%s], %s[%s], %s * %s.z));\n",
|
| outputColor, factors, noiseFuncName.c_str(), noiseVecIni, factors, xOffsets, channel,
|
| - yOffsets, channel, seedUni, factors);
|
| + yOffsets, channel, seedUni->c_str(), factors);
|
|
|
| builder->fsCodeAppend("\t\t\t}\n"); // end of the for loop on channels
|
|
|
| @@ -947,7 +950,7 @@ void GrGLSimplexNoise::emitCode(GrGLShaderBuilder* builder,
|
| outputColor, outputColor, sum);
|
| }
|
|
|
| - builder->fsCodeAppendf("\t\t%s.a *= %s;\n", outputColor, alphaUni);
|
| + builder->fsCodeAppendf("\t\t%s.a *= %s;\n", outputColor, alphaUni->c_str());
|
|
|
| // Clamp values
|
| builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
|
| @@ -968,21 +971,24 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder,
|
| const char* vCoords;
|
| fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords);
|
|
|
| - fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kMat33f_GrSLType, "invMatrix");
|
| - const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni);
|
| - fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kVec2f_GrSLType, "baseFrequency");
|
| - const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni);
|
| - fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kFloat_GrSLType, "alpha");
|
| - const char* alphaUni = builder->getUniformCStr(fAlphaUni);
|
| -
|
| - const char* stitchDataUni = NULL;
|
| + GrGLShaderBuilder::Uniform* invMatrixUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kMat33f_GrSLType, "invMatrix");
|
| + fInvMatrixUni = invMatrixUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* baseFrequencyUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSLType,
|
| + "baseFrequency");
|
| + fBaseFrequencyUni = baseFrequencyUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* alphaUni =
|
| + builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLType, "alpha");
|
| + fAlphaUni = alphaUni->glUniform();
|
| +
|
| + GrGLShaderBuilder::Uniform* stitchDataUni = NULL;
|
| if (fStitchTiles) {
|
| - fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| - kVec2f_GrSLType, "stitchData");
|
| - stitchDataUni = builder->getUniformCStr(fStitchDataUni);
|
| + stitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
|
| + kVec2f_GrSLType, "stitchData");
|
| + fStitchDataUni = stitchDataUni->glUniform();
|
| }
|
|
|
| // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8
|
| @@ -1148,14 +1154,14 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder,
|
|
|
| // There are rounding errors if the floor operation is not performed here
|
| builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s;",
|
| - noiseVec, invMatrixUni, vCoords, baseFrequencyUni);
|
| + noiseVec, invMatrixUni->c_str(), vCoords, baseFrequencyUni->c_str());
|
|
|
| // Clear the color accumulator
|
| builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor);
|
|
|
| if (fStitchTiles) {
|
| // Set up TurbulenceInitial stitch values.
|
| - builder->fsCodeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni);
|
| + builder->fsCodeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni->c_str());
|
| }
|
|
|
| builder->fsCodeAppendf("\n\t\tfloat %s = 1.0;", ratio);
|
| @@ -1203,7 +1209,7 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder,
|
| builder->fsCodeAppendf("\n\t\t%s = %s * vec4(0.5) + vec4(0.5);", outputColor, outputColor);
|
| }
|
|
|
| - builder->fsCodeAppendf("\n\t\t%s.a *= %s;", outputColor, alphaUni);
|
| + builder->fsCodeAppendf("\n\t\t%s.a *= %s;", outputColor, alphaUni->c_str());
|
|
|
| // Clamp values
|
| builder->fsCodeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", outputColor, outputColor);
|
| @@ -1252,12 +1258,12 @@ GrGLEffect::EffectKey GrGLNoise::GenKey(const GrDrawEffect& drawEffect, const Gr
|
| drawEffect.castEffect<GrPerlinNoiseEffect>().coordsType(), NULL);
|
| }
|
|
|
| -void GrGLNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) {
|
| +void GrGLNoise::setData(const GrGLContext& context, const GrDrawEffect& drawEffect) {
|
| const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseEffect>();
|
|
|
| const SkVector& baseFrequency = turbulence.baseFrequency();
|
| - uman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY);
|
| - uman.set1f(fAlphaUni, SkScalarDiv(SkIntToScalar(turbulence.alpha()), SkIntToScalar(255)));
|
| + fBaseFrequencyUni->set2f(context, baseFrequency.fX, baseFrequency.fY);
|
| + fAlphaUni->set1f(context, SkScalarDiv(SkIntToScalar(turbulence.alpha()), SkIntToScalar(255)));
|
|
|
| SkMatrix m = turbulence.matrix();
|
| SkMatrix invM;
|
| @@ -1266,30 +1272,30 @@ void GrGLNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& draw
|
| } else {
|
| invM.postConcat(invM); // Square the matrix
|
| }
|
| - uman.setSkMatrix(fInvMatrixUni, invM);
|
| + fInvMatrixUni->setSkMatrix(context, invM);
|
|
|
| // This (1,1) translation is due to WebKit's 1 based coordinates for the noise
|
| // (as opposed to 0 based, usually). The same adjustment is in the shadeSpan() functions.
|
| m.postTranslate(SK_Scalar1, SK_Scalar1);
|
| - fEffectMatrix.setData(uman, m, drawEffect, NULL);
|
| + fEffectMatrix.setData(context, m, drawEffect, NULL);
|
| }
|
|
|
| -void GrGLPerlinNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) {
|
| - INHERITED::setData(uman, drawEffect);
|
| +void GrGLPerlinNoise::setData(const GrGLContext& context, const GrDrawEffect& drawEffect) {
|
| + INHERITED::setData(context, drawEffect);
|
|
|
| const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseEffect>();
|
| if (turbulence.stitchTiles()) {
|
| const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchData();
|
| - uman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth),
|
| + fStitchDataUni->set2f(context, SkIntToScalar(stitchData.fWidth),
|
| SkIntToScalar(stitchData.fHeight));
|
| }
|
| }
|
|
|
| -void GrGLSimplexNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) {
|
| - INHERITED::setData(uman, drawEffect);
|
| +void GrGLSimplexNoise::setData(const GrGLContext& context, const GrDrawEffect& drawEffect) {
|
| + INHERITED::setData(context, drawEffect);
|
|
|
| const GrSimplexNoiseEffect& turbulence = drawEffect.castEffect<GrSimplexNoiseEffect>();
|
| - uman.set1f(fSeedUni, turbulence.seed());
|
| + fSeedUni->set1f(context, turbulence.seed());
|
| }
|
|
|
| /////////////////////////////////////////////////////////////////////
|
|
|