• Home
Name Date Size #Lines LOC

..--

src/03-May-2024-1,181944

README.mdD03-May-20243 KiB9156

README_ALGORITHM.mdD03-May-20243.9 KiB9771

README_GENERATING_MODELS.mdD03-May-20243.2 KiB8557

bad_gms.txtD03-May-2024489 3534

branch_skqp_dev.shD03-May-2024588 149

clean_app.shD03-May-2024509 188

create_apk.pyD03-May-20248.2 KiB240191

cut_release.pyD03-May-20245.3 KiB173143

docker_build_universal_apk.shD03-May-20241.1 KiB4625

docker_run_apk.shD03-May-20241.1 KiB4424

download_modelD03-May-2024198 72

download_model.pyD03-May-20242.1 KiB7058

find_commit_with_best_gold_results.pyD03-May-20243.8 KiB132104

gn_to_bp.pyD03-May-20245.5 KiB207146

jitter_gms.cppD03-May-20245.1 KiB154127

make_apk.shD03-May-2024199 61

make_apk_list.pyD03-May-20244.1 KiB142112

make_skqp_model.cppD03-May-20243.4 KiB9789

make_universal_apkD03-May-2024201 81

make_universal_apk.pyD03-May-20242.2 KiB7050

release.shD03-May-20243.4 KiB8767

run_apk.shD03-May-2024940 4018

run_skqp_exeD03-May-20241.8 KiB5536

setup_resourcesD03-May-2024631 2112

skqp_gn_args.pyD03-May-20241.2 KiB3327

test_apk.shD03-May-2024943 4125

upload_apkD03-May-2024412 148

README.md

