2b8b06e793
I don't particularly care about Python 2 vs 3, and don't think we're likely to leave 2 soon. Bug: skia:9079 Change-Id: Ia28c1312309d4d9218d05915dcd21a45fe6f3727 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213506 Auto-Submit: Mike Klein <mtklein@google.com> Reviewed-by: Heather Miller <hcm@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
193 lines
7.7 KiB
Markdown
193 lines
7.7 KiB
Markdown
Correctness Testing
|
|
===================
|
|
|
|
Skia correctness testing is primarily served by a tool named DM.
|
|
This is a quickstart to building and running DM.
|
|
|
|
<!--?prettify lang=sh?-->
|
|
|
|
python2 tools/git-sync-deps
|
|
bin/gn gen out/Debug
|
|
ninja -C out/Debug dm
|
|
out/Debug/dm -v -w dm_output
|
|
|
|
When you run this, you may notice your CPU peg to 100% for a while, then taper
|
|
off to 1 or 2 active cores as the run finishes. This is intentional. DM is
|
|
very multithreaded, but some of the work, particularly GPU-backed work, is
|
|
still forced to run on a single thread. You can use `--threads N` to limit DM to
|
|
N threads if you like. This can sometimes be helpful on machines that have
|
|
relatively more CPU available than RAM.
|
|
|
|
As DM runs, you ought to see a giant spew of output that looks something like this.
|
|
~~~
|
|
Skipping nonrendering: Don't understand 'nonrendering'.
|
|
Skipping angle: Don't understand 'angle'.
|
|
Skipping nvprmsaa4: Could not create a surface.
|
|
492 srcs * 3 sinks + 382 tests == 1858 tasks
|
|
|
|
( 25MB 1857) 1.36ms 8888 image mandrill_132x132_12x12.astc-5-subsets
|
|
( 25MB 1856) 1.41ms 8888 image mandrill_132x132_6x6.astc-5-subsets
|
|
( 25MB 1855) 1.35ms 8888 image mandrill_132x130_6x5.astc-5-subsets
|
|
( 25MB 1854) 1.41ms 8888 image mandrill_132x130_12x10.astc-5-subsets
|
|
( 25MB 1853) 151µs 8888 image mandrill_130x132_10x6.astc-5-subsets
|
|
( 25MB 1852) 154µs 8888 image mandrill_130x130_5x5.astc-5-subsets
|
|
...
|
|
( 748MB 5) 9.43ms unit test GLInterfaceValidation
|
|
( 748MB 4) 30.3ms unit test HalfFloatTextureTest
|
|
( 748MB 3) 31.2ms unit test FloatingPointTextureTest
|
|
( 748MB 2) 32.9ms unit test DeferredCanvas_GPU
|
|
( 748MB 1) 49.4ms unit test ClipCache
|
|
( 748MB 0) 37.2ms unit test Blur
|
|
~~~
|
|
Do not panic.
|
|
|
|
As you become more familiar with DM, this spew may be a bit annoying. If you
|
|
remove -v from the command line, DM will spin its progress on a single line
|
|
rather than print a new line for each status update.
|
|
|
|
Don't worry about the "Skipping something: Here's why." lines at startup. DM
|
|
supports many test configurations, which are not all appropriate for all
|
|
machines. These lines are a sort of FYI, mostly in case DM can't run some
|
|
configuration you might be expecting it to run.
|
|
|
|
Don't worry about the "skps: Couldn't read skps." messages either, you won't
|
|
have those by default and can do without them. If you wish to test with them
|
|
too, you can download them separately.
|
|
|
|
The next line is an overview of the work DM is about to do.
|
|
~~~
|
|
492 srcs * 3 sinks + 382 tests == 1858 tasks
|
|
~~~
|
|
|
|
DM has found 382 unit tests (code linked in from tests/), and 492 other drawing
|
|
sources. These drawing sources may be GM integration tests (code linked in
|
|
from gm/), image files (from `--images`, which defaults to "resources") or .skp
|
|
files (from `--skps`, which defaults to "skps"). You can control the types of
|
|
sources DM will use with `--src` (default, "tests gm image skp").
|
|
|
|
DM has found 3 usable ways to draw those 492 sources. This is controlled by
|
|
`--config`. The defaults are operating system dependent. On Linux they are "8888 gl nonrendering".
|
|
DM has skipped nonrendering leaving two usable configs:
|
|
8888 and gl. These two name different ways to draw using Skia:
|
|
|
|
- 8888: draw using the software backend into a 32-bit RGBA bitmap
|
|
- gl: draw using the OpenGL backend (Ganesh) into a 32-bit RGBA bitmap
|
|
|
|
Sometimes DM calls these configs, sometimes sinks. Sorry. There are many
|
|
possible configs but generally we pay most attention to 8888 and gl.
|
|
|
|
DM always tries to draw all sources into all sinks, which is why we multiply
|
|
492 by 3. The unit tests don't really fit into this source-sink model, so they
|
|
stand alone. A couple thousand tasks is pretty normal. Let's look at the
|
|
status line for one of those tasks.
|
|
~~~
|
|
( 25MB 1857) 1.36ms 8888 image mandrill_132x132_12x12.astc-5-subsets
|
|
[1] [2] [3] [4]
|
|
~~~
|
|
|
|
This status line tells us several things.
|
|
|
|
1. The maximum amount of memory DM had ever used was 25MB. Note this is a
|
|
high water mark, not the current memory usage. This is mostly useful for us
|
|
to track on our buildbots, some of which run perilously close to the system
|
|
memory limit.
|
|
|
|
2. The number of unfinished tasks, in this example there are 1857, either
|
|
currently running or waiting to run. We generally run one task per hardware
|
|
thread available, so on a typical laptop there are probably 4 or 8 running at
|
|
once. Sometimes the counts appear to show up out of order, particularly at DM
|
|
startup; it's harmless, and doesn't affect the correctness of the run.
|
|
|
|
3. Next, we see this task took 1.36 milliseconds to run. Generally, the
|
|
precision of this timer is around 1 microsecond. The time is purely there for
|
|
informational purposes, to make it easier for us to find slow tests.
|
|
|
|
4. The configuration and name of the test we ran. We drew the test
|
|
"mandrill_132x132_12x12.astc-5-subsets", which is an "image" source, into an
|
|
"8888" sink.
|
|
|
|
When DM finishes running, you should find a directory with file named `dm.json`,
|
|
and some nested directories filled with lots of images.
|
|
~~~
|
|
$ ls dm_output
|
|
8888 dm.json gl
|
|
|
|
$ find dm_output -name '*.png'
|
|
dm_output/8888/gm/3x3bitmaprect.png
|
|
dm_output/8888/gm/aaclip.png
|
|
dm_output/8888/gm/aarectmodes.png
|
|
dm_output/8888/gm/alphagradients.png
|
|
dm_output/8888/gm/arcofzorro.png
|
|
dm_output/8888/gm/arithmode.png
|
|
dm_output/8888/gm/astcbitmap.png
|
|
dm_output/8888/gm/bezier_conic_effects.png
|
|
dm_output/8888/gm/bezier_cubic_effects.png
|
|
dm_output/8888/gm/bezier_quad_effects.png
|
|
...
|
|
~~~
|
|
|
|
The directories are nested first by sink type (`--config`), then by source type (`--src`).
|
|
The image from the task we just looked at, "8888 image mandrill_132x132_12x12.astc-5-subsets",
|
|
can be found at `dm_output/8888/image/mandrill_132x132_12x12.astc-5-subsets.png`.
|
|
|
|
`dm.json` is used by our automated testing system, so you can ignore it if you
|
|
like. It contains a listing of each test run and a checksum of the image
|
|
generated for that run.
|
|
|
|
### Detail <a name="digests"></a>
|
|
Boring technical detail: The checksum is not a checksum of the
|
|
.png file, but rather a checksum of the raw pixels used to create that .png.
|
|
That means it is possible for two different configurations to produce
|
|
the same exact .png, but have their checksums differ.
|
|
|
|
Unit tests don't generally output anything but a status update when they pass.
|
|
If a test fails, DM will print out its assertion failures, both at the time
|
|
they happen and then again all together after everything is done running.
|
|
These failures are also included in the `dm.json` file.
|
|
|
|
DM has a simple facility to compare against the results of a previous run:
|
|
|
|
<!--?prettify lang=sh?-->
|
|
|
|
ninja -C out/Debug dm
|
|
out/Debug/dm -w good
|
|
|
|
# do some work
|
|
|
|
ninja -C out/Debug dm
|
|
out/Debug/dm -r good -w bad
|
|
|
|
When using `-r`, DM will display a failure for any test that didn't produce the
|
|
same image as the `good` run.
|
|
|
|
For anything fancier, I suggest using skdiff:
|
|
|
|
<!--?prettify lang=sh?-->
|
|
|
|
ninja -C out/Debug dm
|
|
out/Debug/dm -w good
|
|
|
|
# do some work
|
|
|
|
ninja -C out/Debug dm
|
|
out/Debug/dm -w bad
|
|
|
|
ninja -C out/Debug skdiff
|
|
mkdir diff
|
|
out/Debug/skdiff good bad diff
|
|
|
|
# open diff/index.html in your web browser
|
|
|
|
That's the basics of DM. DM supports many other modes and flags. Here are a
|
|
few examples you might find handy.
|
|
|
|
<!--?prettify lang=sh?-->
|
|
|
|
out/Debug/dm --help # Print all flags, their defaults, and a brief explanation of each.
|
|
out/Debug/dm --src tests # Run only unit tests.
|
|
out/Debug/dm --nocpu # Test only GPU-backed work.
|
|
out/Debug/dm --nogpu # Test only CPU-backed work.
|
|
out/Debug/dm --match blur # Run only work with "blur" in its name.
|
|
out/Debug/dm --dryRun # Don't really do anything, just print out what we'd do.
|
|
|