Index: src/core/SkXfermode.cpp |
=================================================================== |
--- src/core/SkXfermode.cpp (revision 8905) |
+++ src/core/SkXfermode.cpp (working copy) |
@@ -1287,7 +1287,10 @@ |
getSatBody.c_str(), |
&getFunction); |
- // Emit a helper that sets the saturation given sorted input channels |
+ // Emit a helper that sets the saturation given sorted input channels. This used |
+ // to use inout params for min, mid, and max components but that seems to cause |
+ // problems on PowerVR drivers. So instead it returns a vec3 where r, g ,b are the |
+ // adjusted min, mid, and max inputs, respectively. |
SkString helperFunction; |
GrGLShaderVar helperArgs[] = { |
GrGLShaderVar("minComp", kFloat_GrSLType), |
@@ -1295,22 +1298,20 @@ |
GrGLShaderVar("maxComp", kFloat_GrSLType), |
GrGLShaderVar("sat", kFloat_GrSLType), |
}; |
- helperArgs[0].setTypeModifier(GrGLShaderVar::kInOut_TypeModifier); |
- helperArgs[1].setTypeModifier(GrGLShaderVar::kInOut_TypeModifier); |
- helperArgs[2].setTypeModifier(GrGLShaderVar::kInOut_TypeModifier); |
- SkString helperBody; |
- helperBody.append("\tif (minComp < maxComp) {\n" |
- "\t\tmidComp = sat * (midComp - minComp) / (maxComp - minComp);\n" |
- "\t\tmaxComp = sat;\n" |
- "\t} else {\n" |
- "\t\tmidComp = maxComp = 0.0;\n" |
- "\t}\n" |
- "\tminComp = 0.0;\n"); |
+ static const char kHelperBody[] = "\tif (minComp < maxComp) {\n" |
+ "\t\tvec3 result;\n" |
+ "\t\tresult.r = 0.0;\n" |
+ "\t\tresult.g = sat * (midComp - minComp) / (maxComp - minComp);\n" |
+ "\t\tresult.b = sat;\n" |
+ "\t\treturn result;\n" |
+ "\t} else {\n" |
+ "\t\treturn vec3(0, 0, 0);\n" |
+ "\t}\n"; |
builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |
- kVoid_GrSLType, |
+ kVec3f_GrSLType, |
"set_saturation_helper", |
SK_ARRAY_COUNT(helperArgs), helperArgs, |
- helperBody.c_str(), |
+ kHelperBody, |
&helperFunction); |
GrGLShaderVar setSatArgs[] = { |
@@ -1322,20 +1323,20 @@ |
setSatBody.appendf("\tfloat sat = %s(satColor);\n" |
"\tif (hueLumColor.r <= hueLumColor.g) {\n" |
"\t\tif (hueLumColor.g <= hueLumColor.b) {\n" |
- "\t\t\t%s(hueLumColor.r, hueLumColor.g, hueLumColor.b, sat);\n" |
+ "\t\t\thueLumColor.rgb = %s(hueLumColor.r, hueLumColor.g, hueLumColor.b, sat);\n" |
"\t\t} else if (hueLumColor.r <= hueLumColor.b) {\n" |
- "\t\t\t%s(hueLumColor.r, hueLumColor.b, hueLumColor.g, sat);\n" |
+ "\t\t\thueLumColor.rbg = %s(hueLumColor.r, hueLumColor.b, hueLumColor.g, sat);\n" |
"\t\t} else {\n" |
- "\t\t\t%s(hueLumColor.b, hueLumColor.r, hueLumColor.g, sat);\n" |
+ "\t\t\thueLumColor.brg = %s(hueLumColor.b, hueLumColor.r, hueLumColor.g, sat);\n" |
"\t\t}\n" |
"\t} else if (hueLumColor.r <= hueLumColor.b) {\n" |
- "\t\t%s(hueLumColor.g, hueLumColor.r, hueLumColor.b, sat);\n" |
+ "\t\thueLumColor.grb = %s(hueLumColor.g, hueLumColor.r, hueLumColor.b, sat);\n" |
"\t} else if (hueLumColor.g <= hueLumColor.b) {\n" |
- "\t\t%s(hueLumColor.g, hueLumColor.b, hueLumColor.r, sat);\n" |
+ "\t\thueLumColor.gbr = %s(hueLumColor.g, hueLumColor.b, hueLumColor.r, sat);\n" |
"\t} else {\n" |
- "\t\t%s(hueLumColor.b, hueLumColor.g, hueLumColor.r, sat);\n" |
+ "\t\thueLumColor.bgr = %s(hueLumColor.b, hueLumColor.g, hueLumColor.r, sat);\n" |
"\t}\n" |
- "\treturn hueLumColor;", |
+ "\treturn hueLumColor;\n", |
getFunction.c_str(), helpFunc, helpFunc, helpFunc, helpFunc, |
helpFunc, helpFunc); |
builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, |