diff options
Diffstat (limited to 'src/effects/SkLightingImageFilter.cpp')
-rw-r--r-- | src/effects/SkLightingImageFilter.cpp | 130 |
1 files changed, 73 insertions, 57 deletions
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 1c47f922cc..1b8849a982 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -724,7 +724,7 @@ public: /** * This is called by GrGLLightingEffect::emitCode() before either of the two virtual functions - * below. It adds a half3 uniform visible in the FS that represents the constant light color. + * below. It adds a vec3f uniform visible in the FS that represents the constant light color. */ void emitLightColorUniform(GrGLSLUniformHandler*); @@ -1827,61 +1827,63 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) { GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; fImageIncrementUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kHalf2_GrSLType, "ImageIncrement"); + kVec2f_GrSLType, kDefault_GrSLPrecision, + "ImageIncrement"); fSurfaceScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kHalf_GrSLType, "SurfaceScale"); + kFloat_GrSLType, kDefault_GrSLPrecision, + "SurfaceScale"); fLight->emitLightColorUniform(uniformHandler); GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; SkString lightFunc; this->emitLightFunc(uniformHandler, fragBuilder, &lightFunc); static const GrShaderVar gSobelArgs[] = { - GrShaderVar("a", kHalf_GrSLType), - GrShaderVar("b", kHalf_GrSLType), - GrShaderVar("c", kHalf_GrSLType), - GrShaderVar("d", kHalf_GrSLType), - GrShaderVar("e", kHalf_GrSLType), - GrShaderVar("f", kHalf_GrSLType), - GrShaderVar("scale", kHalf_GrSLType), + GrShaderVar("a", kFloat_GrSLType), + GrShaderVar("b", kFloat_GrSLType), + GrShaderVar("c", kFloat_GrSLType), + GrShaderVar("d", kFloat_GrSLType), + GrShaderVar("e", kFloat_GrSLType), + GrShaderVar("f", kFloat_GrSLType), + GrShaderVar("scale", kFloat_GrSLType), }; SkString sobelFuncName; SkString coords2D = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - fragBuilder->emitFunction(kHalf_GrSLType, + fragBuilder->emitFunction(kFloat_GrSLType, "sobel", SK_ARRAY_COUNT(gSobelArgs), gSobelArgs, "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scale;\n", &sobelFuncName); static const GrShaderVar gPointToNormalArgs[] = { - GrShaderVar("x", kHalf_GrSLType), - GrShaderVar("y", kHalf_GrSLType), - GrShaderVar("scale", kHalf_GrSLType), + GrShaderVar("x", kFloat_GrSLType), + GrShaderVar("y", kFloat_GrSLType), + GrShaderVar("scale", kFloat_GrSLType), }; SkString pointToNormalName; - fragBuilder->emitFunction(kHalf3_GrSLType, + fragBuilder->emitFunction(kVec3f_GrSLType, "pointToNormal", SK_ARRAY_COUNT(gPointToNormalArgs), gPointToNormalArgs, - "\treturn normalize(half3(-x * scale, -y * scale, 1));\n", + "\treturn normalize(float3(-x * scale, -y * scale, 1));\n", &pointToNormalName); static const GrShaderVar gInteriorNormalArgs[] = { - GrShaderVar("m", kHalf_GrSLType, 9), - GrShaderVar("surfaceScale", kHalf_GrSLType), + GrShaderVar("m", kFloat_GrSLType, 9), + GrShaderVar("surfaceScale", kFloat_GrSLType), }; SkString normalBody = emitNormalFunc(le.boundaryMode(), pointToNormalName.c_str(), sobelFuncName.c_str()); SkString normalName; - fragBuilder->emitFunction(kHalf3_GrSLType, + fragBuilder->emitFunction(kVec3f_GrSLType, "normal", SK_ARRAY_COUNT(gInteriorNormalArgs), gInteriorNormalArgs, normalBody.c_str(), &normalName); - fragBuilder->codeAppendf("\t\thighfloat2 coord = %s;\n", coords2D.c_str()); - fragBuilder->codeAppend("\t\thalf m[9];\n"); + fragBuilder->codeAppendf("\t\tfloat2 coord = %s;\n", coords2D.c_str()); + fragBuilder->codeAppend("\t\tfloat m[9];\n"); const char* imgInc = uniformHandler->getUniformCStr(fImageIncrementUni); const char* surfScale = uniformHandler->getUniformCStr(fSurfaceScaleUni); @@ -1890,10 +1892,10 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) { for (int dy = 1; dy >= -1; dy--) { for (int dx = -1; dx <= 1; dx++) { SkString texCoords; - texCoords.appendf("coord + half2(%d, %d) * %s", dx, dy, imgInc); + texCoords.appendf("coord + float2(%d, %d) * %s", dx, dy, imgInc); SkString temp; temp.appendf("temp%d", index); - fragBuilder->codeAppendf("half4 %s;", temp.c_str()); + fragBuilder->codeAppendf("float4 %s;", temp.c_str()); fDomain.sampleTexture(fragBuilder, args.fUniformHandler, args.fShaderCaps, @@ -1905,7 +1907,7 @@ void GrGLLightingEffect::emitCode(EmitArgs& args) { index++; } } - fragBuilder->codeAppend("\t\thalf3 surfaceToLight = "); + fragBuilder->codeAppend("\t\tfloat3 surfaceToLight = "); SkString arg; arg.appendf("%s * m[4]", surfScale); fLight->emitSurfaceToLight(uniformHandler, fragBuilder, arg.c_str()); @@ -1951,17 +1953,19 @@ void GrGLDiffuseLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHandl GrGLSLFPFragmentBuilder* fragBuilder, SkString* funcName) { const char* kd; - fKDUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, "KD", &kd); + fKDUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, + "KD", &kd); static const GrShaderVar gLightArgs[] = { - GrShaderVar("normal", kHalf3_GrSLType), - GrShaderVar("surfaceToLight", kHalf3_GrSLType), - GrShaderVar("lightColor", kHalf3_GrSLType) + GrShaderVar("normal", kVec3f_GrSLType), + GrShaderVar("surfaceToLight", kVec3f_GrSLType), + GrShaderVar("lightColor", kVec3f_GrSLType) }; SkString lightBody; - lightBody.appendf("\thalf colorScale = %s * dot(normal, surfaceToLight);\n", kd); - lightBody.appendf("\treturn half4(lightColor * clamp(colorScale, 0.0, 1.0), 1.0);\n"); - fragBuilder->emitFunction(kHalf4_GrSLType, + lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n", kd); + lightBody.appendf("\treturn float4(lightColor * clamp(colorScale, 0.0, 1.0), 1.0);\n"); + fragBuilder->emitFunction(kVec4f_GrSLType, "light", SK_ARRAY_COUNT(gLightArgs), gLightArgs, @@ -2047,24 +2051,26 @@ void GrGLSpecularLightingEffect::emitLightFunc(GrGLSLUniformHandler* uniformHand const char* ks; const char* shininess; - fKSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, "KS", &ks); + fKSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, "KS", &ks); fShininessUni = uniformHandler->addUniform(kFragment_GrShaderFlag, - kHalf_GrSLType, + kFloat_GrSLType, + kDefault_GrSLPrecision, "Shininess", &shininess); static const GrShaderVar gLightArgs[] = { - GrShaderVar("normal", kHalf3_GrSLType), - GrShaderVar("surfaceToLight", kHalf3_GrSLType), - GrShaderVar("lightColor", kHalf3_GrSLType) + GrShaderVar("normal", kVec3f_GrSLType), + GrShaderVar("surfaceToLight", kVec3f_GrSLType), + GrShaderVar("lightColor", kVec3f_GrSLType) }; SkString lightBody; - lightBody.appendf("\thalf3 halfDir = half3(normalize(surfaceToLight + half3(0, 0, 1)));\n"); - lightBody.appendf("\thighfloat colorScale = %s * pow(dot(normal, halfDir), %s);\n", + lightBody.appendf("\tfloat3 halfDir = float3(normalize(surfaceToLight + float3(0, 0, 1)));\n"); + lightBody.appendf("\thighp float colorScale = %s * pow(dot(normal, halfDir), %s);\n", ks, shininess); - lightBody.appendf("\thalf3 color = lightColor * clamp(colorScale, 0.0, 1.0);\n"); - lightBody.appendf("\treturn half4(color, max(max(color.r, color.g), color.b));\n"); - fragBuilder->emitFunction(kHalf4_GrSLType, + lightBody.appendf("\tfloat3 color = lightColor * clamp(colorScale, 0.0, 1.0);\n"); + lightBody.appendf("\treturn float4(color, max(max(color.r, color.g), color.b));\n"); + fragBuilder->emitFunction(kVec4f_GrSLType, "light", SK_ARRAY_COUNT(gLightArgs), gLightArgs, @@ -2082,7 +2088,9 @@ void GrGLSpecularLightingEffect::onSetData(const GrGLSLProgramDataManager& pdman /////////////////////////////////////////////////////////////////////////////// void GrGLLight::emitLightColorUniform(GrGLSLUniformHandler* uniformHandler) { - fColorUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, "LightColor"); + fColorUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec3f_GrSLType, kDefault_GrSLPrecision, + "LightColor"); } void GrGLLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, @@ -2111,7 +2119,8 @@ void GrGLDistantLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, GrGLSLFPFragmentBuilder* fragBuilder, const char* z) { const char* dir; - fDirectionUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, + fDirectionUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec3f_GrSLType, kDefault_GrSLPrecision, "LightDirection", &dir); fragBuilder->codeAppend(dir); } @@ -2130,9 +2139,10 @@ void GrGLPointLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, GrGLSLFPFragmentBuilder* fragBuilder, const char* z) { const char* loc; - fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, + fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec3f_GrSLType, kDefault_GrSLPrecision, "LightLocation", &loc); - fragBuilder->codeAppendf("normalize(%s - half3(sk_FragCoord.xy, %s))", + fragBuilder->codeAppendf("normalize(%s - float3(sk_FragCoord.xy, %s))", loc, z); } @@ -2155,10 +2165,11 @@ void GrGLSpotLight::emitSurfaceToLight(GrGLSLUniformHandler* uniformHandler, GrGLSLFPFragmentBuilder* fragBuilder, const char* z) { const char* location; - fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, + fLocationUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec3f_GrSLType, kDefault_GrSLPrecision, "LightLocation", &location); - fragBuilder->codeAppendf("normalize(%s - half3(sk_FragCoord.xy, %s))", + fragBuilder->codeAppendf("normalize(%s - float3(sk_FragCoord.xy, %s))", location, z); } @@ -2173,31 +2184,36 @@ void GrGLSpotLight::emitLightColor(GrGLSLUniformHandler* uniformHandler, const char* cosOuter; const char* coneScale; const char* s; - fExponentUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, + fExponentUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, "Exponent", &exponent); - fCosInnerConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, + fCosInnerConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, "CosInnerConeAngle", &cosInner); - fCosOuterConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, + fCosOuterConeAngleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, "CosOuterConeAngle", &cosOuter); - fConeScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf_GrSLType, + fConeScaleUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kFloat_GrSLType, kDefault_GrSLPrecision, "ConeScale", &coneScale); - fSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kHalf3_GrSLType, "S", &s); + fSUni = uniformHandler->addUniform(kFragment_GrShaderFlag, + kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s); static const GrShaderVar gLightColorArgs[] = { - GrShaderVar("surfaceToLight", kHalf3_GrSLType) + GrShaderVar("surfaceToLight", kVec3f_GrSLType) }; SkString lightColorBody; - lightColorBody.appendf("\thalf cosAngle = -dot(surfaceToLight, %s);\n", s); + lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); - lightColorBody.appendf("\t\treturn half3(0);\n"); + lightColorBody.appendf("\t\treturn float3(0);\n"); lightColorBody.appendf("\t}\n"); - lightColorBody.appendf("\thalf scale = pow(cosAngle, %s);\n", exponent); + lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", color, cosOuter, coneScale); lightColorBody.appendf("\t}\n"); lightColorBody.appendf("\treturn %s;\n", color); - fragBuilder->emitFunction(kHalf3_GrSLType, + fragBuilder->emitFunction(kVec3f_GrSLType, "lightColor", SK_ARRAY_COUNT(gLightColorArgs), gLightColorArgs, |