diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-09-18 14:10:39 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-09-18 18:32:13 +0000 |
commit | f7b8820dc813d1eb0b6b43fe4581dded0da38caf (patch) | |
tree | 518d313a9fa571a9f9ca26af7c381664694a4706 /src/shaders | |
parent | 47a540f503bc722393b61c4b822e95b17f200125 (diff) |
re-land of new SkSL precisions
Bug: skia:
Change-Id: Ic1deb3db2cbda6ca45f93dee99832971a36a2119
Reviewed-on: https://skia-review.googlesource.com/47841
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/shaders')
-rw-r--r-- | src/shaders/SkPerlinNoiseShader.cpp | 187 | ||||
-rw-r--r-- | src/shaders/gradients/SkGradientShader.cpp | 38 | ||||
-rw-r--r-- | src/shaders/gradients/SkSweepGradient.cpp | 4 | ||||
-rw-r--r-- | src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp | 63 |
4 files changed, 139 insertions, 153 deletions
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp index 0d951cde89..bdbd5bd8a4 100644 --- a/src/shaders/SkPerlinNoiseShader.cpp +++ b/src/shaders/SkPerlinNoiseShader.cpp @@ -816,15 +816,13 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; SkString vCoords = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "baseFrequency"); const char* baseFrequencyUni = uniformHandler->getUniformCStr(fBaseFrequencyUni); const char* stitchDataUni = nullptr; if (pne.stitchTiles()) { - fStitchDataUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fStitchDataUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "stitchData"); stitchDataUni = uniformHandler->getUniformCStr(fStitchDataUni); } @@ -849,29 +847,29 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { 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 * float2(%s)) * float2(2.0) - float2(1.0)), %s);"; + const char* dotLattice = "dot(((%s.ga + %s.rb * half2(%s)) * half2(2.0) - half2(1.0)), %s);"; // Add noise function static const GrShaderVar gPerlinNoiseArgs[] = { - GrShaderVar(chanCoord, kFloat_GrSLType), - GrShaderVar(noiseVec, kVec2f_GrSLType) + GrShaderVar(chanCoord, kHalf_GrSLType), + GrShaderVar(noiseVec, kHalf2_GrSLType) }; static const GrShaderVar gPerlinNoiseStitchArgs[] = { - GrShaderVar(chanCoord, kFloat_GrSLType), - GrShaderVar(noiseVec, kVec2f_GrSLType), - GrShaderVar(stitchData, kVec2f_GrSLType) + GrShaderVar(chanCoord, kHalf_GrSLType), + GrShaderVar(noiseVec, kHalf2_GrSLType), + GrShaderVar(stitchData, kHalf2_GrSLType) }; SkString noiseCode; - noiseCode.appendf("\tfloat4 %s;\n", floorVal); + noiseCode.appendf("\thalf4 %s;\n", floorVal); noiseCode.appendf("\t%s.xy = floor(%s);\n", floorVal, noiseVec); - noiseCode.appendf("\t%s.zw = %s.xy + float2(1.0);\n", floorVal, floorVal); - noiseCode.appendf("\tfloat2 %s = fract(%s);\n", fractVal, noiseVec); + noiseCode.appendf("\t%s.zw = %s.xy + half2(1.0);\n", floorVal, floorVal); + noiseCode.appendf("\thalf2 %s = fract(%s);\n", fractVal, noiseVec); // smooth curve : t * t * (3 - 2 * t) - noiseCode.appendf("\n\tfloat2 %s = %s * %s * (float2(3.0) - float2(2.0) * %s);", + noiseCode.appendf("\n\thalf2 %s = %s * %s * (half2(3.0) - half2(2.0) * %s);", noiseSmooth, fractVal, fractVal, fractVal); // Adjust frequencies if we're stitching tiles @@ -887,28 +885,28 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { } // Get texture coordinates and normalize - noiseCode.appendf("\n\t%s = fract(floor(mod(%s, 256.0)) / float4(256.0));\n", + noiseCode.appendf("\n\t%s = fract(floor(mod(%s, 256.0)) / half4(256.0));\n", floorVal, floorVal); // Get permutation for x { SkString xCoords(""); - xCoords.appendf("float2(%s.x, 0.5)", floorVal); + xCoords.appendf("half2(%s.x, 0.5)", floorVal); - noiseCode.appendf("\n\tfloat2 %s;\n\t%s.x = ", latticeIdx, latticeIdx); + noiseCode.appendf("\n\thalf2 %s;\n\t%s.x = ", latticeIdx, latticeIdx); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[0], xCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.append(".r;"); } // Get permutation for x + 1 { SkString xCoords(""); - xCoords.appendf("float2(%s.z, 0.5)", floorVal); + xCoords.appendf("half2(%s.z, 0.5)", floorVal); noiseCode.appendf("\n\t%s.y = ", latticeIdx); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[0], xCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.append(".r;"); } @@ -919,21 +917,21 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { // (or 0.484368 here). The following rounding operation prevents these precision issues from // affecting the result of the noise by making sure that we only have multiples of 1/255. // (Note that 1/255 is about 0.003921569, which is the value used here). - noiseCode.appendf("\n\t%s = floor(%s * float2(255.0) + float2(0.5)) * float2(0.003921569);", + noiseCode.appendf("\n\t%s = floor(%s * half2(255.0) + half2(0.5)) * half2(0.003921569);", latticeIdx, latticeIdx); #endif // Get (x,y) coordinates with the permutated x - noiseCode.appendf("\n\tfloat4 %s = fract(%s.xyxy + %s.yyww);", bcoords, latticeIdx, floorVal); + noiseCode.appendf("\n\thalf4 %s = fract(%s.xyxy + %s.yyww);", bcoords, latticeIdx, floorVal); - noiseCode.appendf("\n\n\tfloat2 %s;", uv); + noiseCode.appendf("\n\n\thalf2 %s;", uv); // Compute u, at offset (0,0) { SkString latticeCoords(""); - latticeCoords.appendf("float2(%s.x, %s)", bcoords, chanCoord); - noiseCode.appendf("\n\tfloat4 %s = ", lattice); + latticeCoords.appendf("half2(%s.x, %s)", bcoords, chanCoord); + noiseCode.appendf("\n\thalf4 %s = ", lattice); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[1], latticeCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.appendf(".bgra;\n\t%s.x = ", uv); noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); } @@ -942,26 +940,26 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { // Compute v, at offset (-1,0) { SkString latticeCoords(""); - latticeCoords.appendf("float2(%s.y, %s)", bcoords, chanCoord); + latticeCoords.appendf("half2(%s.y, %s)", bcoords, chanCoord); noiseCode.append("\n\tlattice = "); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[1], latticeCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.appendf(".bgra;\n\t%s.y = ", uv); noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); } // Compute 'a' as a linear interpolation of 'u' and 'v' - noiseCode.appendf("\n\tfloat2 %s;", ab); + noiseCode.appendf("\n\thalf2 %s;", ab); noiseCode.appendf("\n\t%s.x = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmooth); noiseCode.appendf("\n\t%s.y -= 1.0;", fractVal); // Compute v, at offset (-1,-1) { SkString latticeCoords(""); - latticeCoords.appendf("float2(%s.w, %s)", bcoords, chanCoord); + latticeCoords.appendf("half2(%s.w, %s)", bcoords, chanCoord); noiseCode.append("\n\tlattice = "); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[1], latticeCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.appendf(".bgra;\n\t%s.y = ", uv); noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); } @@ -970,10 +968,10 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { // Compute u, at offset (0,-1) { SkString latticeCoords(""); - latticeCoords.appendf("float2(%s.z, %s)", bcoords, chanCoord); + latticeCoords.appendf("half2(%s.z, %s)", bcoords, chanCoord); noiseCode.append("\n\tlattice = "); fragBuilder->appendTextureLookup(&noiseCode, args.fTexSamplers[1], latticeCoords.c_str(), - kVec2f_GrSLType); + kHalf2_GrSLType); noiseCode.appendf(".bgra;\n\t%s.x = ", uv); noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); } @@ -985,28 +983,28 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { SkString noiseFuncName; if (pne.stitchTiles()) { - fragBuilder->emitFunction(kFloat_GrSLType, + fragBuilder->emitFunction(kHalf_GrSLType, "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitchArgs), gPerlinNoiseStitchArgs, noiseCode.c_str(), &noiseFuncName); } else { - fragBuilder->emitFunction(kFloat_GrSLType, + fragBuilder->emitFunction(kHalf_GrSLType, "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs), gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncName); } // There are rounding errors if the floor operation is not performed here - fragBuilder->codeAppendf("\n\t\tfloat2 %s = floor(%s.xy) * %s;", + fragBuilder->codeAppendf("\n\t\thalf2 %s = floor(%s.xy) * %s;", noiseVec, vCoords.c_str(), baseFrequencyUni); // Clear the color accumulator - fragBuilder->codeAppendf("\n\t\t%s = float4(0.0);", args.fOutputColor); + fragBuilder->codeAppendf("\n\t\t%s = half4(0.0);", args.fOutputColor); if (pne.stitchTiles()) { // Set up TurbulenceInitial stitch values. - fragBuilder->codeAppendf("\n\t\tfloat2 %s = %s;", stitchData, stitchDataUni); + fragBuilder->codeAppendf("\n\t\thalf2 %s = %s;", stitchData, stitchDataUni); } - fragBuilder->codeAppendf("\n\t\tfloat %s = 1.0;", ratio); + fragBuilder->codeAppendf("\n\t\thalf %s = 1.0;", ratio); // Loop over all octaves fragBuilder->codeAppendf("for (int octave = 0; octave < %d; ++octave) {", pne.numOctaves()); @@ -1017,7 +1015,7 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { } if (pne.stitchTiles()) { fragBuilder->codeAppendf( - "float4(\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s)," + "half4(\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s)," "\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s))", noiseFuncName.c_str(), chanCoordR, noiseVec, stitchData, noiseFuncName.c_str(), chanCoordG, noiseVec, stitchData, @@ -1025,7 +1023,7 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { noiseFuncName.c_str(), chanCoordA, noiseVec, stitchData); } else { fragBuilder->codeAppendf( - "float4(\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s)," + "half4(\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s)," "\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s))", noiseFuncName.c_str(), chanCoordR, noiseVec, noiseFuncName.c_str(), chanCoordG, noiseVec, @@ -1037,18 +1035,18 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { } fragBuilder->codeAppendf(" * %s;", ratio); - fragBuilder->codeAppendf("\n\t\t\t%s *= float2(2.0);", noiseVec); + fragBuilder->codeAppendf("\n\t\t\t%s *= half2(2.0);", noiseVec); fragBuilder->codeAppendf("\n\t\t\t%s *= 0.5;", ratio); if (pne.stitchTiles()) { - fragBuilder->codeAppendf("\n\t\t\t%s *= float2(2.0);", stitchData); + fragBuilder->codeAppendf("\n\t\t\t%s *= half2(2.0);", stitchData); } fragBuilder->codeAppend("\n\t\t}"); // end of the for loop on octaves if (pne.type() == SkPerlinNoiseShaderImpl::kFractalNoise_Type) { // The value of turbulenceFunctionResult comes from ((turbulenceFunctionResult) + 1) / 2 // by fractalNoise and (turbulenceFunctionResult) by turbulence. - fragBuilder->codeAppendf("\n\t\t%s = %s * float4(0.5) + float4(0.5);", + fragBuilder->codeAppendf("\n\t\t%s = %s * half4(0.5) + half4(0.5);", args.fOutputColor,args.fOutputColor); } @@ -1056,7 +1054,7 @@ void GrGLPerlinNoise::emitCode(EmitArgs& args) { fragBuilder->codeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", args.fOutputColor, args.fOutputColor); // Pre-multiply the result - fragBuilder->codeAppendf("\n\t\t%s = float4(%s.rgb * %s.aaa, %s.a);\n", + fragBuilder->codeAppendf("\n\t\t%s = half4(%s.rgb * %s.aaa, %s.a);\n", args.fOutputColor, args.fOutputColor, args.fOutputColor, args.fOutputColor); } @@ -1235,133 +1233,130 @@ void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; SkString vCoords = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fBaseFrequencyUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "baseFrequency"); const char* baseFrequencyUni = uniformHandler->getUniformCStr(fBaseFrequencyUni); - fZUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kFloat_GrSLType, kDefault_GrSLPrecision, - "z"); + fZUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, "z"); const char* zUni = uniformHandler->getUniformCStr(fZUni); // fade function static const GrShaderVar fadeArgs[] = { - GrShaderVar("t", kVec3f_GrSLType) + GrShaderVar("t", kHalf3_GrSLType) }; SkString fadeFuncName; - fragBuilder->emitFunction(kVec3f_GrSLType, "fade", SK_ARRAY_COUNT(fadeArgs), + fragBuilder->emitFunction(kHalf3_GrSLType, "fade", SK_ARRAY_COUNT(fadeArgs), fadeArgs, "return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);", &fadeFuncName); // perm function static const GrShaderVar permArgs[] = { - GrShaderVar("x", kFloat_GrSLType) + GrShaderVar("x", kHalf_GrSLType) }; SkString permFuncName; SkString permCode("return "); // FIXME even though I'm creating these textures with kRepeat_TileMode, they're clamped. Not // sure why. Using fract() (here and the next texture lookup) as a workaround. - fragBuilder->appendTextureLookup(&permCode, args.fTexSamplers[0], "float2(fract(x / 256.0), 0.0)", - kVec2f_GrSLType); + fragBuilder->appendTextureLookup(&permCode, args.fTexSamplers[0], "highfloat2(fract(x / 256.0), 0.0)", + kHalf2_GrSLType); permCode.append(".r * 255.0;"); - fragBuilder->emitFunction(kFloat_GrSLType, "perm", SK_ARRAY_COUNT(permArgs), permArgs, + fragBuilder->emitFunction(kHalf_GrSLType, "perm", SK_ARRAY_COUNT(permArgs), permArgs, permCode.c_str(), &permFuncName); // grad function static const GrShaderVar gradArgs[] = { - GrShaderVar("x", kFloat_GrSLType), - GrShaderVar("p", kVec3f_GrSLType) + GrShaderVar("x", kHalf_GrSLType), + GrShaderVar("p", kHalf3_GrSLType) }; SkString gradFuncName; SkString gradCode("return dot("); - fragBuilder->appendTextureLookup(&gradCode, args.fTexSamplers[1], "float2(fract(x / 16.0), 0.0)", - kVec2f_GrSLType); - gradCode.append(".rgb * 255.0 - float3(1.0), p);"); - fragBuilder->emitFunction(kFloat_GrSLType, "grad", SK_ARRAY_COUNT(gradArgs), gradArgs, + fragBuilder->appendTextureLookup(&gradCode, args.fTexSamplers[1], "highfloat2(fract(x / 16.0), 0.0)", + kHalf2_GrSLType); + gradCode.append(".rgb * 255.0 - highfloat3(1.0), p);"); + fragBuilder->emitFunction(kHalf_GrSLType, "grad", SK_ARRAY_COUNT(gradArgs), gradArgs, gradCode.c_str(), &gradFuncName); // lerp function static const GrShaderVar lerpArgs[] = { - GrShaderVar("a", kFloat_GrSLType), - GrShaderVar("b", kFloat_GrSLType), - GrShaderVar("w", kFloat_GrSLType) + GrShaderVar("a", kHalf_GrSLType), + GrShaderVar("b", kHalf_GrSLType), + GrShaderVar("w", kHalf_GrSLType) }; SkString lerpFuncName; - fragBuilder->emitFunction(kFloat_GrSLType, "lerp", SK_ARRAY_COUNT(lerpArgs), lerpArgs, + fragBuilder->emitFunction(kHalf_GrSLType, "lerp", SK_ARRAY_COUNT(lerpArgs), lerpArgs, "return a + w * (b - a);", &lerpFuncName); // noise function static const GrShaderVar noiseArgs[] = { - GrShaderVar("p", kVec3f_GrSLType), + GrShaderVar("p", kHalf3_GrSLType), }; SkString noiseFuncName; SkString noiseCode; - noiseCode.append("float3 P = mod(floor(p), 256.0);"); + noiseCode.append("half3 P = mod(floor(p), 256.0);"); noiseCode.append("p -= floor(p);"); - noiseCode.appendf("float3 f = %s(p);", fadeFuncName.c_str()); - noiseCode.appendf("float A = %s(P.x) + P.y;", permFuncName.c_str()); - noiseCode.appendf("float AA = %s(A) + P.z;", permFuncName.c_str()); - noiseCode.appendf("float AB = %s(A + 1.0) + P.z;", permFuncName.c_str()); - noiseCode.appendf("float B = %s(P.x + 1.0) + P.y;", permFuncName.c_str()); - noiseCode.appendf("float BA = %s(B) + P.z;", permFuncName.c_str()); - noiseCode.appendf("float BB = %s(B + 1.0) + P.z;", permFuncName.c_str()); - noiseCode.appendf("float result = %s(", lerpFuncName.c_str()); + noiseCode.appendf("half3 f = %s(p);", fadeFuncName.c_str()); + noiseCode.appendf("half A = %s(P.x) + P.y;", permFuncName.c_str()); + noiseCode.appendf("half AA = %s(A) + P.z;", permFuncName.c_str()); + noiseCode.appendf("half AB = %s(A + 1.0) + P.z;", permFuncName.c_str()); + noiseCode.appendf("half B = %s(P.x + 1.0) + P.y;", permFuncName.c_str()); + noiseCode.appendf("half BA = %s(B) + P.z;", permFuncName.c_str()); + noiseCode.appendf("half BB = %s(B + 1.0) + P.z;", permFuncName.c_str()); + noiseCode.appendf("half result = %s(", lerpFuncName.c_str()); noiseCode.appendf("%s(%s(%s(%s(AA), p),", lerpFuncName.c_str(), lerpFuncName.c_str(), gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(BA), p + float3(-1.0, 0.0, 0.0)), f.x),", gradFuncName.c_str(), + noiseCode.appendf("%s(%s(BA), p + half3(-1.0, 0.0, 0.0)), f.x),", gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(%s(AB), p + float3(0.0, -1.0, 0.0)),", lerpFuncName.c_str(), + noiseCode.appendf("%s(%s(%s(AB), p + half3(0.0, -1.0, 0.0)),", lerpFuncName.c_str(), gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(BB), p + float3(-1.0, -1.0, 0.0)), f.x), f.y),", + noiseCode.appendf("%s(%s(BB), p + half3(-1.0, -1.0, 0.0)), f.x), f.y),", gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(%s(%s(AA + 1.0), p + float3(0.0, 0.0, -1.0)),", + noiseCode.appendf("%s(%s(%s(%s(AA + 1.0), p + half3(0.0, 0.0, -1.0)),", lerpFuncName.c_str(), lerpFuncName.c_str(), gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(BA + 1.0), p + float3(-1.0, 0.0, -1.0)), f.x),", + noiseCode.appendf("%s(%s(BA + 1.0), p + half3(-1.0, 0.0, -1.0)), f.x),", gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(%s(AB + 1.0), p + float3(0.0, -1.0, -1.0)),", + noiseCode.appendf("%s(%s(%s(AB + 1.0), p + half3(0.0, -1.0, -1.0)),", lerpFuncName.c_str(), gradFuncName.c_str(), permFuncName.c_str()); - noiseCode.appendf("%s(%s(BB + 1.0), p + float3(-1.0, -1.0, -1.0)), f.x), f.y), f.z);", + noiseCode.appendf("%s(%s(BB + 1.0), p + half3(-1.0, -1.0, -1.0)), f.x), f.y), f.z);", gradFuncName.c_str(), permFuncName.c_str()); noiseCode.append("return result;"); - fragBuilder->emitFunction(kFloat_GrSLType, "noise", SK_ARRAY_COUNT(noiseArgs), noiseArgs, + fragBuilder->emitFunction(kHalf_GrSLType, "noise", SK_ARRAY_COUNT(noiseArgs), noiseArgs, noiseCode.c_str(), &noiseFuncName); // noiseOctaves function static const GrShaderVar noiseOctavesArgs[] = { - GrShaderVar("p", kVec3f_GrSLType) + GrShaderVar("p", kHalf3_GrSLType) }; SkString noiseOctavesFuncName; SkString noiseOctavesCode; - noiseOctavesCode.append("float result = 0.0;"); - noiseOctavesCode.append("float ratio = 1.0;"); - noiseOctavesCode.appendf("for (float i = 0.0; i < %d; i++) {", pne.octaves()); + noiseOctavesCode.append("half result = 0.0;"); + noiseOctavesCode.append("half ratio = 1.0;"); + noiseOctavesCode.appendf("for (half i = 0.0; i < %d; i++) {", pne.octaves()); noiseOctavesCode.appendf("result += %s(p) / ratio;", noiseFuncName.c_str()); noiseOctavesCode.append("p *= 2.0;"); noiseOctavesCode.append("ratio *= 2.0;"); noiseOctavesCode.append("}"); noiseOctavesCode.append("return (result + 1.0) / 2.0;"); - fragBuilder->emitFunction(kFloat_GrSLType, "noiseOctaves", SK_ARRAY_COUNT(noiseOctavesArgs), + fragBuilder->emitFunction(kHalf_GrSLType, "noiseOctaves", SK_ARRAY_COUNT(noiseOctavesArgs), noiseOctavesArgs, noiseOctavesCode.c_str(), &noiseOctavesFuncName); - fragBuilder->codeAppendf("float2 coords = %s * %s;", vCoords.c_str(), baseFrequencyUni); - fragBuilder->codeAppendf("float r = %s(float3(coords, %s));", noiseOctavesFuncName.c_str(), + fragBuilder->codeAppendf("half2 coords = %s * %s;", vCoords.c_str(), baseFrequencyUni); + fragBuilder->codeAppendf("half r = %s(half3(coords, %s));", noiseOctavesFuncName.c_str(), zUni); - fragBuilder->codeAppendf("float g = %s(float3(coords, %s + 0000.0));", + fragBuilder->codeAppendf("half g = %s(half3(coords, %s + 0000.0));", noiseOctavesFuncName.c_str(), zUni); - fragBuilder->codeAppendf("float b = %s(float3(coords, %s + 0000.0));", + fragBuilder->codeAppendf("half b = %s(half3(coords, %s + 0000.0));", noiseOctavesFuncName.c_str(), zUni); - fragBuilder->codeAppendf("float a = %s(float3(coords, %s + 0000.0));", + fragBuilder->codeAppendf("half a = %s(half3(coords, %s + 0000.0));", noiseOctavesFuncName.c_str(), zUni); - fragBuilder->codeAppendf("%s = float4(r, g, b, a);", args.fOutputColor); + fragBuilder->codeAppendf("%s = half4(r, g, b, a);", args.fOutputColor); // Clamp values fragBuilder->codeAppendf("%s = clamp(%s, 0.0, 1.0);", args.fOutputColor, args.fOutputColor); // Pre-multiply the result - fragBuilder->codeAppendf("\n\t\t%s = float4(%s.rgb * %s.aaa, %s.a);\n", + fragBuilder->codeAppendf("\n\t\t%s = half4(%s.rgb * %s.aaa, %s.a);\n", args.fOutputColor, args.fOutputColor, args.fOutputColor, args.fOutputColor); } diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp index 9d95f997f0..46d3ef6520 100644 --- a/src/shaders/gradients/SkGradientShader.cpp +++ b/src/shaders/gradients/SkGradientShader.cpp @@ -1355,17 +1355,15 @@ void GrGradientEffect::GLSLProcessor::emitUniforms(GrGLSLUniformHandler* uniform const GrGradientEffect& ge) { if (int colorCount = color_type_to_color_count(ge.getColorType())) { fColorsUni = uniformHandler->addUniformArray(kFragment_GrShaderFlag, - kVec4f_GrSLType, - kDefault_GrSLPrecision, + kHalf4_GrSLType, "Colors", colorCount); if (kSingleHardStop_ColorType == ge.fColorType || kThree_ColorType == ge.fColorType) { - fExtraStopT = uniformHandler->addUniform(kFragment_GrShaderFlag, kVec4f_GrSLType, + fExtraStopT = uniformHandler->addUniform(kFragment_GrShaderFlag, kHighFloat4_GrSLType, kHigh_GrSLPrecision, "ExtraStopT"); } } else { - fFSYUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kFloat_GrSLType, kDefault_GrSLPrecision, + fFSYUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, "GradientYCoordFS"); } } @@ -1557,14 +1555,14 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde // First, apply tiling rules. switch (ge.fWrapMode) { case GrSamplerState::WrapMode::kClamp: - fragBuilder->codeAppendf("float clamp_t = clamp(%s, 0.0, 1.0);", t); + fragBuilder->codeAppendf("half clamp_t = clamp(%s, 0.0, 1.0);", t); break; case GrSamplerState::WrapMode::kRepeat: - fragBuilder->codeAppendf("float clamp_t = fract(%s);", t); + fragBuilder->codeAppendf("half clamp_t = fract(%s);", t); break; case GrSamplerState::WrapMode::kMirrorRepeat: - fragBuilder->codeAppendf("float t_1 = %s - 1.0;", t); - fragBuilder->codeAppendf("float clamp_t = abs(t_1 - 2.0 * floor(t_1 * 0.5) - 1.0);"); + fragBuilder->codeAppendf("half t_1 = %s - 1.0;", t); + fragBuilder->codeAppendf("half clamp_t = abs(t_1 - 2.0 * floor(t_1 * 0.5) - 1.0);"); break; } @@ -1575,8 +1573,8 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde // (t, 1/t, 1/(1-t), t/(1-t)) const char* stopT = uniformHandler->getUniformCStr(fExtraStopT); - fragBuilder->codeAppend ("float4 start, end;"); - fragBuilder->codeAppend ("float relative_t;"); + fragBuilder->codeAppend ("half4 start, end;"); + fragBuilder->codeAppend ("half relative_t;"); fragBuilder->codeAppendf("if (clamp_t < %s.x) {", stopT); fragBuilder->codeAppendf(" start = %s[0];", colors); fragBuilder->codeAppendf(" end = %s[1];", colors); @@ -1587,13 +1585,13 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde // Want: (t-s)/(1-s), but arrange it as: t/(1-s) - s/(1-s), for FMA form fragBuilder->codeAppendf(" relative_t = (clamp_t * %s.z) - %s.w;", stopT, stopT); fragBuilder->codeAppend ("}"); - fragBuilder->codeAppend ("float4 colorTemp = mix(start, end, relative_t);"); + fragBuilder->codeAppend ("half4 colorTemp = mix(start, end, relative_t);"); break; } case kHardStopLeftEdged_ColorType: { - fragBuilder->codeAppendf("float4 colorTemp = mix(%s[1], %s[2], clamp_t);", colors, + fragBuilder->codeAppendf("half4 colorTemp = mix(%s[1], %s[2], clamp_t);", colors, colors); if (GrSamplerState::WrapMode::kClamp == ge.fWrapMode) { fragBuilder->codeAppendf("if (%s < 0.0) {", t); @@ -1605,7 +1603,7 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde } case kHardStopRightEdged_ColorType: { - fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp_t);", colors, + fragBuilder->codeAppendf("half4 colorTemp = mix(%s[0], %s[1], clamp_t);", colors, colors); if (GrSamplerState::WrapMode::kClamp == ge.fWrapMode) { fragBuilder->codeAppendf("if (%s > 1.0) {", t); @@ -1617,7 +1615,7 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde } case kTwo_ColorType: { - fragBuilder->codeAppendf("float4 colorTemp = mix(%s[0], %s[1], clamp_t);", + fragBuilder->codeAppendf("half4 colorTemp = mix(%s[0], %s[1], clamp_t);", colors, colors); break; @@ -1627,8 +1625,8 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde // (t, 1/t, 1/(1-t), t/(1-t)) const char* stopT = uniformHandler->getUniformCStr(fExtraStopT); - fragBuilder->codeAppend("float4 start, end;"); - fragBuilder->codeAppend("float relative_t;"); + fragBuilder->codeAppend("half4 start, end;"); + fragBuilder->codeAppend("half relative_t;"); fragBuilder->codeAppendf("if (clamp_t < %s.x) {", stopT); fragBuilder->codeAppendf(" start = %s[0];", colors); fragBuilder->codeAppendf(" end = %s[1];", colors); @@ -1639,7 +1637,7 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde // Want: (t-s)/(1-s), but arrange it as: t/(1-s) - s/(1-s), for FMA form fragBuilder->codeAppendf(" relative_t = (clamp_t * %s.z) - %s.w;", stopT, stopT); fragBuilder->codeAppend("}"); - fragBuilder->codeAppend("float4 colorTemp = mix(start, end, relative_t);"); + fragBuilder->codeAppend("half4 colorTemp = mix(start, end, relative_t);"); break; } @@ -1683,10 +1681,10 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui const char* fsyuni = uniformHandler->getUniformCStr(fFSYUni); - fragBuilder->codeAppendf("float2 coord = float2(%s, %s);", gradientTValue, fsyuni); + fragBuilder->codeAppendf("half2 coord = half2(%s, %s);", gradientTValue, fsyuni); fragBuilder->codeAppendf("%s = ", outputColor); fragBuilder->appendTextureLookupAndModulate(inputColor, texSamplers[0], "coord", - kVec2f_GrSLType, &fColorSpaceHelper); + kHighFloat2_GrSLType, &fColorSpaceHelper); fragBuilder->codeAppend(";"); } diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp index 87b82fdfac..0e2b785a52 100644 --- a/src/shaders/gradients/SkSweepGradient.cpp +++ b/src/shaders/gradients/SkSweepGradient.cpp @@ -198,8 +198,8 @@ void GrSweepGradient::GLSLSweepProcessor::emitCode(EmitArgs& args) { const GrSweepGradient& ge = args.fFp.cast<GrSweepGradient>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fTBiasScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kVec2f_GrSLType, - kDefault_GrSLPrecision, "SweepFSParams"); + fTBiasScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, + "SweepFSParams"); const char* tBiasScaleV = uniformHandler->getUniformCStr(fTBiasScaleUni); const SkString coords2D = args.fFragBuilder->ensureCoords2D(args.fTransformedCoords[0]); diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp index b58ac2ac6f..37e0708838 100644 --- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp +++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp @@ -235,8 +235,7 @@ void Edge2PtConicalEffect::GLSLEdge2PtConicalProcessor::emitCode(EmitArgs& args) const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec3f_GrSLType, kDefault_GrSLPrecision, + fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, "Conical2FSParams"); SkString cName("c"); @@ -255,8 +254,8 @@ void Edge2PtConicalEffect::GLSLEdge2PtConicalProcessor::emitCode(EmitArgs& args) const char* coords2D; SkString bVar; GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - if (kVec3f_GrSLType == args.fTransformedCoords[0].getType()) { - fragBuilder->codeAppendf("\tfloat3 interpolants = float3(%s.xy / %s.z, %s.x / %s.z);\n", + if (kHalf3_GrSLType == args.fTransformedCoords[0].getType()) { + fragBuilder->codeAppendf("\thalf3 interpolants = half3(%s.xy / %s.z, %s.x / %s.z);\n", args.fTransformedCoords[0].c_str(), args.fTransformedCoords[0].c_str(), args.fTransformedCoords[1].c_str(), @@ -270,14 +269,14 @@ void Edge2PtConicalEffect::GLSLEdge2PtConicalProcessor::emitCode(EmitArgs& args) // output will default to transparent black (we simply won't write anything // else to it if invalid, instead of discarding or returning prematurely) - fragBuilder->codeAppendf("\t%s = float4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); + fragBuilder->codeAppendf("\t%s = half4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); // c = (x^2)+(y^2) - params[1] - fragBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", + fragBuilder->codeAppendf("\thalf %s = dot(%s, %s) - %s;\n", cName.c_str(), coords2D, coords2D, p1.c_str()); // linear case: t = -c/b - fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), + fragBuilder->codeAppendf("\thalf %s = -(%s / %s);\n", tName.c_str(), cName.c_str(), bVar.c_str()); // if r(t) > 0, then t will be the x coordinate @@ -525,8 +524,7 @@ void FocalOutside2PtConicalEffect::GLSLFocalOutside2PtConicalProcessor::emitCode const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConicalEffect>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "Conical2FSParams"); SkString tName("t"); SkString p0; // focalX @@ -544,19 +542,19 @@ void FocalOutside2PtConicalEffect::GLSLFocalOutside2PtConicalProcessor::emitCode // output will default to transparent black (we simply won't write anything // else to it if invalid, instead of discarding or returning prematurely) - fragBuilder->codeAppendf("\t%s = float4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); + fragBuilder->codeAppendf("\t%s = half4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); - fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); - fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D); - fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str()); + fragBuilder->codeAppendf("\thalf xs = %s.x * %s.x;\n", coords2D, coords2D); + fragBuilder->codeAppendf("\thalf ys = %s.y * %s.y;\n", coords2D, coords2D); + fragBuilder->codeAppendf("\thalf d = xs + %s * ys;\n", p1.c_str()); // Must check to see if we flipped the circle order (to make sure start radius < end radius) // If so we must also flip sign on sqrt if (!fIsFlipped) { - fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c_str(), + fragBuilder->codeAppendf("\thalf %s = %s.x * %s + sqrt(d);\n", tName.c_str(), coords2D, p0.c_str()); } else { - fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c_str(), + fragBuilder->codeAppendf("\thalf %s = %s.x * %s - sqrt(d);\n", tName.c_str(), coords2D, p0.c_str()); } @@ -734,8 +732,7 @@ void FocalInside2PtConicalEffect::GLSLFocalInside2PtConicalProcessor::emitCode(E const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalEffect>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fFocalUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kFloat_GrSLType, kDefault_GrSLPrecision, + fFocalUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, "Conical2FSParams"); SkString tName("t"); @@ -749,7 +746,7 @@ void FocalInside2PtConicalEffect::GLSLFocalInside2PtConicalProcessor::emitCode(E const char* coords2D = coords2DString.c_str(); // t = p.x * focalX + length(p) - fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_str(), + fragBuilder->codeAppendf("\thalf %s = %s.x * %s + length(%s);\n", tName.c_str(), coords2D, focal.c_str(), coords2D); this->emitColor(fragBuilder, @@ -993,11 +990,9 @@ void CircleInside2PtConicalEffect::GLSLCircleInside2PtConicalProcessor::emitCode const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConicalEffect>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fCenterUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fCenterUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "Conical2FSCenter"); - fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec3f_GrSLType, kDefault_GrSLPrecision, + fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, "Conical2FSParams"); SkString tName("t"); @@ -1020,10 +1015,10 @@ void CircleInside2PtConicalEffect::GLSLCircleInside2PtConicalProcessor::emitCode // C = 1 / A // d = dot(e, p) + B // t = d +/- sqrt(d^2 - A * dot(p, p) + C) - fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D); - fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(), + fragBuilder->codeAppendf("\thalf pDotp = dot(%s, %s);\n", coords2D, coords2D); + fragBuilder->codeAppendf("\thalf d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(), params.c_str()); - fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n", + fragBuilder->codeAppendf("\thalf %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n", tName.c_str(), params.c_str(), params.c_str()); this->emitColor(fragBuilder, @@ -1241,11 +1236,9 @@ void CircleOutside2PtConicalEffect::GLSLCircleOutside2PtConicalProcessor::emitCo const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConicalEffect>(); GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; this->emitUniforms(uniformHandler, ge); - fCenterUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec2f_GrSLType, kDefault_GrSLPrecision, + fCenterUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf2_GrSLType, "Conical2FSCenter"); - fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kVec4f_GrSLType, kDefault_GrSLPrecision, + fParamUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType, "Conical2FSParams"); SkString tName("t"); @@ -1262,7 +1255,7 @@ void CircleOutside2PtConicalEffect::GLSLCircleOutside2PtConicalProcessor::emitCo // output will default to transparent black (we simply won't write anything // else to it if invalid, instead of discarding or returning prematurely) - fragBuilder->codeAppendf("\t%s = float4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); + fragBuilder->codeAppendf("\t%s = half4(0.0,0.0,0.0,0.0);\n", args.fOutputColor); // p = coords2D // e = center end @@ -1273,18 +1266,18 @@ void CircleOutside2PtConicalEffect::GLSLCircleOutside2PtConicalProcessor::emitCo // d = dot(e, p) + B // t = d +/- sqrt(d^2 - A * dot(p, p) + C) - fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D); - fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(), + fragBuilder->codeAppendf("\thalf pDotp = dot(%s, %s);\n", coords2D, coords2D); + fragBuilder->codeAppendf("\thalf d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(), params.c_str()); - fragBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", params.c_str(), + fragBuilder->codeAppendf("\thalf deter = d * d - %s.x * pDotp + %s.z;\n", params.c_str(), params.c_str()); // Must check to see if we flipped the circle order (to make sure start radius < end radius) // If so we must also flip sign on sqrt if (!fIsFlipped) { - fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str()); + fragBuilder->codeAppendf("\thalf %s = d + sqrt(deter);\n", tName.c_str()); } else { - fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str()); + fragBuilder->codeAppendf("\thalf %s = d - sqrt(deter);\n", tName.c_str()); } fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", |