Convert PatchWriter to trait-oriented template

This allows the different variations to have compile-time optimizations
for certain features related to stroking, curve-filling, or wedges.
Additionally, it extends the attrib writing system to let graphite take
advantage of compile-time-only attribute configs and avoid using
VertexWriter::If per patch.

Benchmark                              Orig   ->   ToT    ->   CL
StrokeFixedCountTessellator_motionmark 845us  ->  904us   ->  871us
StrokeFixedCountTessellator_one_chop   3.03ms ->  3.29ms  ->  2.89ms
StrokeFixedCountTessellator            2.15ms ->  2.21ms  ->  1.93ms
StrokeHardwareTessellator_motionmark   560us  ->  601us   ->  551us
StrokeHardwareTessellator_one_chop     2.45ms ->  4.23ms  ->  3.89ms
StrokeHardwareTessellator              395us  ->  478us   ->  399us
PathWedgeTessellator                   313us  ->  407us   ->  367us
PathCurveTessellator                   278us  ->  335us   ->  331us

With these results from my workstation, we nearly recovered the
regression on the SFCT_motionmark benchmark and exceeded original perf
on the SFCT_on_chop and SFCT benchmarks. SHT_motionmark and SHT have
returned to original, and SHT_one_chop has improved. I'm less concerned
about bringing that back down since SHT is on the chopping block. We see
some improvements on the PWT and PCT benches.

Change-Id: Id76d34089dbaa50fe7d5f82fe54ee3cf605d0c24
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/512577
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
8 files changed