Optimize CPP code generation.
Previously, we were limiting our calls to appendVAList to 512-byte
chunks to avoid a potential buffer overflow. This had two problems:
1 - it did not avoid the buffer overflow :(
see chromium:1092743
2 - every call to appendVAList is expensive; it incurs a resize of the
code buffer (alloc new, memcpy, free old)
This CL removes the 512-byte cap as the buffer overflow issue was
resolved at http://review.skia.org/297276
This CL also includes a few more minor improvements.
- `codeAppendf` now uses a raw string so the gencode is easier to read.
- Optimized `SkStringPrintf("%s", foo)` to `SkString(foo)`.
- Optimized `strA = strB` to `strA.swap(strB)` where safe to do so.
Change-Id: Ia0909a68719848dd2ca655066a9bc6929c8fd09f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/297358
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
diff --git a/src/gpu/effects/generated/GrRectBlurEffect.cpp b/src/gpu/effects/generated/GrRectBlurEffect.cpp
index 3dd6ad3..689c69b 100644
--- a/src/gpu/effects/generated/GrRectBlurEffect.cpp
+++ b/src/gpu/effects/generated/GrRectBlurEffect.cpp
@@ -39,11 +39,15 @@
kHalf4_GrSLType, "rectH");
}
fragBuilder->codeAppendf(
- "/* key */ bool highp = %s;\nhalf xCoverage, yCoverage;\n@if (%s) {\n half2 "
- "xy;\n @if (highp) {\n xy = max(half2(%s.xy - sk_FragCoord.xy), "
- "half2(sk_FragCoord.xy - %s.zw));\n } else {\n xy = "
- "max(half2(float2(%s.xy) - sk_FragCoord.xy), half2(sk_FragCoord.xy - "
- "float2(%s.zw)));\n }",
+ R"SkSL(/* key */ bool highp = %s;
+half xCoverage, yCoverage;
+@if (%s) {
+ half2 xy;
+ @if (highp) {
+ xy = max(half2(%s.xy - sk_FragCoord.xy), half2(sk_FragCoord.xy - %s.zw));
+ } else {
+ xy = max(half2(float2(%s.xy) - sk_FragCoord.xy), half2(sk_FragCoord.xy - float2(%s.zw)));
+ })SkSL",
(highp ? "true" : "false"), (_outer.isFast ? "true" : "false"),
rectFVar.isValid() ? args.fUniformHandler->getUniformCStr(rectFVar) : "float4(0)",
rectFVar.isValid() ? args.fUniformHandler->getUniformCStr(rectFVar) : "float4(0)",
@@ -52,16 +56,25 @@
SkString _sample7215;
SkString _coords7215("float2(half2(xy.x, 0.5))");
_sample7215 = this->invokeChild(_outer.integral_index, args, _coords7215.c_str());
- fragBuilder->codeAppendf("\n xCoverage = %s.w;", _sample7215.c_str());
+ fragBuilder->codeAppendf(
+ R"SkSL(
+ xCoverage = %s.w;)SkSL",
+ _sample7215.c_str());
SkString _sample7273;
SkString _coords7273("float2(half2(xy.y, 0.5))");
_sample7273 = this->invokeChild(_outer.integral_index, args, _coords7273.c_str());
fragBuilder->codeAppendf(
- "\n yCoverage = %s.w;\n} else {\n half4 rect;\n @if (highp) {\n "
- "rect.xy = half2(%s.xy - sk_FragCoord.xy);\n rect.zw = "
- "half2(sk_FragCoord.xy - %s.zw);\n } else {\n rect.xy = "
- "half2(float2(%s.xy) - sk_FragCoord.xy);\n rect.zw = half2(sk_FragCoord.xy "
- "- float2(%s.zw));\n }",
+ R"SkSL(
+ yCoverage = %s.w;
+} else {
+ half4 rect;
+ @if (highp) {
+ rect.xy = half2(%s.xy - sk_FragCoord.xy);
+ rect.zw = half2(sk_FragCoord.xy - %s.zw);
+ } else {
+ rect.xy = half2(float2(%s.xy) - sk_FragCoord.xy);
+ rect.zw = half2(sk_FragCoord.xy - float2(%s.zw));
+ })SkSL",
_sample7273.c_str(),
rectFVar.isValid() ? args.fUniformHandler->getUniformCStr(rectFVar) : "float4(0)",
rectFVar.isValid() ? args.fUniformHandler->getUniformCStr(rectFVar) : "float4(0)",
@@ -73,25 +86,33 @@
SkString _sample8703;
SkString _coords8703("float2(half2(rect.z, 0.5))");
_sample8703 = this->invokeChild(_outer.integral_index, args, _coords8703.c_str());
- fragBuilder->codeAppendf("\n xCoverage = (1.0 - %s.w) - %s.w;", _sample8640.c_str(),
- _sample8703.c_str());
+ fragBuilder->codeAppendf(
+ R"SkSL(
+ xCoverage = (1.0 - %s.w) - %s.w;)SkSL",
+ _sample8640.c_str(), _sample8703.c_str());
SkString _sample8767;
SkString _coords8767("float2(half2(rect.y, 0.5))");
_sample8767 = this->invokeChild(_outer.integral_index, args, _coords8767.c_str());
SkString _sample8830;
SkString _coords8830("float2(half2(rect.w, 0.5))");
_sample8830 = this->invokeChild(_outer.integral_index, args, _coords8830.c_str());
- fragBuilder->codeAppendf("\n yCoverage = (1.0 - %s.w) - %s.w;\n}", _sample8767.c_str(),
- _sample8830.c_str());
- SkString _input8899 = SkStringPrintf("%s", args.fInputColor);
+ fragBuilder->codeAppendf(
+ R"SkSL(
+ yCoverage = (1.0 - %s.w) - %s.w;
+})SkSL",
+ _sample8767.c_str(), _sample8830.c_str());
+ SkString _input8899(args.fInputColor);
SkString _sample8899;
if (_outer.inputFP_index >= 0) {
_sample8899 = this->invokeChild(_outer.inputFP_index, _input8899.c_str(), args);
} else {
- _sample8899 = _input8899;
+ _sample8899.swap(_input8899);
}
fragBuilder->codeAppendf(
- "\nhalf4 inputColor = %s;\n%s = (inputColor * xCoverage) * yCoverage;\n",
+ R"SkSL(
+half4 inputColor = %s;
+%s = (inputColor * xCoverage) * yCoverage;
+)SkSL",
_sample8899.c_str(), args.fOutputColor);
}