Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(800)

Unified Diff: src/effects/SkArithmeticMode.cpp

Issue 26190003: Potentially optimize some GrGLEffects for known input color values (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkXfermode.cpp ('k') | src/effects/SkBitmapAlphaThresholdShader.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkArithmeticMode.cpp
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
index fff03c291fb27550a44ead6dae5164deabbd3bcc..e47a7ac278467d3b91a862302987aaa7b872d569 100644
--- a/src/effects/SkArithmeticMode.cpp
+++ b/src/effects/SkArithmeticMode.cpp
@@ -245,7 +245,7 @@ public:
const GrDrawEffect&,
EffectKey,
const char* outputColor,
- const char* inputColor,
+ const GrGLSLExpr4& inputColor,
const TransformedCoordsArray&,
const TextureSamplerArray&) SK_OVERRIDE;
@@ -344,7 +344,7 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
const GrDrawEffect& drawEffect,
EffectKey key,
const char* outputColor,
- const char* inputColor,
+ const GrGLSLExpr4& inputColor,
const TransformedCoordsArray& coords,
const TextureSamplerArray& samplers) {
@@ -362,24 +362,32 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
SkASSERT(NULL != dstColor);
fKUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
kVec4f_GrSLType, "k");
- const char* kUni = builder->getUniformCStr(fKUni);
- // We don't try to optimize for this case at all
- if (NULL == inputColor) {
- builder->fsCodeAppendf("\t\tconst vec4 src = vec4(1);\n");
+ GrGLSLExpr4 src;
+ if (gUseUnpremul) {
+ builder->fsCodeAppendf("\t\tvec4 src = %s;\n", inputColor.c_str());
+ builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
+ src = GrGLSLExpr4("src");
} else {
- builder->fsCodeAppendf("\t\tvec4 src = %s;\n", inputColor);
- if (gUseUnpremul) {
- builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
- }
+ src = inputColor;
}
- builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
+ GrGLSLExpr4 dst;
if (gUseUnpremul) {
+ builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\n");
+ dst = GrGLSLExpr4("dst");
+ } else {
+ dst = GrGLSLExpr4(dstColor);
}
- builder->fsCodeAppendf("\t\t%s = %s.x * src * dst + %s.y * src + %s.z * dst + %s.w;\n", outputColor, kUni, kUni, kUni, kUni);
+ GrGLSLExpr4 kExpr(builder->getUniformCStr(fKUni));
+ builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
+ (kExpr.x() * inputColor * dst +
+ kExpr.y() * src +
+ kExpr.z() * dst +
+ kExpr.w()).c_str());
+
builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
if (gUseUnpremul) {
builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
« no previous file with comments | « src/core/SkXfermode.cpp ('k') | src/effects/SkBitmapAlphaThresholdShader.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698