0393505a2d
Program caching makes whether or not this is safe a little subtle. It is safe and I've tried to explain the subtlety in comments in the new non-virtual Shader program() hook that forces all opaque shaders to opaque, and in comments in SkVMBlitter where we make use of isOpaque(). I think this is the tidiest way to get the optimization and safety, though it is a little awkward to have to write epic cross-referenced comments explaining first why it might not generally be safe to use shader->isOpaque() to make decisions in the blitter, and then how we actually have made it really quite safe. Many tiny partial-coverage diffs from how coverage interacts differently with SrcOver and Src, SrcOver folding coverage into the src color before blending with dst, Src just lerping with dst. This all comes together really quite magically, changing a program to draw a solid opaque color from this, 11 registers, 41 instructions: r0 = uniform32 arg(0) 0 r1 = splat FF (3.5733111e-43) r2 = extract r0 8 r1 r3 = splat 80 (1.793662e-43) r4 = extract r0 24 r1 r5 = sub_i32 r1 r4 r6 = extract r0 16 r1 r0 = extract r0 0 r1 loop: r7 = load32 arg(1) r8 = extract r7 8 r1 r8 = mul_i32 r8 r5 r8 = add_i32 r8 r3 r9 = shr_i32 r8 8 r9 = add_i32 r8 r9 r9 = shr_i32 r9 8 r9 = add_i32 r2 r9 r8 = extract r7 0 r1 r8 = mul_i32 r8 r5 r8 = add_i32 r8 r3 r10 = shr_i32 r8 8 r10 = add_i32 r8 r10 r10 = shr_i32 r10 8 r10 = add_i32 r6 r10 r9 = pack r10 r9 8 r10 = extract r7 16 r1 r10 = mul_i32 r10 r5 r10 = add_i32 r10 r3 r8 = shr_i32 r10 8 r8 = add_i32 r10 r8 r8 = shr_i32 r8 8 r8 = add_i32 r0 r8 r7 = extract r7 24 r1 r7 = mul_i32 r7 r5 r7 = add_i32 r7 r3 r10 = shr_i32 r7 8 r10 = add_i32 r7 r10 r10 = shr_i32 r10 8 r10 = add_i32 r4 r10 r10 = pack r8 r10 8 r10 = pack r9 r10 16 store32 arg(1) r10 to this, 4 registers, 9 instructions: r0 = uniform32 arg(0) 0 r1 = splat FF (3.5733111e-43) r2 = extract r0 8 r1 r3 = extract r0 16 r1 r2 = pack r3 r2 8 r0 = extract r0 0 r1 r1 = pack r0 r1 8 r1 = pack r2 r1 16 loop: store32 arg(1) r1 Change-Id: Ic1e2ac1496252970743ef44b17908965bc73e384 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/252198 Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Mike Reed <reed@google.com> |
||
---|---|---|
animations | ||
bench | ||
bin | ||
build_overrides | ||
dm | ||
docker | ||
docs/examples | ||
example | ||
experimental | ||
fuzz | ||
gm | ||
gn | ||
include | ||
infra | ||
modules | ||
platform_tools | ||
resources | ||
samplecode | ||
site | ||
specs | ||
src | ||
tests | ||
third_party | ||
tools | ||
.clang-format | ||
.clang-tidy | ||
.gitignore | ||
.gn | ||
AUTHORS | ||
BUILD.gn | ||
codereview.settings | ||
CONTRIBUTING | ||
CQ_COMMITTERS | ||
DEPS | ||
go.mod | ||
go.sum | ||
LICENSE | ||
OWNERS | ||
PRESUBMIT.py | ||
public.bzl | ||
README | ||
README.chromium | ||
RELEASE_NOTES.txt | ||
whitespace.txt |
Skia is a complete 2D graphic library for drawing Text, Geometries, and Images. See full details, and build instructions, at https://skia.org.