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/GrAARectEffect.cpp b/src/gpu/effects/generated/GrAARectEffect.cpp
index fb2f1e9..233c42a 100644
--- a/src/gpu/effects/generated/GrAARectEffect.cpp
+++ b/src/gpu/effects/generated/GrAARectEffect.cpp
@@ -28,42 +28,48 @@
auto rect = _outer.rect;
(void)rect;
prevRect = float4(-1.0);
- rectUniformVar = args.fUniformHandler->addUniform(
- &_outer, kFragment_GrShaderFlag, kFloat4_GrSLType, "rectUniform");
+ rectUniformVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
+ kFloat4_GrSLType, "rectUniform");
fragBuilder->codeAppendf(
- "float4 prevRect = float4(%f, %f, %f, %f);\nhalf alpha;\n@switch (%d) {\n case "
- "0:\n case 2:\n alpha = half(all(greaterThan(float4(sk_FragCoord.xy, "
- "%s.zw), float4(%s.xy, sk_FragCoord.xy))) ? 1 : 0);\n break;\n "
- "default:\n half xSub, ySub;\n xSub = min(half(sk_FragCoord.x - "
- "%s.x), 0.0);\n xSub += min(half(%s.z - sk_FragCoord.x), 0.0);\n "
- "ySub = min(half(sk_FragCoord.y - %s.y), 0.0);\n ySub += min(half(%s.w - "
- "sk_FragCoord.y), 0.0);\n alpha = (1.0 + ",
- prevRect.left(),
- prevRect.top(),
- prevRect.right(),
- prevRect.bottom(),
- (int)_outer.edgeType,
+ R"SkSL(float4 prevRect = float4(%f, %f, %f, %f);
+half alpha;
+@switch (%d) {
+ case 0:
+ case 2:
+ alpha = half(all(greaterThan(float4(sk_FragCoord.xy, %s.zw), float4(%s.xy, sk_FragCoord.xy))) ? 1 : 0);
+ break;
+ default:
+ half xSub, ySub;
+ xSub = min(half(sk_FragCoord.x - %s.x), 0.0);
+ xSub += min(half(%s.z - sk_FragCoord.x), 0.0);
+ ySub = min(half(sk_FragCoord.y - %s.y), 0.0);
+ ySub += min(half(%s.w - sk_FragCoord.y), 0.0);
+ alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));
+}
+@if (%d == 2 || %d == 3) {
+ alpha = 1.0 - alpha;
+})SkSL",
+ prevRect.left(), prevRect.top(), prevRect.right(), prevRect.bottom(),
+ (int)_outer.edgeType, args.fUniformHandler->getUniformCStr(rectUniformVar),
args.fUniformHandler->getUniformCStr(rectUniformVar),
args.fUniformHandler->getUniformCStr(rectUniformVar),
args.fUniformHandler->getUniformCStr(rectUniformVar),
args.fUniformHandler->getUniformCStr(rectUniformVar),
- args.fUniformHandler->getUniformCStr(rectUniformVar),
- args.fUniformHandler->getUniformCStr(rectUniformVar));
- fragBuilder->codeAppendf(
- "max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n}\n@if (%d == 2 || %d == 3) {\n "
- "alpha = 1.0 - alpha;\n}",
- (int)_outer.edgeType,
+ args.fUniformHandler->getUniformCStr(rectUniformVar), (int)_outer.edgeType,
(int)_outer.edgeType);
- SkString _input1677 = SkStringPrintf("%s", args.fInputColor);
+ SkString _input1677(args.fInputColor);
SkString _sample1677;
if (_outer.inputFP_index >= 0) {
_sample1677 = this->invokeChild(_outer.inputFP_index, _input1677.c_str(), args);
} else {
- _sample1677 = _input1677;
+ _sample1677.swap(_input1677);
}
- fragBuilder->codeAppendf("\nhalf4 inputColor = %s;\n%s = inputColor * alpha;\n",
- _sample1677.c_str(),
- args.fOutputColor);
+ fragBuilder->codeAppendf(
+ R"SkSL(
+half4 inputColor = %s;
+%s = inputColor * alpha;
+)SkSL",
+ _sample1677.c_str(), args.fOutputColor);
}
private: