From c718b35bce895aa945fc479451156985206fdae1 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Mon, 29 Apr 2013 17:36:14 +0000 Subject: [PATCH] Remove inout params from saturation helper func in XferEffect. R=robertphillips@google.com, jvanverth@google.com Author: bsalomon@google.com Review URL: https://chromiumcodereview.appspot.com/14535004 git-svn-id: http://skia.googlecode.com/svn/trunk@8909 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkXfermode.cpp | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp index 082f407..916e1b8 100644 --- a/src/core/SkXfermode.cpp +++ b/src/core/SkXfermode.cpp @@ -1287,7 +1287,10 @@ public: 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 @@ public: 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 @@ public: 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, -- 2.7.4