1SkQP
2====
3
4SkQP (Skia Quality Program) is a component of the Android CTS (Compatablity
5Test Suite) that tests an Android device's GPU and OpenGLES & Vulkan drivers
6using Skia's existing unit & rendering tests.
7
8See https://skia.org/dev/testing/skqp for pre-build APKs.
9
10How to build and run the SkQP tests
11-----------------------------------
12
131.  Get the dependencies:
14
15    -   You will need Java JDK 8, `git`, and `python`.
16
17    -   Install Chromium's [depot\_tools](http://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html).  Add it to your `PATH`.
18
19            git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
20            export PATH="${PWD}/depot_tools:${PATH}"
21
22    -   Install the [Android NDK](https://developer.android.com/ndk/downloads/).
23
24            ( cd ~; unzip ~/Downloads/android-ndk-*.zip )
25            ANDROID_NDK=$(ls -d ~/android-ndk-*)   # Or wherever you installed the Android NDK.
26
27    -   Install the [Android SDK](https://developer.android.com/studio/#command-tools).
28        Set the `ANDROID_HOME` environment variable.
29
30            mkdir ~/android-sdk
31            ( cd ~/android-sdk; unzip ~/Downloads/sdk-tools-*.zip )
32            yes | ~/android-sdk/tools/bin/sdkmanager --licenses
33            export ANDROID_HOME=~/android-sdk  # Or wherever you installed the Android SDK.
34
35        Put `adb` in your `PATH`.
36
37            export PATH="${PATH}:${ANDROID_HOME}/platform-tools"
38
392.  Get the right version of Skia:
40
41        git clone https://skia.googlesource.com/skia.git
42        cd skia
43        git checkout origin/skqp/dev  # or whatever release tag you need
44
453.  Build the APK:
46
47        tools/git-sync-deps
48        tools/skqp/make_universal_apk
49
504.  Build, install, and run.
51
52        adb install -r out/skqp/skqp-universal-debug.apk
53        adb logcat -c
54        adb shell am instrument -w org.skia.skqp
55
565.  Monitor the output with:
57
58        adb logcat TestRunner org.skia.skqp skia "*:S"
59
60    Note the test's output path on the device.  It will look something like this:
61
62        01-23 15:22:12.688 27158 27173 I org.skia.skqp:
63        output written to "/storage/emulated/0/Android/data/org.skia.skqp/files/output"
64
656.  Retrieve and view the report with:
66
67        OUTPUT_LOCATION="/storage/emulated/0/Android/data/org.skia.skqp/files/output"
68        adb pull $OUTPUT_LOCATION /tmp/
69        bin/sysopen /tmp/output/skqp_report/report.html
70
71Running a single test
72---------------------
73
74To run a single test, for example `gles_aarectmodes`:
75
76    adb shell am instrument -e class 'org.skia.skqp.SkQPRunner#gles_aarectmodes' -w org.skia.skqp
77
78Unit tests can be run with the `unitTest_` prefix:
79
80    adb shell am instrument -e class 'org.skia.skqp.SkQPRunner#unitTest_GrSurface -w org.skia.skqp
81
82Run as a non-APK executable
83---------------------------
84
851.  Follow steps 1-3 as above.
86
872.  Build the SkQP program, load files on the device, and run skqp:
88
89        ninja -C out/skqp/arm skqp
90        python tools/skqp/run_skqp_exe out/skqp/arm
91

README_ALGORITHM.md

1SkQP Render Test Algorithm
2==========================
3
4The following is a description of the render test validation algorithm that
5will be used by the version of SkQP that will be released for Android Q-release.
6
7There is a global macro constant: `SK_SKQP_GLOBAL_ERROR_TOLERANCE`, which
8reflects the `gn` variable `skia_skqp_global_error_tolerance`.  This is usually
9set to 8.
10
11First, look for a file named `skqp/rendertests.txt` in the
12`platform_tools/android/apps/skqp/src/main/assets` directory.  The format of
13this file is:  each line contains one render test name, followed by a comma,
14followed by an integer.  The integer is the `passing_threshold` for that test.
15
16For each test, we have a `max_image` and a `min_image`.  These are PNG-encoded
17images stored in SkQP's APK's asset directory (in the paths `gmkb/${TEST}/min.png`
18and `gmkb/${TEST}/max.png`).
19
20The test input is a rendered image.  This will be produced by running one of
21the render tests against the either the `vk` (Vulkan) or `gles` (OpenGL ES)
22Skia backend.
23
24Here is psuedocode for the error calculation:
25
26    function calculate_pixel_error(pixel_value, pixel_max, pixel_min):
27        pixel_error = 0
28
29        for color_channel in { red, green, blue, alpha }:
30            value = get_color(pixel_value, color_channel)
31            v_max = get_color(pixel_max,   color_channel)
32            v_min = get_color(pixel_min,   color_channel)
33
34            if value > v_max:
35                channel_error = value - v_max
36            elif value < v_min:
37                channel_error = v_min - value
38            else:
39                channel_error = 0
40            pixel_error = max(pixel_error, channel_error)
41
42        return max(0, pixel_error - SK_SKQP_GLOBAL_ERROR_TOLERANCE);
43
44    function get_error(rendered_image, max_image, min_image):
45        assert(dimensions(rendered_image) == dimensions(max_image))
46        assert(dimensions(rendered_image) == dimensions(min_image))
47
48        max_error = 0
49        bad_pixels = 0
50        total_error = 0
51
52        error_image = allocate_bitmap(dimensions(rendered_image))
53
54        for xy in list_all_pixel_coordinates(rendered_image):
55            pixel_error = calculate_pixel_error(rendered_image(xy),
56                                                max_image(xy),
57                                                min_image(xy))
58            if pixel_error > 0:
59                for neighboring_xy in find_neighbors(xy):
60                    if not inside(neighboring_xy, dimensions(rendered_image)):
61                        continue
62                    pixel_error = min(pixel_error,
63                                      calculate_pixel_error(rendered_image(xy),
64                                                            max_image(neighboring_xy),
65                                                            min_image(neighboring_xy)))
66
67            if pixel_error > 0:
68                max_error = max(max_error, pixel_error)
69                bad_pixels += 1
70                total_error += pixel_error
71
72                error_image(xy) = linear_interpolation(black, red, pixel_error)
73            else:
74                error_image(xy) = white
75
76        return ((total_error, max_error, bad_pixels), error_image)
77
78For each render test, there is a threshold value for `total_error`, :
79`passing_threshold`.
80
81If `passing_threshold >= 0 && total_error > passing_threshold`, then the test
82is a failure and is included in the report.  if `passing_threshold == -1`, then
83the test always passes, but we do execute the test to verify that the driver
84does not crash.
85
86We generate a report with the following information for each test:
87
88    backend_name,render_test_name,max_error,bad_pixels,total_error
89
90in CSV format in the file `out.csv`.  A HTML report of just the failing tests
91is written to the file `report.html`.  This version includes four images for
92each test:  `rendered_image`, `max_image`, `min_image`, and `error_image`, as
93well as the three metrics: `max_error`, `bad_pixels`, and `total_error`.
94
95
96
97

README_GENERATING_MODELS.md

1How SkQP Generates Render Test Models
2=====================================
3
4We will, at regular intervals, generate new models from the [master branch of
5Skia][1].  Here is how that process works:
6
70.  Choose a commit to make the branch from
8
9        COMMIT=origin/master
10
11    Or use the script to find the best one:
12
13        cd SKIA_SOURCE_DIRECTORY
14        git fetch origin
15        COMMIT=$(python tools/skqp/find_commit_with_best_gold_results.py \
16                 origin/master ^origin/skqp/dev)
17
181.  Get the positively triaged results from Gold and generate models:
19
20        cd SKIA_SOURCE_DIRECTORY
21        git fetch origin
22        git checkout "$COMMIT"
23        python tools/skqp/cut_release.py HEAD~10 HEAD
24
25    This will create the following files:
26
27        platform_tools/android/apps/skqp/src/main/assets/files.checksum
28        platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt
29        platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt
30
31    These three files can be commited to Skia to create a new commit.  Make
32    `origin/skqp/dev` a parent of this commit (without merging it in), and
33    push this new commit to `origin/skqp/dev`, using this script:
34
35        sh tools/skqp/branch_skqp_dev.sh
36
37    Review and submit the change:
38
39        git push origin HEAD:refs/for/skqp/dev
40        bin/sysopen https://review.skia.org/$(bin/gerrit-number HEAD)
41
42    (Optional) Make a SkQP APK.
43
44        tools/skqp/docker_build_universal_apk.sh
45
46    (Optional) Test the SkQP APK:
47
48        tools/skqp/test_apk.sh (LOCATION)/skqp-universal-debug.apk
49
50    (Once changes land) Upload the SkQP APK.
51
52        tools/skqp/upload_apk HEAD (LOCATION)/skqp-universal-debug.apk
53
54
55`tools/skqp/cut_release.py`
56---------------------------
57
58This tool will call `make_skqp_model` to generate the `m{ax,in}.png` files for
59each render test.
60
61Then it calls `jitter_gms` to see which render tests pass the jitter test.
62`jitter_gms` respects the `bad_gms.txt` file by ignoring the render tests
63enumerated in that file.  Tests which pass the jitter test are enumerated in
64the file `good.txt`, those that fail in the `bad.txt` file.
65
66Next, the `skqp/rendertests.txt` file is created.  This file lists the render
67tests that will be executed by SkQP.  These are the union of the tests
68enumerated in the `good.txt` and `bad.txt` files.  If the render test is found
69in the `good.txt` file and the model exists, its per-test threshold is set
70to 0 (a later CL can manually change this, if needed).  Otherwise, the
71threshold is set to -1; this indicated that the rendertest will be executed (to
72verify that the driver will not crash), but the output will not be compared
73against the model.  Unnecessary models will be removed.
74
75Next, all of the files that represent the models are uploaded to cloud storage.
76A single checksum hash is kept in the  `files.checksum` file.  This is enough
77to re-download those files later, but we don't have to fill the git repository
78with a lot of binary data.
79
80Finally, a list of the current gpu unit tests is created and stored in
81`skqp/unittests.txt`.
82
83[1]: https://skia.googlesource.com/skia/+log/master "Skia Master Branch"
84[2]: https://gold.skia.org/search                   "Skia Gold Search"
85