| 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,
|
|
|