Name |
Date |
Size |
#Lines |
LOC |
||
---|---|---|---|---|---|---|
.. | - | - | ||||
src/ | 23-Nov-2023 | - | 1,181 | 944 | ||
README.md | D | 23-Nov-2023 | 3 KiB | 91 | 56 | |
README_ALGORITHM.md | D | 23-Nov-2023 | 3.9 KiB | 97 | 71 | |
README_GENERATING_MODELS.md | D | 23-Nov-2023 | 3.2 KiB | 85 | 57 | |
bad_gms.txt | D | 23-Nov-2023 | 489 | 35 | 34 | |
branch_skqp_dev.sh | D | 23-Nov-2023 | 588 | 14 | 9 | |
clean_app.sh | D | 23-Nov-2023 | 509 | 18 | 8 | |
create_apk.py | D | 23-Nov-2023 | 8.2 KiB | 240 | 191 | |
cut_release.py | D | 23-Nov-2023 | 5.3 KiB | 173 | 143 | |
docker_build_universal_apk.sh | D | 23-Nov-2023 | 1.1 KiB | 46 | 25 | |
docker_run_apk.sh | D | 23-Nov-2023 | 1.1 KiB | 44 | 24 | |
download_model | D | 23-Nov-2023 | 198 | 7 | 2 | |
download_model.py | D | 23-Nov-2023 | 2.1 KiB | 70 | 58 | |
find_commit_with_best_gold_results.py | D | 23-Nov-2023 | 3.8 KiB | 132 | 104 | |
gn_to_bp.py | D | 23-Nov-2023 | 5.5 KiB | 207 | 146 | |
jitter_gms.cpp | D | 23-Nov-2023 | 5.1 KiB | 154 | 127 | |
make_apk.sh | D | 23-Nov-2023 | 199 | 6 | 1 | |
make_apk_list.py | D | 23-Nov-2023 | 4.1 KiB | 142 | 112 | |
make_skqp_model.cpp | D | 23-Nov-2023 | 3.4 KiB | 97 | 89 | |
make_universal_apk | D | 23-Nov-2023 | 201 | 8 | 1 | |
make_universal_apk.py | D | 23-Nov-2023 | 2.2 KiB | 70 | 50 | |
release.sh | D | 23-Nov-2023 | 3.4 KiB | 87 | 67 | |
run_apk.sh | D | 23-Nov-2023 | 940 | 40 | 18 | |
run_skqp_exe | D | 23-Nov-2023 | 1.8 KiB | 55 | 36 | |
setup_resources | D | 23-Nov-2023 | 631 | 21 | 12 | |
skqp_gn_args.py | D | 23-Nov-2023 | 1.2 KiB | 33 | 27 | |
test_apk.sh | D | 23-Nov-2023 | 943 | 41 | 25 | |
upload_apk | D | 23-Nov-2023 | 412 | 14 | 8 |
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