aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkLightingImageFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/SkLightingImageFilter.cpp')
-rw-r--r--src/effects/SkLightingImageFilter.cpp130
1 files changed, 73 insertions, 57 deletions
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 10056e205d..d9fae43fa8 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,