Add measured render-path pacing comparisons

This commit is contained in:
maxjivi05 committed 2026-11-03 20:16:52 -05:00
1 parent fc5a5d77d8
commit ebf9fa3e82
11 files changed
+359

No files matched your search

+10
View File
@@ -0,0 +1,10 @@
beb40eda246bc7c52cf9247658d31546e64649ffd89f27351f1e6de65f3eb3a9 apk-proof.json
cd05a8fb7af2077939f901e13c6da999bacf170c1b409209346b4064193358d3 before-after.png
fc50d2857301e224f55dc3f33c421088b49f570884069eeffeeb437a76f897b3 cpu-gpu-profile.png
e767962bcb772f73274d7b56fe9c65a7d4a2eff1c37e9b9d9231d08d0ee7de24 final-main.png
b78fb9209bfad586f6db7ea890f1c57ad4b3ca18fd583e57b7d6450e63eede37 functional-proof.json
2872dbe1e2df58a4477de97c158f5058827e0562cd44df9f92da5437aa2da0f3 gpu-timing.json
fd63c9d056fcb500fad85f7ea399f570326104a35ef2ba30f794e61eb51c8f1e helper-proof.json
efd53910e9079d9cb1de2b3ae78e70227dc33651befc69ba3c01cb5cc244f3b6 measurements.csv
d0b41c2d5046c7048d7377aa8a7b69e79b97f874f1042f6a65df621813c3a909 method.md
f6ed88b4afcb1e4e6c7b068f771e0819e5f4f98a625aa94f0deb955cd2891c49 theory-results.png
+12
View File
@@ -0,0 +1,12 @@
{
"donor": "main-f3650d3",
"changed_entries": [
"assets/linuxfs/usr/local/bin/droiddeck-game-env"
],
"apk_sha256": "0dc5330f2c7299719ea86fb3bc36dac0c0e2e1725390cb646882d37650af098e",
"helper_sha256": "c79440144bb5f8b3464e98eae3a8d11cf2f8b423988941b79781199d93590556",
"adb_install_success": true,
"installed_helper_matches_source": true,
"environment_regression_tests_passed": 129,
"packaging": "Repository fast-deploy tool; main donor with one helper replacement; release certificate and legacy signing lineage verified."
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

@@ -0,0 +1,26 @@
{
"observations": {
"virtual_controller_map": "opened and closed",
"virtual_controller_throttle": "truck traveled 14 m",
"keyboard_and_camera": "driving inputs, orbit and hood views responded; odometer reached 19 m",
"visual_spot_check": "no obvious corruption in inspected Flood views",
"physical_button_latency": "not measured",
"other_maps": "not validated"
},
"dynamic_sample": {
"ok": true,
"seconds": 60.1,
"frames": 1335,
"fpsOnScreen": 22.2
},
"included_in_controlled_before_after": false,
"game_closed_after_testing": true,
"original_environment_restored": true,
"return_after_game_preference_restored": true,
"final_state": {
"phase": "IDLE",
"running": false,
"game_and_steam_processes": [],
"main_page_visually_verified": true
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"timing-stock": {
"frames": 694.0,
"gpu_timestamp_ms_per_frame": 33.320407504322766,
"wall_ms_per_frame": 54.15719308357349,
"submissions_per_frame": 7.0,
"acquire_ms_per_frame": 0.04815561959654179,
"present_ms_per_frame": 0.1918328530259366
},
"timing-tiler": {
"frames": 771.0,
"gpu_timestamp_ms_per_frame": 33.81811167055771,
"wall_ms_per_frame": 46.75638391699092,
"submissions_per_frame": 9.0,
"acquire_ms_per_frame": 0.04532555123216602,
"present_ms_per_frame": 0.17829701686121918
}
}
+220
View File
@@ -0,0 +1,220 @@
[
{
"trial": "profile-a",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
},
{
"trial": "profile-a",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 22.1,
"frames": 554,
"offCadence": 339,
"offCadencePercent": 61.2,
"ok": true,
"presentToPresentMs": {
"16": 155,
"33": 22,
"50": 215,
"66": 159,
"86": 3
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "profile-b",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
},
{
"trial": "profile-b",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 22.1,
"frames": 555,
"offCadence": 347,
"offCadencePercent": 62.5,
"ok": true,
"presentToPresentMs": {
"16": 158,
"33": 23,
"50": 208,
"66": 162,
"86": 4
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "profile-override-auto",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
},
{
"trial": "profile-override-auto",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 18.8,
"frames": 472,
"offCadence": 201,
"offCadencePercent": 42.6,
"ok": true,
"presentToPresentMs": {
"102": 14,
"16": 14,
"33": 83,
"50": 271,
"66": 32,
"86": 58
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "apk-stock-auto",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
},
{
"trial": "apk-stock-auto",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 18.9,
"frames": 474,
"offCadence": 186,
"offCadencePercent": 39.2,
"ok": true,
"presentToPresentMs": {
"102": 17,
"16": 9,
"33": 88,
"50": 288,
"66": 16,
"86": 56
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "apk-profile-a",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
},
{
"trial": "apk-profile-a",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 22.1,
"frames": 554,
"offCadence": 335,
"offCadencePercent": 60.5,
"ok": true,
"presentToPresentMs": {
"16": 152,
"33": 22,
"50": 219,
"66": 160,
"86": 1
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "apk-profile-b",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
},
{
"trial": "apk-profile-b",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 22.1,
"frames": 554,
"offCadence": 344,
"offCadencePercent": 62.1,
"ok": true,
"presentToPresentMs": {
"16": 154,
"33": 24,
"50": 210,
"66": 164,
"86": 2
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "apk-stock-repeat",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
},
{
"trial": "apk-stock-repeat",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 19.0,
"frames": 475,
"offCadence": 187,
"offCadencePercent": 39.4,
"ok": true,
"presentToPresentMs": {
"102": 13,
"16": 10,
"33": 83,
"50": 288,
"66": 29,
"86": 52
},
"refreshRates": [
60
],
"seconds": 25.1
}
},
{
"trial": "apk-drive-ready",
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
},
{
"trial": "apk-drive-ready",
"screen_pacing": {
"cadenceMs": 50,
"command": "pacing",
"fpsOnScreen": 22.5,
"frames": 565,
"offCadence": 346,
"offCadencePercent": 61.2,
"ok": true,
"presentToPresentMs": {
"16": 157,
"33": 35,
"50": 219,
"66": 154
},
"refreshRates": [
60
],
"seconds": 25.1
}
}
]
@@ -0,0 +1,29 @@
label,fps,seconds,cpu_pct_mean,gpu_pct_mean,gpu_mhz_mean,long_interval_pct
Stock A,19.0,25.1,23.43,65.25,1150.0,80.25
Stock B,18.9,25.1,23.58,65,1150.0,83.09
Stock after restart,18.9,25.1,24.4,64.86,1150.0,81.61
Tiler heuristics off A,22.1,25.1,26.64,76.75,1150.0,68.9
Tiler heuristics off B,22.1,25.1,27.11,77.14,1150.0,67.93
Partial precision,18.7,20.1,23.7,64.74,1150.0,80.59
Installed test driver,16.5,30.1,20.71,72.55,1150.0,75.56
Direct mapping off,18.2,25.1,25.05,64.32,1150.0,77.85
D3D9 vsync off,18.8,25.1,24.29,65.64,1150.0,81.36
Frame latency 1,19.1,25.1,23.85,65.79,1150.0,77.24
Game limiter off,18.8,25.1,23.71,65.29,1150.0,80.3
Driver 0.3.5,19.0,25.1,24.24,65.39,1150.0,76.89
Cached write-only buffers,19.0,25.1,24.0,65.36,1150.0,80.0
Detailed logging on,18.9,25.1,25.52,65.21,1150.0,81.18
Float emulation off,16.8,25.1,22.76,68.14,1150.0,68.65
Strict float emulation,17.0,25.1,22.61,68.36,1150.0,64.94
Device-local constants,18.6,25.1,24.05,65,1150.0,78.54
Stock late control,18.8,25.1,23.99,65.61,1150.0,80.72
64-thread shader waves,18.4,25.1,23.37,65.96,1150.0,71.15
Tiler off + NTSYNC off,22.0,25.1,26.63,77.39,1150.0,69.69
Installed helper A,22.1,25.1,26.26,77.18,1150.0,68.05
Installed helper B,22.1,25.1,26.38,77.32,1150.0,67.39
Installed helper + Auto override,18.8,25.1,23.61,65.36,1150.0,79.45
Signed APK + Auto override,18.9,25.1,26.46,65.57,1150.0,79.54
Signed APK default A,22.1,25.1,27.28,77.11,1150.0,68.59
Signed APK default B,22.1,25.1,27.47,77.21,1150.0,67.87
Signed APK control repeat,19.0,25.1,24.58,65.46,1150.0,80.42
Signed APK default C,22.5,25.1,27.77,77.04,1150.0,66.02
1 label fps seconds cpu_pct_mean gpu_pct_mean gpu_mhz_mean long_interval_pct
2 Stock A 19.0 25.1 23.43 65.25 1150.0 80.25
3 Stock B 18.9 25.1 23.58 65 1150.0 83.09
4 Stock after restart 18.9 25.1 24.4 64.86 1150.0 81.61
5 Tiler heuristics off A 22.1 25.1 26.64 76.75 1150.0 68.9
6 Tiler heuristics off B 22.1 25.1 27.11 77.14 1150.0 67.93
7 Partial precision 18.7 20.1 23.7 64.74 1150.0 80.59
8 Installed test driver 16.5 30.1 20.71 72.55 1150.0 75.56
9 Direct mapping off 18.2 25.1 25.05 64.32 1150.0 77.85
10 D3D9 vsync off 18.8 25.1 24.29 65.64 1150.0 81.36
11 Frame latency 1 19.1 25.1 23.85 65.79 1150.0 77.24
12 Game limiter off 18.8 25.1 23.71 65.29 1150.0 80.3
13 Driver 0.3.5 19.0 25.1 24.24 65.39 1150.0 76.89
14 Cached write-only buffers 19.0 25.1 24.0 65.36 1150.0 80.0
15 Detailed logging on 18.9 25.1 25.52 65.21 1150.0 81.18
16 Float emulation off 16.8 25.1 22.76 68.14 1150.0 68.65
17 Strict float emulation 17.0 25.1 22.61 68.36 1150.0 64.94
18 Device-local constants 18.6 25.1 24.05 65 1150.0 78.54
19 Stock late control 18.8 25.1 23.99 65.61 1150.0 80.72
20 64-thread shader waves 18.4 25.1 23.37 65.96 1150.0 71.15
21 Tiler off + NTSYNC off 22.0 25.1 26.63 77.39 1150.0 69.69
22 Installed helper A 22.1 25.1 26.26 77.18 1150.0 68.05
23 Installed helper B 22.1 25.1 26.38 77.32 1150.0 67.39
24 Installed helper + Auto override 18.8 25.1 23.61 65.36 1150.0 79.45
25 Signed APK + Auto override 18.9 25.1 26.46 65.57 1150.0 79.54
26 Signed APK default A 22.1 25.1 27.28 77.11 1150.0 68.59
27 Signed APK default B 22.1 25.1 27.47 77.21 1150.0 67.87
28 Signed APK control repeat 19.0 25.1 24.58 65.46 1150.0 80.42
29 Signed APK default C 22.5 25.1 27.77 77.04 1150.0 66.02
+44
View File
@@ -0,0 +1,44 @@
# Render-path pacing investigation
Retroid Pocket Duo, Adreno 722, DD-Turnip 0.4.0, Proton 11-11.11 and Ubuntu runtime rc4. Spintires uses Direct3D 9 through DXVK; VKD3D is not in this rendering path.
## Method
Each controlled launch restored the same Flood checkpoint, configuration and camera. The output was 1280×720 at 60 Hz, highest shaders, high grass/LOD, with shadows, SSAO, FXAA and motion blur enabled. Samples began after screenshot matching and warm-up. SurfaceFlinger present intervals measured frames reaching the screen. Device CPU/GPU, clocks, memory and thermal state were sampled alongside pacing. Samples were sequential rather than randomized; they are short observations, not confidence intervals or a complete thermal study. Severe skin thermal status was present; sampled GPU clocks stayed at 1150 MHz.
## Findings
Stock controls stayed between 18.8 and 19.0 FPS. Turning off DXVK tiler heuristics produced 22.1 FPS twice without lowering graphics quality. The automatically selected helper subsequently reproduced 22.1 FPS twice. A release-signed APK based on main-f3650d3 measured 22.1, 22.1 and 22.5 FPS in the three fix runs, bracketed by explicit Auto controls of 18.9 and 19.0 FPS. The signed-APK gain is 17.3% over the mean of those controls, and intervals of at least 50 ms fell from 80.0% to 67.5%. This is a bounded throughput improvement; long frame holds remain.
Mesa overlay profiling measured 33.32 ms of GPU timestamp spans and 54.16 ms of wall time per stock frame. With tiler heuristics off, the corresponding values were 33.82 and 46.76 ms. Submission counts changed from 7 to 9 per frame. Acquire and present API time stayed below 1 ms. The timestamps can include queue stalls and profiling overhead, so the difference is not an exclusive measurement of shader execution or FEX overhead. The evidence supports improved render scheduling; it does not isolate secondary command buffers, cached allocation preference or flush policy individually.
Thread snapshots did not show saturation of the main or command-stream thread. That does not eliminate CPU scheduling, emulation or synchronization from the remaining cost. PRoot counters and global paging statistics do not identify an individual blocking call. Hardware and software perf-event access against the real game PID was denied.
Changing shader precision/wave size, driver versions, buffer mapping, present interval, maximum frame latency, game limiter, detailed logging, floating-point emulation, device-local constants and NTSYNC did not improve on the tiler change. Forced Turnip sysmem, LRZ/binning toggles also did not help; forced gmem was slower. The existing custom GPU-load layer was absent from the game's process.
## Scope and exclusions
The default is restricted to the tested executable, Adreno 722 and DD-Turnip 0.4.0. Explicit tiler options and custom configuration files retain control. Other games, GPUs and drivers keep their existing behavior.
A 640×360 request was not an advertised mode and the actual swapchain remained 1280×720. Those runs are excluded from resolution-scaling conclusions. An interrupted DXVK 2.7.1 run, interrupted captures, mismatched camera scenes and an accidental self-profile are excluded. No statement that every stall is fixed or that a different DXVK release is equivalent follows from these tests.
## Primary sources
- [DXVK performance hints](https://github.com/doitsujin/dxvk/blob/master/src/dxvk/dxvk_device.cpp)
- [DXVK render-pass command buffers](https://github.com/doitsujin/dxvk/blob/master/src/dxvk/dxvk_context.cpp)
- [DXVK configuration](https://github.com/doitsujin/dxvk/blob/master/dxvk.conf)
- [Mesa Adreno architecture](https://docs.mesa3d.org/drivers/freedreno.html)
- [Mesa environment controls](https://docs.mesa3d.org/envvars.html)
## Package verification
The repository fast-deploy tool rebuilt main-f3650d3 with exactly one changed non-signature payload: the environment helper. Release certificate/lineage, ZIP alignment and complete session-asset source checks passed. The APK installed successfully over the existing app, and its extracted helper matched the tested source hash. The original installed APK was retained locally for rollback. This is a helper-only package rebuild using the existing compiled main application, not a new compilation of unchanged native/Kotlin code.
The APK and source-helper digests are recorded in apk-proof.json. Raw process logs, device identifiers and account details are kept out of the shared evidence.
## Gameplay check and remaining work
After the controlled runs, the virtual controller opened/closed the map and drove the truck 14 m. Keyboard driving and camera changes responded; the odometer reached 19 m. A 60-second dynamic capture completed with the game still active. The inspected rear, orbit and hood views showed no obvious corruption. This is a Flood spot check, not validation of every map or physical-button latency. The dynamic capture is excluded from controlled comparisons.
The new default removes measured avoidable render scheduling cost. The remaining GPU-side spans and long present intervals still need investigation; a full stall resolution has not been demonstrated. Next work should profile expensive rendering passes and the remaining submission gaps, rather than assume that disabling synchronization or changing shader precision is a proven fix. Original environment/test settings were restored, and the game was closed after testing.
Steam was stopped, temporary overrides and diagnostic bridge files were removed, and DroidDeck was force-closed/reopened on its main Play Steam page. The installed package retains the tested helper. Temporary test progress is preserved privately; pre-existing save/config files were retained.
Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB