Index: src/effects/SkPerlinNoiseShader.cpp |
diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp |
index 876740c7ca718b879eea7ceebfb815fe231954ba..1d26920c501db288e86babd562c02f34616630c5 100644 |
--- a/src/effects/SkPerlinNoiseShader.cpp |
+++ b/src/effects/SkPerlinNoiseShader.cpp |
@@ -981,7 +981,7 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, |
const char* stitchDataUni = NULL; |
if (fStitchTiles) { |
fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, |
- kVec4f_GrSLType, "stitchData"); |
+ kVec2f_GrSLType, "stitchData"); |
stitchDataUni = builder->getUniformCStr(fStitchDataUni); |
} |
@@ -1001,35 +1001,26 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, |
const char* ab = "ab"; |
const char* latticeIdx = "latticeIdx"; |
const char* lattice = "lattice"; |
- const char* perlinNoise = "4096.0"; |
const char* inc8bit = "0.00390625"; // 1.0 / 256.0 |
// This is the math to convert the two 16bit integer packed into rgba 8 bit input into a |
// [-1,1] vector and perform a dot product between that vector and the provided vector. |
const char* dotLattice = "dot(((%s.ga + %s.rb * vec2(%s)) * vec2(2.0) - vec2(1.0)), %s);"; |
- // Android precision fix for NON Tegra devices, like, for example: Nexus 10 (ARM's Mali-T604) |
- // The value of perlinNoise is 4096.0, so we need a high precision float to store this |
- const GrGLShaderVar::Precision precision = GrGLShaderVar::kHigh_Precision; |
- const char* precisionString = |
- GrGLShaderVar::PrecisionString(precision, builder->ctxInfo().binding()); |
- |
// Add noise function |
static const GrGLShaderVar gPerlinNoiseArgs[] = { |
GrGLShaderVar(chanCoord, kFloat_GrSLType), |
- GrGLShaderVar(noiseVec, kVec2f_GrSLType, GrGLShaderVar::kNonArray, precision) |
+ GrGLShaderVar(noiseVec, kVec2f_GrSLType) |
}; |
static const GrGLShaderVar gPerlinNoiseStitchArgs[] = { |
GrGLShaderVar(chanCoord, kFloat_GrSLType), |
- GrGLShaderVar(noiseVec, kVec2f_GrSLType, GrGLShaderVar::kNonArray, precision), |
- GrGLShaderVar(stitchData, kVec4f_GrSLType, GrGLShaderVar::kNonArray, precision) |
+ GrGLShaderVar(noiseVec, kVec2f_GrSLType), |
+ GrGLShaderVar(stitchData, kVec2f_GrSLType) |
}; |
SkString noiseCode; |
- noiseCode.appendf( |
- "\t%svec4 %s = vec4(floor(%s) + vec2(%s), fract(%s));", |
- precisionString, noiseXY, noiseVec, perlinNoise, noiseVec); |
+ noiseCode.appendf("\tvec4 %s = vec4(floor(%s), fract(%s));", noiseXY, noiseVec, noiseVec); |
// smooth curve : t * t * (3 - 2 * t) |
noiseCode.appendf("\n\tvec2 %s = %s.zw * %s.zw * (vec2(3.0) - vec2(2.0) * %s.zw);", |
@@ -1037,13 +1028,13 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, |
// Adjust frequencies if we're stitching tiles |
if (fStitchTiles) { |
- noiseCode.appendf("\n\tif(%s.x >= %s.y) { %s.x -= %s.x; }", |
+ noiseCode.appendf("\n\tif(%s.x >= %s.x) { %s.x -= %s.x; }", |
noiseXY, stitchData, noiseXY, stitchData); |
- noiseCode.appendf("\n\tif(%s.x >= (%s.y - 1.0)) { %s.x -= (%s.x - 1.0); }", |
+ noiseCode.appendf("\n\tif(%s.x >= (%s.x - 1.0)) { %s.x -= (%s.x - 1.0); }", |
noiseXY, stitchData, noiseXY, stitchData); |
- noiseCode.appendf("\n\tif(%s.y >= %s.w) { %s.y -= %s.z; }", |
+ noiseCode.appendf("\n\tif(%s.y >= %s.y) { %s.y -= %s.y; }", |
noiseXY, stitchData, noiseXY, stitchData); |
- noiseCode.appendf("\n\tif(%s.y >= (%s.w - 1.0)) { %s.y -= (%s.z - 1.0); }", |
+ noiseCode.appendf("\n\tif(%s.y >= (%s.y - 1.0)) { %s.y -= (%s.y - 1.0); }", |
noiseXY, stitchData, noiseXY, stitchData); |
} |
@@ -1164,7 +1155,7 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, |
if (fStitchTiles) { |
// Set up TurbulenceInitial stitch values. |
- builder->fsCodeAppendf("\n\t\t%s vec4 %s = %s;", precisionString, stitchData, stitchDataUni); |
+ builder->fsCodeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni); |
} |
builder->fsCodeAppendf("\n\t\tfloat %s = 1.0;", ratio); |
@@ -1202,9 +1193,7 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, |
builder->fsCodeAppendf("\n\t\t\t%s *= 0.5;", ratio); |
if (fStitchTiles) { |
- builder->fsCodeAppendf("\n\t\t\t%s.xz *= vec2(2.0);", stitchData); |
- builder->fsCodeAppendf("\n\t\t\t%s.yw = %s.xz + vec2(%s);", |
- stitchData, stitchData, perlinNoise); |
+ builder->fsCodeAppendf("\n\t\t\t%s *= vec2(2.0);", stitchData); |
} |
builder->fsCodeAppend("\n\t\t}"); // end of the for loop on octaves |
@@ -1291,10 +1280,8 @@ void GrGLPerlinNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect |
const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseEffect>(); |
if (turbulence.stitchTiles()) { |
const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchData(); |
- uman.set4f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), |
- SkIntToScalar(stitchData.fWrapX), |
- SkIntToScalar(stitchData.fHeight), |
- SkIntToScalar(stitchData.fWrapY)); |
+ uman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), |
+ SkIntToScalar(stitchData.fHeight)); |
} |
} |