Compare commits

...

264 commits
v0.1 ... master

Author SHA1 Message Date
RenovateBot 8317fd5d1d Update Rust crate serde_json to 1.0.120
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 31m52s
2024-07-01 18:05:08 +00:00
RenovateBot d7064e37b3 Update Rust crate lazy_static to 1.5.0
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 28m44s
2024-07-01 12:05:42 +00:00
RenovateBot 1e617eb7a9 Update Rust crate serde_json to 1.0.119
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 26m45s
2024-07-01 09:05:25 +00:00
RenovateBot fadfacb80a Update Rust crate serde to 1.0.203
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 27m56s
2024-05-25 18:05:25 +00:00
RenovateBot b2526bcbfb Update Rust crate anyhow to 1.0.86
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 22m54s
2024-05-18 12:06:53 +00:00
RenovateBot 066ba0cddb Update Rust crate anyhow to 1.0.85
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 26m49s
2024-05-18 00:06:51 +00:00
RenovateBot b6539fc82f Update Rust crate anyhow to 1.0.84
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 23m13s
2024-05-17 18:06:41 +00:00
RenovateBot 40b4e85b8f Update Rust crate serde to 1.0.202
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 25m18s
2024-05-15 09:05:46 +00:00
RenovateBot 654511cabf Update Rust crate serde_json to 1.0.117
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 26m30s
2024-05-08 09:05:21 +00:00
RenovateBot f3aa907e45 Update Rust crate serde to 1.0.201
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 25m39s
2024-05-08 03:05:52 +00:00
RenovateBot f82c603849 Update Rust crate paste to 1.0.15
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 28m36s
2024-05-07 03:06:51 +00:00
RenovateBot da6669042f Update Rust crate anyhow to 1.0.83
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 25m27s
2024-05-06 21:07:17 +00:00
RenovateBot 61c196422f Update Rust crate serde to 1.0.200
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 27m37s
2024-05-01 18:06:10 +00:00
RenovateBot d4c8fafeb5 Update Rust crate serde to 1.0.199
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 24m52s
2024-04-27 06:06:28 +00:00
RenovateBot e3fa942b40 Update Rust crate serde_json to 1.0.116
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 12m4s
2024-04-16 06:06:57 +00:00
RenovateBot 7af632b4ab Update Rust crate anyhow to 1.0.82
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 11m45s
2024-04-10 06:07:46 +00:00
RenovateBot 75d36c559a Update Rust crate serde_json to 1.0.115
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 11m35s
2024-03-26 09:04:18 +00:00
RenovateBot e07f8e914c Update Rust crate anyhow to 1.0.81
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 11m57s
2024-03-12 03:06:15 +00:00
hodasemi 4fb0c1b29c Merge remote-tracking branch 'refs/remotes/origin/master' 2024-02-28 15:55:47 +01:00
hodasemi a255998362 Add plugin dll 2024-02-28 15:54:38 +01:00
hodasemi 7b8df3deb9 renovate.json aktualisiert 2024-02-26 09:27:02 +00:00
hodasemi e0bc61def0 Merge pull request 'Update Rust crate serde to 1.0.197' (#74) from renovate/serde-monorepo into master
Reviewed-on: #74
2024-02-22 11:09:56 +00:00
RenovateBot 5cf5af12cd Update Rust crate serde to 1.0.197
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m46s
2024-02-22 02:05:31 +00:00
hodasemi bba2da6bbe Merge pull request 'Update Rust crate anyhow to 1.0.80' (#73) from renovate/anyhow-1.x into master
Reviewed-on: #73
2024-02-21 11:44:26 +00:00
hodasemi 9ae7320d3e Merge pull request 'Update Rust crate serde_json to 1.0.114' (#75) from renovate/serde_json-1.x into master
Reviewed-on: #75
2024-02-21 09:57:51 +00:00
RenovateBot b12fe7492a Update Rust crate serde_json to 1.0.114
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m37s
2024-02-21 02:05:01 +00:00
hodasemi 33a894e02f Improve install command 2024-02-20 10:20:45 +01:00
RenovateBot 0fa5cb55c8 Update Rust crate anyhow to 1.0.80
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m42s
2024-02-20 02:06:03 +00:00
hodasemi 88d2a72dd3 Merge pull request 'Update Rust crate serde_json to 1.0.113' (#72) from renovate/serde_json-1.x into master
Reviewed-on: #72
2024-02-01 08:08:33 +01:00
RenovateBot 6d00eb3736 Update Rust crate serde_json to 1.0.113
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 10m32s
2024-02-01 02:06:23 +01:00
hodasemi 258eda7ced Merge pull request 'Update Rust crate serde to 1.0.196' (#71) from renovate/serde-1.x into master
Reviewed-on: #71
2024-01-31 14:36:13 +01:00
RenovateBot acadb282d3 Update Rust crate serde to 1.0.196
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m30s
2024-01-27 02:04:33 +01:00
hodasemi 5031b83210 Merge pull request 'Update Rust crate serde to 1.0.195' (#69) from renovate/serde-1.x into master
Reviewed-on: #69
2024-01-13 04:12:24 +01:00
RenovateBot 66e87f2531 Update Rust crate serde to 1.0.195
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 10m29s
2024-01-12 02:08:37 +01:00
hodasemi 9e7645a9a9 Merge pull request 'Update Rust crate serde_json to 1.0.111' (#70) from renovate/serde_json-1.x into master
Reviewed-on: #70
2024-01-11 11:27:47 +01:00
hodasemi 72614254b1 Merge pull request 'Update Rust crate anyhow to 1.0.79' (#68) from renovate/anyhow-1.x into master
Reviewed-on: #68
2024-01-11 11:27:14 +01:00
RenovateBot 01f7ef4f98 Update Rust crate serde_json to 1.0.111
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m28s
2024-01-07 02:05:59 +01:00
RenovateBot a7a8f2eae1 Update Rust crate anyhow to 1.0.79
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m17s
2024-01-04 02:06:36 +01:00
hodasemi 40000ed6b8 Merge pull request 'Update Rust crate serde to 1.0.193' (#67) from renovate/serde-1.x into master
Reviewed-on: #67
2023-12-07 11:11:55 +01:00
hodasemi 032dd8b043 Fix overlay 2023-12-06 13:53:31 +01:00
hodasemi 171cedf181 Get watermark working in first stage 2023-12-04 19:34:51 +01:00
hodasemi b0b2b3e847 remove comparison 2023-12-04 16:43:46 +01:00
hodasemi edc60dd757 Fix dead lock 2023-12-04 15:27:00 +01:00
hodasemi bd8d255492 Trying to fix rendering 2023-12-04 12:10:49 +01:00
RenovateBot a2ab1291ce Update Rust crate serde to 1.0.193
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m39s
2023-12-02 02:04:18 +01:00
hodasemi e860b2413a Fix dead lock 2023-12-01 14:51:47 +01:00
hodasemi c297325c37 Rework how data is internally stored 2023-12-01 14:36:38 +01:00
hodasemi 469328b934 Improve logging 2023-11-29 14:10:22 +01:00
hodasemi 3fdc3a80eb Merge pull request 'Update Rust crate serde to 1.0.192' (#66) from renovate/serde-1.x into master
Reviewed-on: #66
2023-11-11 08:25:28 +01:00
RenovateBot 37a528e8c9 Update Rust crate serde to 1.0.192
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 13m23s
2023-11-08 02:04:10 +01:00
hodasemi 19a6158ca8 Merge pull request 'Update Rust crate serde to 1.0.191' (#65) from renovate/serde-1.x into master
Reviewed-on: #65
2023-11-07 07:25:53 +01:00
RenovateBot 11590b1600 Update Rust crate serde to 1.0.191
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 12m57s
2023-11-07 02:04:11 +01:00
hodasemi 7dde74b2e2 Merge pull request 'Update Rust crate serde_json to 1.0.108' (#64) from renovate/serde_json-1.x into master
Reviewed-on: #64
2023-10-31 11:18:09 +01:00
RenovateBot 657407a4fe Update Rust crate serde_json to 1.0.108
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 12m49s
2023-10-31 02:03:58 +01:00
hodasemi b2f140812a Merge pull request 'Update Rust crate serde to 1.0.190' (#63) from renovate/serde-1.x into master
Reviewed-on: #63
2023-10-27 08:04:56 +02:00
RenovateBot 5691835aec Update Rust crate serde to 1.0.190
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 12m53s
2023-10-27 02:04:10 +02:00
hodasemi acd44325f7 Merge pull request 'Update Rust crate serde to 1.0.189' (#62) from renovate/serde-1.x into master
Reviewed-on: #62
2023-10-14 12:50:37 +02:00
RenovateBot e16f21ed2d Update Rust crate serde to 1.0.189
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 13m56s
2023-10-14 02:03:41 +02:00
hodasemi 44d4794605 Merge pull request 'Update Rust crate serde_json to 1.0.107' (#61) from renovate/serde_json-1.x into master
Reviewed-on: #61
2023-09-14 07:49:59 +02:00
RenovateBot 1151956f0c Update Rust crate serde_json to 1.0.107
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 8m48s
2023-09-14 02:03:34 +02:00
hodasemi 08b1f168a6 Merge pull request 'Update Rust crate serde_json to 1.0.106' (#60) from renovate/serde_json-1.x into master
Reviewed-on: #60
2023-09-11 08:20:27 +02:00
RenovateBot 7dfe974a5b Update Rust crate serde_json to 1.0.106
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 9m18s
2023-09-10 02:03:00 +02:00
hodasemi 843cbc6e08 Merge pull request 'Update Rust crate serde to 1.0.188' (#59) from renovate/serde-1.x into master
Reviewed-on: #59
2023-08-27 04:57:43 +02:00
RenovateBot 205b68c833 Update Rust crate serde to 1.0.188
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 8m25s
2023-08-27 02:04:17 +02:00
hodasemi 188a1ea1b6 Merge pull request 'Update Rust crate serde to 1.0.187' (#58) from renovate/serde-1.x into master
Reviewed-on: #58
2023-08-26 07:30:13 +02:00
RenovateBot 02c7555702 Update Rust crate serde to 1.0.187
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 11m8s
2023-08-26 02:04:08 +02:00
hodasemi 118d287899 Merge pull request 'Update Rust crate serde to 1.0.186' (#57) from renovate/serde-1.x into master
Reviewed-on: #57
2023-08-25 07:58:05 +02:00
RenovateBot 495657d7d7 Update Rust crate serde to 1.0.186
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 8m20s
2023-08-25 02:03:40 +02:00
hodasemi 8d03e39bf7 Merge pull request 'Update Rust crate serde to 1.0.185' (#56) from renovate/serde-1.x into master
Reviewed-on: #56
2023-08-22 12:22:06 +02:00
RenovateBot aa163bada2 Update Rust crate serde to 1.0.185
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 8m25s
2023-08-22 02:03:30 +02:00
hodasemi b02baa6a64 Merge pull request 'Update Rust crate anyhow to 1.0.75' (#55) from renovate/anyhow-1.x into master
Reviewed-on: #55
2023-08-21 07:54:02 +02:00
RenovateBot f84237eaed Update Rust crate anyhow to 1.0.75
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 8m10s
2023-08-20 02:03:52 +02:00
hodasemi 89d38c1eb2 Merge pull request 'Add actions file' (#54) from dev into master
Reviewed-on: #54
2023-08-16 10:17:14 +02:00
hodasemi f42ba30af8 .gitea/workflows/pull_request.yaml aktualisiert
All checks were successful
Gavania Merge Build / build (pull_request) Successful in 7m41s
2023-08-16 10:07:33 +02:00
hodasemi 0480fe93f0 .gitea/workflows/pull_request.yaml aktualisiert
Some checks failed
Gavania Merge Build / build (pull_request) Failing after 1m34s
2023-08-16 10:06:08 +02:00
hodasemi a6ea41ce44 .gitea/workflows/pull_request.yaml aktualisiert
Some checks failed
Gavania Merge Build / build (pull_request) Failing after 1m40s
2023-08-16 10:03:19 +02:00
hodasemi cf63ff7235 .gitea/workflows/pull_request.yaml aktualisiert
Some checks failed
Gavania Merge Build / build (pull_request) Failing after 15m2s
2023-08-16 09:28:25 +02:00
hodasemi 18e9b32eff Add actions file
Some checks failed
Gavania Merge Build / build (pull_request) Failing after 16m59s
2023-08-16 09:05:59 +02:00
hodasemi c4d199ac4b Merge pull request 'Update from dev' (#53) from dev into master
Reviewed-on: #53
2023-08-16 09:05:10 +02:00
hodasemi aa19e7a28d Merge pull request 'Update Rust crate serde_json to 1.0.105' (#52) from renovate/serde_json-1.x into master
Reviewed-on: #52
2023-08-16 09:04:42 +02:00
hodasemi 3ff553a4de Merge pull request 'Update Rust crate anyhow to 1.0.74' (#51) from renovate/anyhow-1.x into master
Reviewed-on: #51
2023-08-16 09:02:02 +02:00
RenovateBot e12267db97 Update Rust crate serde_json to 1.0.105 2023-08-16 02:03:32 +02:00
RenovateBot 36cdd7b4cf Update Rust crate anyhow to 1.0.74 2023-08-16 02:03:25 +02:00
hodasemi 2f06eac898 Merge pull request 'Update Rust crate serde to 1.0.183' (#50) from renovate/serde-1.x into master
Reviewed-on: #50
2023-08-08 12:13:34 +02:00
RenovateBot c1598b5e45 Update Rust crate serde to 1.0.183 2023-08-08 02:03:03 +02:00
hodasemi f4448b0c67 Merge pull request 'Update Rust crate serde to 1.0.181' (#49) from renovate/serde-1.x into master
Reviewed-on: #49
2023-08-05 08:04:56 +02:00
RenovateBot 3a996a22b9 Update Rust crate serde to 1.0.181 2023-08-05 02:02:50 +02:00
hodasemi 67de09e80f Merge pull request 'Update Rust crate serde to 1.0.180' (#48) from renovate/serde-1.x into master
Reviewed-on: #48
2023-08-03 17:14:35 +02:00
RenovateBot 210f446106 Update Rust crate serde to 1.0.180 2023-08-01 02:02:53 +02:00
hodasemi b0ff05b80c Merge pull request 'Update Rust crate serde to 1.0.177' (#46) from renovate/serde-1.x into master
Reviewed-on: #46
2023-07-28 07:39:13 +02:00
RenovateBot 52dc19c1f4 Update Rust crate serde to 1.0.177 2023-07-28 02:02:50 +02:00
hodasemi 7d00606109 Merge pull request 'Update Rust crate serde_json to 1.0.104' (#47) from renovate/serde_json-1.x into master
Reviewed-on: #47
2023-07-27 10:03:31 +02:00
RenovateBot 87b3429bcc Update Rust crate serde_json to 1.0.104 2023-07-27 02:02:55 +02:00
hodasemi aee76bf3a2 Merge pull request 'Update Rust crate serde to 1.0.174' (#45) from renovate/serde-1.x into master
Reviewed-on: #45
2023-07-24 09:01:08 +02:00
RenovateBot 8e92d101e0 Update Rust crate serde to 1.0.174 2023-07-22 02:02:46 +02:00
hodasemi 1ea08b86bb Merge pull request 'Update Rust crate anyhow to 1.0.72' (#42) from renovate/anyhow-1.x into master
Reviewed-on: #42
2023-07-19 09:35:42 +02:00
RenovateBot d0e21a161b Update Rust crate anyhow to 1.0.72 2023-07-18 02:03:11 +02:00
hodasemi 770cbf1e63 Merge pull request 'Update Rust crate paste to 1.0.14' (#43) from renovate/paste-1.x into master
Reviewed-on: #43
2023-07-17 16:54:31 +02:00
hodasemi aaf7e2a9ac Merge pull request 'Update Rust crate serde_json to 1.0.103' (#44) from renovate/serde_json-1.x into master
Reviewed-on: #44
2023-07-17 16:52:52 +02:00
RenovateBot 7e46ec6a10 Update Rust crate serde_json to 1.0.103 2023-07-17 02:03:09 +02:00
RenovateBot 952c5ef057 Update Rust crate paste to 1.0.14 2023-07-16 02:03:49 +02:00
hodasemi 8c210e4da7 Merge pull request 'Update Rust crate serde_json to 1.0.102' (#41) from renovate/serde_json-1.x into master
Reviewed-on: #41
2023-07-13 08:08:31 +02:00
RenovateBot 68c3a002dc Update Rust crate serde_json to 1.0.102 2023-07-13 02:02:45 +02:00
hodasemi 54c5da4d85 Merge pull request 'Update Rust crate serde to 1.0.171' (#40) from renovate/serde-1.x into master
Reviewed-on: #40
2023-07-11 06:37:32 +02:00
RenovateBot 0588e04e53 Update Rust crate serde to 1.0.171 2023-07-11 02:03:02 +02:00
hodasemi fcbd315baa Merge pull request 'Update Rust crate serde to 1.0.167' (#39) from renovate/serde-1.x into master
Reviewed-on: #39
2023-07-07 09:09:25 +02:00
RenovateBot 199ff59f4c Update Rust crate serde to 1.0.167 2023-07-07 02:02:56 +02:00
hodasemi 2a1ea6d53a Merge pull request 'Update Rust crate paste to 1.0.13' (#36) from renovate/paste-1.x into master
Reviewed-on: #36
2023-07-05 06:28:23 +02:00
hodasemi f7dd189018 Merge pull request 'Update Rust crate serde_json to 1.0.100' (#38) from renovate/serde_json-1.x into master
Reviewed-on: #38
2023-07-05 06:28:14 +02:00
RenovateBot 2107a2db78 Update Rust crate serde_json to 1.0.100 2023-07-05 02:03:00 +02:00
RenovateBot 56c6f1fbc3 Update Rust crate paste to 1.0.13 2023-07-05 02:02:56 +02:00
hodasemi aa92e65281 Merge pull request 'Update Rust crate serde to 1.0.166' (#37) from renovate/serde-1.x into master
Reviewed-on: #37
2023-07-04 19:28:33 +02:00
RenovateBot 9f69bc10a6 Update Rust crate serde to 1.0.166 2023-07-04 02:03:12 +02:00
hodasemi 26b38bda28 Merge pull request 'Update Rust crate serde_json to 1.0.99' (#35) from renovate/serde_json-1.x into master
Reviewed-on: #35
2023-06-30 08:10:04 +02:00
RenovateBot bfb193155b Update Rust crate serde_json to 1.0.99 2023-06-25 02:03:07 +02:00
hodasemi 1aec1059d8 Merge pull request 'Update Rust crate serde to 1.0.164' (#34) from renovate/serde-1.x into master
Reviewed-on: #34
2023-06-09 12:11:34 +02:00
RenovateBot 2206af4921 Update Rust crate serde to 1.0.164 2023-06-09 02:03:06 +02:00
hodasemi 12eed9d070 Merge pull request 'Update Rust crate serde to 1.0.163' (#33) from renovate/serde-1.x into master
Reviewed-on: #33
2023-05-13 06:44:51 +02:00
RenovateBot 8059b0f588 Update Rust crate serde to 1.0.163 2023-05-12 02:02:27 +02:00
hodasemi 5d03af750b Merge pull request 'Update Rust crate serde to 1.0.162' (#32) from renovate/serde-1.x into master
Reviewed-on: #32
2023-05-06 08:09:36 +02:00
RenovateBot fc39ca6b21 Update Rust crate serde to 1.0.162 2023-05-06 02:02:27 +02:00
hodasemi a1a2a3de24 Merge pull request 'Update Rust crate anyhow to 1.0.71' (#31) from renovate/anyhow-1.x into master
Reviewed-on: #31
2023-05-01 15:31:29 +02:00
RenovateBot 2765192e4d Update Rust crate anyhow to 1.0.71 2023-04-30 02:02:52 +02:00
hodasemi 889b2f212c Fix leaderboard formatting 2023-04-20 09:10:29 +02:00
hodasemi d87ed8c0c9 Fix pedal overlay 2023-04-16 08:51:05 +02:00
hodasemi a5a3702153 Attempt to fix layer for mesa (intel) 2023-04-15 07:54:01 +02:00
hodasemi b971e0d2a6 Merge branch 'master' into dev 2023-04-13 17:13:01 +02:00
hodasemi 93109e4204 Merge pull request 'Update Rust crate serde_json to 1.0.96' (#30) from renovate/serde_json-1.x into master
Reviewed-on: #30
2023-04-13 16:26:36 +02:00
RenovateBot 60bc8cef4b Update Rust crate serde_json to 1.0.96 2023-04-13 02:02:26 +02:00
hodasemi c991b578db Merge pull request 'Update Rust crate serde to 1.0.160' (#29) from renovate/serde-1.x into master
Reviewed-on: #29
2023-04-12 07:17:52 +02:00
RenovateBot 267e3260cd Update Rust crate serde to 1.0.160 2023-04-12 02:02:40 +02:00
hodasemi 7d3f587269 Merge pull request 'Update Rust crate ringbuf to 0.3.3' (#28) from renovate/ringbuf-0.x into master
Reviewed-on: #28
2023-04-02 15:25:34 +02:00
RenovateBot 1ab6df01a0 Update Rust crate ringbuf to 0.3.3 2023-04-01 02:02:20 +02:00
hodasemi 339768f812 Merge pull request 'Update Rust crate serde_json to 1.0.95' (#26) from renovate/serde_json-1.x into master
Reviewed-on: #26
2023-03-31 10:09:27 +02:00
RenovateBot 7f7a6c92a4 Update Rust crate serde_json to 1.0.95 2023-03-31 02:02:43 +02:00
hodasemi 06290ebcff Merge pull request 'Update Rust crate serde to 1.0.159' (#27) from renovate/serde-1.x into master
Reviewed-on: #27
2023-03-30 08:31:41 +02:00
RenovateBot f43bae56eb Update Rust crate serde to 1.0.159 2023-03-29 02:02:36 +02:00
hodasemi aa0c00bf13 Merge pull request 'Update Rust crate anyhow to 1.0.70' (#24) from renovate/anyhow-1.x into master
Reviewed-on: #24
2023-03-22 11:19:55 +01:00
hodasemi 50ba0e5e8f Merge pull request 'Update Rust crate serde to 1.0.158' (#25) from renovate/serde-1.x into master
Reviewed-on: #25
2023-03-22 11:19:46 +01:00
RenovateBot 3d8f7f6635 Update Rust crate serde to 1.0.158 2023-03-22 02:02:57 +01:00
RenovateBot 12bfe71572 Update Rust crate anyhow to 1.0.70 2023-03-22 02:02:53 +01:00
hodasemi 84ef422485 Merge pull request 'Update Rust crate serde to 1.0.156' (#23) from renovate/serde-1.x into master
Reviewed-on: #23
2023-03-15 07:51:32 +01:00
RenovateBot da37ac99c1 Update Rust crate serde to 1.0.156 2023-03-15 02:02:43 +01:00
hodasemi 52a0743aed Merge pull request 'Update Rust crate serde to 1.0.155' (#22) from renovate/serde-1.x into master
Reviewed-on: #22
2023-03-13 20:59:19 +01:00
RenovateBot d02e1f3c27 Update Rust crate serde to 1.0.155 2023-03-12 02:02:21 +01:00
hodasemi ae11e61f44 Merge pull request 'Update Rust crate serde to 1.0.154' (#21) from renovate/serde-1.x into master
Reviewed-on: #21
2023-03-10 07:15:21 +01:00
RenovateBot 00b77ba1de Update Rust crate serde to 1.0.154 2023-03-09 02:02:23 +01:00
hodasemi 34a6a33b23 Merge pull request 'Update Rust crate paste to 1.0.12' (#19) from renovate/paste-1.x into master
Reviewed-on: #19
2023-03-06 07:23:31 +01:00
hodasemi d8f0451f4e Merge pull request 'Update Rust crate serde_json to 1.0.94' (#20) from renovate/serde_json-1.x into master
Reviewed-on: #20
2023-03-06 07:23:22 +01:00
RenovateBot 87be24be89 Update Rust crate serde_json to 1.0.94 2023-03-06 02:02:33 +01:00
RenovateBot d1b89c9f68 Update Rust crate paste to 1.0.12 2023-03-06 02:02:28 +01:00
hodasemi 7905957835 Use Option for api version 2023-02-22 09:38:25 +01:00
hodasemi eaff64a9d6 Add logging to get_proc_addrs 2023-02-22 09:24:28 +01:00
hodasemi 7cc1eb54e2 Add vk_handle debug infos 2023-02-21 19:31:04 +01:00
hodasemi 8b3186094d Add application info workaround 2023-02-21 19:23:10 +01:00
hodasemi 8e09841dad More logging for instance creation 2023-02-21 18:45:43 +01:00
hodasemi 8626d23f88 Add more logging 2023-02-20 10:21:33 +01:00
hodasemi 3d0c520b20 Merge pull request 'Update Rust crate serde_json to 1.0.93' (#18) from renovate/serde_json-1.x into master
Reviewed-on: #18
2023-02-12 11:54:00 +01:00
hodasemi cc1018b6a4 Merge branch 'master' into dev 2023-02-12 11:52:25 +01:00
RenovateBot 743a4f4912 Update Rust crate serde_json to 1.0.93 2023-02-09 02:02:18 +01:00
hodasemi 05fa6bd01b Merge pull request 'Update Rust crate anyhow to 1.0.69' (#16) from renovate/anyhow-1.x into master
Reviewed-on: #16
2023-02-06 17:00:42 +01:00
hodasemi 1785e9f428 Merge pull request 'Update Rust crate serde_json to 1.0.92' (#17) from renovate/serde_json-1.x into master
Reviewed-on: #17
2023-02-06 17:00:33 +01:00
RenovateBot 78399646b4 Update Rust crate serde_json to 1.0.92 2023-02-06 02:02:45 +01:00
RenovateBot 681077b65b Update Rust crate anyhow to 1.0.69 2023-02-06 02:02:39 +01:00
hodasemi b7557e0616 Use impl_reprc macro 2023-02-01 14:54:13 +01:00
hodasemi 6a1075bf13 Use impl_reprc macro 2023-02-01 14:54:13 +01:00
hodasemi 6f09839b6e Fix lib dir for makepkg 2023-01-30 15:15:52 +01:00
hodasemi f14737a2bb Fix lib dir for makepkg 2023-01-30 15:15:52 +01:00
hodasemi b4dc8b4b81 Merge pull request 'Add Fat-LTO and fix table clear' (#15) from dev into master
Reviewed-on: #15
2023-01-30 15:13:02 +01:00
hodasemi b0f722b42d Merge pull request 'Add Fat-LTO and fix table clear' (#15) from dev into master
Reviewed-on: #15
2023-01-30 15:13:02 +01:00
hodasemi 9e11312d04 Add custom profile with fat lto 2023-01-30 15:12:04 +01:00
hodasemi 5d25bad6c6 Add custom profile with fat lto 2023-01-30 15:12:04 +01:00
hodasemi 10f75c9537 Completely clear leaderboard on force update 2023-01-27 17:17:25 +01:00
hodasemi 17cd3b2df8 Completely clear leaderboard on force update 2023-01-27 17:17:25 +01:00
hodasemi 67fd07fec9 Merge pull request 'Apply repr(C) changes' (#14) from dev into master
Reviewed-on: #14
2023-01-27 14:09:19 +01:00
hodasemi e4bb7fc2b6 Merge pull request 'Apply repr(C) changes' (#14) from dev into master
Reviewed-on: #14
2023-01-27 14:09:19 +01:00
hodasemi 9e8a9d3d64 Apply repr(C) changes 2023-01-27 14:04:06 +01:00
hodasemi 2a14cd60ca Apply repr(C) changes 2023-01-27 14:04:06 +01:00
hodasemi e6e1c29647 Merge pull request 'Update to first pleasable version' (#13) from dev into master
Reviewed-on: #13
2023-01-23 21:38:51 +01:00
hodasemi 50629c15cd Update pkgbuild path in readme 2023-01-23 20:13:14 +01:00
hodasemi 6f49bbe8b5 Move resource files into their own dir 2023-01-23 19:41:51 +01:00
hodasemi 91060664c7 Fit time into column 2023-01-23 18:34:04 +01:00
hodasemi 90fd8fea7d Probable fix for time display 2023-01-23 09:14:53 +01:00
hodasemi da0cd5656a Fix config loading 2023-01-23 07:21:52 +01:00
hodasemi 1b3c553661 Check name string for allowed characters 2023-01-22 21:39:22 +01:00
hodasemi 73d99df3ab Merge pull request 'Apply vulkan-rs changes' (#9) from dev into master
Reviewed-on: #9
2023-01-22 18:29:09 +01:00
hodasemi 18d8d32af6 Fix resolve target changes 2023-01-22 18:28:17 +01:00
hodasemi 7182d73e60 Clear grid on game phase change 2023-01-21 16:50:29 +01:00
hodasemi 8b355baede Catch panic from Instance::preinitialized 2023-01-21 12:54:30 +01:00
hodasemi 058cf4c149 Merge pull request 'Update to vulkan lib changes' (#8) from dev into master
Reviewed-on: #8
2023-01-21 11:50:06 +01:00
hodasemi b88909e18c Update to vulkan lib changes 2023-01-21 11:49:43 +01:00
hodasemi b16fa030cb Merge pull request 'Multisample UI elements and filter negativ values' (#7) from dev into master
Reviewed-on: #7
2023-01-21 07:44:52 +01:00
hodasemi 56a915a863 Handle cases where gap is reported negative 2023-01-21 07:36:56 +01:00
hodasemi 47f5f9ffa8 Use multisampling for UI texture 2023-01-21 07:31:09 +01:00
hodasemi f337c3f5fc „README.md“ ändern 2023-01-20 23:21:58 +01:00
hodasemi f145378d29 Merge pull request 'Use rFactor typical angled ui elements' (#6) from dev into master
Reviewed-on: #6
2023-01-20 23:15:14 +01:00
hodasemi 52ac0952dc Add leader board config 2023-01-20 22:31:43 +01:00
hodasemi 0ff934217d Increase board entry size 2023-01-20 22:10:38 +01:00
hodasemi 65878f8120 Handle more states of drivers 2023-01-20 17:27:09 +01:00
hodasemi 544f6d765d Unify behind leader update 2023-01-20 17:21:24 +01:00
hodasemi 82b01ff056 Improve spacing 2023-01-20 17:16:07 +01:00
hodasemi 267c9aecad Add support to create colored images 2023-01-20 17:01:21 +01:00
hodasemi 5248070a0f Fix image generation 2023-01-20 16:15:19 +01:00
hodasemi 49c716e0e4 Add texture generator 2023-01-20 16:08:14 +01:00
hodasemi 8a0e94b99b Improve delta board 2023-01-20 08:14:51 +01:00
hodasemi 95e7ec72a1 Fix empty entries when reconnecting to server 2023-01-20 06:56:26 +01:00
hodasemi bd2470d7c7 Move vk layer stuff into own directory 2023-01-20 06:41:09 +01:00
hodasemi e9377e6985 „README.md“ ändern 2023-01-20 06:11:43 +01:00
hodasemi a8bf3e85d7 Add proper reset function 2023-01-20 05:49:57 +01:00
hodasemi 790fc00aaa Merge pull request 'Fix crash when 25 players are exceeded' (#5) from dev into master
Reviewed-on: #5
2023-01-20 05:30:46 +01:00
hodasemi e49bdd715e Check max size of grid 2023-01-19 18:08:13 +01:00
hodasemi 1b029f4b96 Add phase case for Testday & remove dc'd players 2023-01-19 15:36:56 +01:00
hodasemi 62a5364500 Update pkgbuild readme 2023-01-19 14:03:16 +01:00
hodasemi f28acb0174 Merge pull request 'Add GamePhase handling and DeltaBoard' (#4) from dev into master
Reviewed-on: #4
2023-01-19 13:46:51 +01:00
hodasemi 33386a1f17 highlight delta board player entry 2023-01-19 13:41:08 +01:00
hodasemi 49b450ab4f Fix typo 2023-01-19 11:40:24 +01:00
hodasemi 4f1027183d Add delta board 2023-01-19 10:23:21 +01:00
hodasemi 3f914ffdeb Leaderboard improvements 2023-01-19 07:40:16 +01:00
hodasemi eec17e1039 Add scoring update timeout 2023-01-19 07:39:34 +01:00
hodasemi 5186b96b44 Add GamePhase logic 2023-01-18 17:02:20 +01:00
hodasemi 64fab8d4e2 Merge pull request 'Merge initial implementation of Pedal and Leader Board widgets' (#3) from ui into master
Reviewed-on: #3
2023-01-18 12:50:35 +01:00
hodasemi 1d901fdbb8 Slight ui improvements 2023-01-18 12:49:04 +01:00
hodasemi 57d795f287 Include font into lib 2023-01-18 12:28:07 +01:00
hodasemi 1d2120fbd2 Use system path for font 2023-01-18 12:04:19 +01:00
hodasemi b381d6686d Update README 2023-01-18 12:00:30 +01:00
hodasemi f11eef57ac Add actual font path as comment 2023-01-18 11:54:09 +01:00
hodasemi 04bd9374a8 Add telemetry history graph 2023-01-18 11:51:16 +01:00
hodasemi bc142ba988 Restructure elements 2023-01-18 09:19:55 +01:00
hodasemi 364b1e5686 Start pedal history 2023-01-18 09:14:19 +01:00
hodasemi e6ae0e7bee Check for GamePhase 2023-01-18 08:55:43 +01:00
hodasemi edd17b3c73 Improve leaderboard 2023-01-18 08:04:47 +01:00
hodasemi 2e6072812f Add leader board 2023-01-18 07:09:44 +01:00
hodasemi da50c97958 Add font png to pkgbuild 2023-01-17 16:11:48 +01:00
hodasemi 2dc925fb16 Fix and improve pedals 2023-01-17 16:05:31 +01:00
hodasemi b449e74ca0 Add watermark 2023-01-17 15:44:11 +01:00
hodasemi dd3d9fd2f2 Refactor project for easier extension 2023-01-17 12:18:53 +01:00
hodasemi 2504d4ee24 Create gui handler 2023-01-17 07:57:56 +01:00
hodasemi 1df2f4183c Attempt at not rendering radar 2023-01-16 22:29:23 +01:00
hodasemi dcf9de54f8 Use release build from now on 2023-01-16 17:48:12 +01:00
hodasemi d7b6cfce5f Add config file info to readme 2023-01-16 17:08:57 +01:00
hodasemi 1343311ad1 Add config file 2023-01-16 17:07:39 +01:00
hodasemi cba59392ae Add pkgbuild 2023-01-16 14:52:58 +01:00
hodasemi b7547534c1 Add hackery y-flip to correct car direction 2023-01-16 07:32:32 +01:00
hodasemi 7a8476e7f7 Get transforms into the right order 2023-01-16 03:56:10 +01:00
hodasemi 0f16adaa2d Try to work with car orientation 2023-01-15 19:58:23 +01:00
hodasemi 004ec764de Add info what and where to change lib path 2023-01-15 10:48:52 +01:00
hodasemi 3e2ab4b42c Add readme and few attempts at radar fixes 2023-01-15 10:46:22 +01:00
hodasemi 7b1df782da Get something on the screen 2023-01-15 06:58:23 +01:00
hodasemi 52b6e96f83 Start implementing radar data backend 2023-01-14 20:15:43 +01:00
hodasemi 2ea249b948 Update dependency link 2023-01-14 14:27:23 +01:00
hodasemi 763e3c55e2 Add a lot of debugging noise 2023-01-14 08:08:40 +01:00
hodasemi 392c4164d6 More testing 2023-01-13 15:00:01 +01:00
hodasemi 3478425b71 Debug why there is nothing rendered 2023-01-13 09:27:58 +01:00
hodasemi ecfaa18614 Apply swapchain changes 2023-01-13 08:47:30 +01:00
hodasemi b4d53e5ec5 Start implement data reader from rfactor 2023-01-13 08:11:53 +01:00
hodasemi 793fe755a7 Add rfactor shared memory reader dependency 2023-01-12 17:50:50 +01:00
hodasemi 1289850e58 Implement working empty renderer 2023-01-12 17:45:06 +01:00
hodasemi be5a734f4b Start rendering work 2023-01-12 13:52:44 +01:00
hodasemi 0ce404b926 Create project structure for rendering 2023-01-12 10:10:09 +01:00
hodasemi 70028eb61a Start adding function entries 2023-01-12 09:17:24 +01:00
hodasemi a7469023f6 Use vk rs 2023-01-11 21:46:17 +01:00
hodasemi b49c026a05 Remove symbol files 2023-01-11 21:30:59 +01:00
hodasemi aaa0fe80cb Load symbols from vk headers 2023-01-11 18:51:31 +01:00
hodasemi b594bc3762 Load symbols from files 2023-01-11 15:03:32 +01:00
23 changed files with 643 additions and 348 deletions

View file

@ -0,0 +1,21 @@
name: Gavania Merge Build
run_name: Test successful gavania build on merge request
on:
pull_request:
types: [opened, reopened, edited, review_requested, synchronize]
jobs:
build:
steps:
- uses: https://github.com/actions/checkout@v3
- uses: https://github.com/dtolnay/rust-toolchain@stable
- name: Install dependencies
run: |
apt-get update
apt-get install --no-install-recommends -y universal-ctags glslang-tools libclang-dev
- name: Build
run: cargo build

View file

@ -1,7 +1,7 @@
{
"workbench.colorCustomizations": {
"activityBar.background": "#053607",
"titleBar.activeBackground": "#074B0A",
"titleBar.activeForeground": "#F2FEF3"
"activityBar.background": "#3F0F73",
"titleBar.activeBackground": "#5916A1",
"titleBar.activeForeground": "#FBF9FE"
}
}

View file

@ -15,9 +15,13 @@ utilities = { git = "https://gavania.de/hodasemi/utilities.git" }
rfactor_sm_reader = { git = "https://gavania.de/hodasemi/rfactor_sm_reader.git" }
ui = { git = "https://gavania.de/hodasemi/ui.git" }
anyhow = { version = "1.0.68", features = ["backtrace"] }
cgmath = { version = "0.18.0", features = ["swizzle", "serde"] }
paste = "1.0.11"
serde = "1.0.152"
serde_json = "1.0.91"
ringbuf = "0.3.2"
anyhow = { version = "1.0.86", features = ["backtrace"] }
paste = "1.0.15"
serde = "1.0.203"
serde_json = "1.0.120"
ringbuf = "0.3.3"
lazy_static = "1.5.0"
[profile.release-lto]
inherits = "release"
lto = true

View file

@ -2,5 +2,11 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
],
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
]
}

View file

@ -7,7 +7,7 @@ pkgdesc="Vulkan overlay layer for rFactor 2"
arch=('x86_64')
url="https://gavania.de/hodasemi/${_pkgbase}"
license=('GPL-3.0')
makedepends=('rust' 'ctags' 'glslang')
makedepends=('rust' 'ctags' 'glslang' 'vulkan-headers')
depends=()
conflicts=("${_pkgbase}")
source=("git+${url}")
@ -17,12 +17,12 @@ build() {
cd ${_pkgbase}
# build binaries
cargo build --release
cargo build --profile release-lto
}
package() {
# copy lib
install -Dm755 ${_pkgbase}/target/release/libvk_layer_rs.so "${pkgdir}"/usr/lib/libvk_layer_rs.so
install -Dm755 ${_pkgbase}/target/release-lto/libvk_layer_rs.so "${pkgdir}"/usr/lib/libvk_layer_rs.so
# copy layer discovery info file
install -Dm644 ${_pkgbase}/resources/rFactorOverlay.json "${pkgdir}"/usr/share/vulkan/implicit_layer.d/rFactorOverlay.json

View file

@ -1,3 +1,3 @@
# Build package for arch-based systems
* simply build it: `makepkg -fc`
* also install it directly afterwards: `makepkg -ifc`
* simply build it: `makepkg -sfc`
* also install it directly afterwards: `makepkg -isfc`

Binary file not shown.

View file

@ -5,13 +5,28 @@ use std::{
fs::{self, File, OpenOptions},
io::Write,
path::Path,
sync::{Mutex, MutexGuard},
};
use lazy_static::lazy_static;
use overlay::{Overlay, OverlayConfig};
static mut LOG_ENABLED: bool = true;
static mut LOG_FILE: String = String::new();
static mut OVERLAY: Overlay = Overlay::new();
lazy_static! {
static ref OVERLAY: Mutex<Overlay> = Mutex::new(Overlay::new());
}
pub(crate) fn overlay() -> MutexGuard<'static, Overlay> {
match OVERLAY.lock() {
Ok(overlay) => overlay,
Err(_) => {
write_log!("failed to lock OVERLAY");
write_log!(std::backtrace::Backtrace::force_capture());
panic!();
}
}
}
pub(crate) fn logging() -> bool {
unsafe { LOG_ENABLED }
@ -96,7 +111,11 @@ pub fn check_logging(home: &str) {
LOG_FILE = format!("{}/rf2_vk_hud.log", home);
}
if let Err(_) = File::create(unsafe { &LOG_FILE }) {}
if let Err(_) = OpenOptions::new()
.append(true)
.create(true)
.open(unsafe { &LOG_FILE })
{}
write_log!(" ==================================================================");
write_log!(" ======================= New Negotiation ==========================");

View file

@ -3,12 +3,11 @@ use cgmath::{ortho, vec2, Deg};
use vulkan_rs::prelude::*;
use std::{
mem,
sync::{Arc, Mutex},
time::Duration,
};
use crate::overlay::elements::PositionOnlyVertex;
use crate::overlay::elements::{ColorBuffer, PositionOnlyVertex};
pub struct BackgroundGenerator;
@ -21,16 +20,10 @@ impl BackgroundGenerator {
) -> Result<[Arc<Image>; N]> {
let max_supported_sample_count = device.max_supported_sample_count(VK_SAMPLE_COUNT_16_BIT);
let vertex_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("generator.vert.spv"),
ShaderType::Vertex,
)?;
let fragment_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("generator.frag.spv"),
ShaderType::Fragment,
)?;
let vertex_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("generator.vert.spv"))?;
let fragment_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("generator.frag.spv"))?;
Ok(image_infos
.iter()
@ -93,23 +86,7 @@ impl BackgroundGenerator {
.build(device.clone())?;
let pipeline = Pipeline::new_graphics()
.set_vertex_shader(
vertex_shader.clone(),
vec![VkVertexInputBindingDescription {
binding: 0,
stride: mem::size_of::<PositionOnlyVertex>() as u32,
inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
}],
vec![
// position
VkVertexInputAttributeDescription {
location: 0,
binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT,
offset: 0,
},
],
)
.set_vertex_shader::<PositionOnlyVertex>(vertex_shader.clone())
.set_fragment_shader(fragment_shader.clone())
.input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, false)
.default_depth_stencil(false, false)
@ -130,7 +107,7 @@ impl BackgroundGenerator {
let color_buffer = Buffer::builder()
.set_usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.set_data(&color)
.set_data(&ColorBuffer::from_array(color))
.build(device.clone())?;
let desc_pool = DescriptorPool::builder()

View file

@ -33,7 +33,7 @@ pub struct LeaderBoardEntry {
}
impl LeaderBoardEntry {
const ENTRY: &str = include_str!("leaderboard_entry.xml");
const ENTRY: &'static str = include_str!("leaderboard_entry.xml");
pub fn create_snippet(gui_handler: &Arc<GuiHandler>) -> Result<Arc<GuiSnippet>> {
GuiSnippet::from_str(gui_handler, Self::ENTRY)
@ -218,7 +218,7 @@ impl LeaderBoardEntry {
if best_lap > 60.0 {
let (full_minutes, remainder) = Self::split_minute(best_lap);
format!("{:.0}:{:.3}", full_minutes, remainder)
format!("{:.0}:{:06.3}", full_minutes, remainder)
} else {
format!("{:.3}", best_lap)
}
@ -307,5 +307,7 @@ mod test {
let behind_leader = LeaderBoardEntry::calculate_behind_leader(BehindLeader::Time(85.42));
let behind_next = LeaderBoardEntry::calculate_behind_next(150.213423);
let best_lap = LeaderBoardEntry::calculuate_best_lap(97.23436);
let t = LeaderBoardEntry::calculuate_best_lap(65.23436);
}
}

View file

@ -58,8 +58,8 @@ pub struct LeaderBoard {
}
impl LeaderBoard {
const LEADERBOARD: &str = include_str!("leaderboard_grid.xml");
const DELTABOARD: &str = include_str!("deltaboard_grid.xml");
const LEADERBOARD: &'static str = include_str!("leaderboard_grid.xml");
const DELTABOARD: &'static str = include_str!("deltaboard_grid.xml");
pub fn new(
gui_handler: &Arc<GuiHandler>,
@ -215,9 +215,8 @@ impl LeaderBoard {
.child_at(0, self.leaderboard_entries.len() - 1)?
.is_none()
{
for (i, entry) in self.leaderboard_entries.iter().enumerate() {
for i in 0..self.leaderboard_grid.dimensions().1 {
self.leaderboard_grid.detach(0, i)?;
entry.snippet().set_visibility(false)?;
}
true

View file

@ -6,12 +6,35 @@ mod watermark;
pub use leaderboard::*;
pub use pedals::*;
pub use radar::*;
use utilities::impl_reprc;
pub use watermark::*;
#[derive(Clone)]
pub struct PositionOnlyVertex {
pub position: cgmath::Vector4<f32>,
use std::mem;
use vulkan_rs::prelude::*;
impl_reprc!(
pub struct ColorBuffer {
#[assume_reprc]
c: f32,
}
);
impl ColorBuffer {
pub fn from_array<const N: usize>(a: [f32; N]) -> [Self; N] {
a.into_iter()
.map(|c| Self { c })
.collect::<Vec<Self>>()
.try_into()
.unwrap_or_else(|_: Vec<Self>| unreachable!("create array from vec from an array"))
}
}
impl_reprc!(
pub struct PositionOnlyVertex {
#[assume_reprc]
position: cgmath::Vector4<f32>,
}
);
impl PositionOnlyVertex {
///
@ -46,3 +69,25 @@ impl PositionOnlyVertex {
]
}
}
impl VertexInputDescription for PositionOnlyVertex {
fn bindings() -> Vec<vulkan_rs::prelude::VkVertexInputBindingDescription> {
vec![VkVertexInputBindingDescription {
binding: 0,
stride: mem::size_of::<PositionOnlyVertex>() as u32,
inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
}]
}
fn attributes() -> Vec<vulkan_rs::prelude::VkVertexInputAttributeDescription> {
vec![
// position
VkVertexInputAttributeDescription {
location: 0,
binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT,
offset: 0,
},
]
}
}

View file

@ -10,6 +10,7 @@ use ui::prelude::*;
use vulkan_rs::prelude::*;
use crate::overlay::{
elements::ColorBuffer,
rfactor_data::{DataReceiver, GamePhase},
UiOverlay,
};
@ -96,10 +97,10 @@ impl Pedals {
.set_descriptor_set_count(2)
.build(device.clone())?;
let brake_color_buffer: Arc<Buffer<f32>> = Buffer::builder()
let brake_color_buffer = Buffer::builder()
.set_usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.set_data(&[0.9, 0.0, 0.0, 1.0])
.set_data(&ColorBuffer::from_array([0.9, 0.0, 0.0, 1.0]))
.build(device.clone())?;
write_log!("allocate brake descriptor");
@ -107,15 +108,24 @@ impl Pedals {
let brake_descriptor = descriptor_pool.prepare_set().allocate()?;
brake_descriptor.update(&[DescriptorWrite::uniform_buffers(0, &[&brake_color_buffer])])?;
let throttle_color_buffer: Arc<Buffer<f32>> = Buffer::builder()
let throttle_color_buffer = Buffer::builder()
.set_usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.set_data(&[0.0, 0.9, 0.0, 1.0])
.set_data(&ColorBuffer::from_array([0.0, 0.9, 0.0, 1.0]))
.build(device.clone())?;
write_log!("allocate throttle descriptor");
let throttle_descriptor = descriptor_pool.prepare_set().allocate()?;
let throttle_descriptor = match descriptor_pool.prepare_set().allocate() {
Ok(d) => d,
Err(err) => {
write_log!(format!("desc alloc {:?}, {}", err, err.backtrace()));
return Err(err);
}
};
write_log!("update throttle descriptor");
throttle_descriptor.update(&[DescriptorWrite::uniform_buffers(
0,
&[&throttle_color_buffer],
@ -129,6 +139,8 @@ impl Pedals {
brake_samples.push_overwrite(0.0);
}
write_log!(format!("create vertex buffers ({icon_width})"));
let brake_vertex_buffer = Self::create_vertex_buffer(&device, icon_width as VkDeviceSize)?;
let throttle_vertex_buffer =
Self::create_vertex_buffer(&device, icon_width as VkDeviceSize)?;
@ -159,6 +171,8 @@ impl Pedals {
throttle_vertex_buffer,
};
write_log!("update vertex buffers");
me.update_vertex_buffers()?;
Ok(me)
@ -206,12 +220,12 @@ impl Pedals {
let command_buffer =
CommandBuffer::new_primary().build(self.device.clone(), self.queue.clone())?;
if self.enable {
{
let mut recorder = command_buffer.begin(VkCommandBufferBeginInfo::new(
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
| VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
))?;
if self.enable {
self.render_target
.begin(&mut recorder, VK_SUBPASS_CONTENTS_INLINE, 0);
@ -227,6 +241,7 @@ impl Pedals {
self.render_target.end(&mut recorder);
}
}
Ok(command_buffer)
}

View file

@ -1,7 +1,7 @@
use anyhow::Result;
use vulkan_rs::prelude::*;
use std::{mem, sync::Arc};
use std::sync::Arc;
use super::super::PositionOnlyVertex;
@ -17,16 +17,10 @@ impl HistoryPipeline {
width: u32,
height: u32,
) -> Result<Self> {
let vertex_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("history.vert.spv"),
ShaderType::Vertex,
)?;
let fragment_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("history.frag.spv"),
ShaderType::Fragment,
)?;
let vertex_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("history.vert.spv"))?;
let fragment_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("history.frag.spv"))?;
let descriptor_layout = DescriptorSetLayout::builder()
.add_layout_binding(
@ -59,23 +53,7 @@ impl HistoryPipeline {
};
let pipeline = Pipeline::new_graphics()
.set_vertex_shader(
vertex_shader.clone(),
vec![VkVertexInputBindingDescription {
binding: 0,
stride: mem::size_of::<PositionOnlyVertex>() as u32,
inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
}],
vec![
// position
VkVertexInputAttributeDescription {
location: 0,
binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT,
offset: 0,
},
],
)
.set_vertex_shader::<PositionOnlyVertex>(vertex_shader.clone())
.set_fragment_shader(fragment_shader.clone())
.input_assembly(VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, false)
.default_depth_stencil(false, false)

View file

@ -1,9 +1,11 @@
mod pipeline;
use anyhow::Result;
use cgmath::{ortho, vec2, vec3, vec4, Deg, InnerSpace, Matrix4, Rad, Vector2, Vector3};
use rfactor_sm_reader::*;
use serde::{Deserialize, Serialize};
use vulkan_rs::prelude::cgmath::{
ortho, vec2, vec3, vec4, Deg, InnerSpace, Matrix4, Rad, Vector2, Vector3,
};
use vulkan_rs::prelude::*;
use std::sync::{Arc, Mutex};
@ -19,7 +21,7 @@ use crate::{
write_log,
};
use super::PositionOnlyVertex;
use super::{ColorBuffer, PositionOnlyVertex};
fn convert_vec(v: rF2Vec3) -> Vector3<f32> {
vec3(v.x as f32, v.y as f32, v.z as f32)
@ -220,12 +222,13 @@ impl Radar {
let command_buffer =
CommandBuffer::new_primary().build(self.device.clone(), self.queue.clone())?;
if self.enable {
{
let mut recorder = command_buffer.begin(VkCommandBufferBeginInfo::new(
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
| VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
))?;
if self.enable {
self.render_target.begin(
&mut recorder,
VK_SUBPASS_CONTENTS_INLINE,
@ -244,6 +247,7 @@ impl Radar {
self.render_target.end(&mut recorder);
}
}
Ok(command_buffer)
}
@ -383,7 +387,7 @@ struct RadarObject {
descriptor_set: Arc<DescriptorSet>,
// uniform buffer
color_buffer: Arc<Buffer<f32>>,
color_buffer: Arc<Buffer<ColorBuffer>>,
// vertex buffer
position_buffer: Arc<Buffer<PositionOnlyVertex>>,
@ -399,7 +403,7 @@ impl RadarObject {
let color_buffer = Buffer::builder()
.set_usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
.set_memory_usage(MemoryUsage::CpuOnly)
.set_data(&color)
.set_data(&ColorBuffer::from_array(color))
.build(device.clone())?;
let position_buffer = Buffer::builder()
@ -443,7 +447,12 @@ impl RadarObject {
car_width,
car_height,
))?;
self.color_buffer.fill(&color)
self.color_buffer.fill(
&color
.iter()
.map(|&c| ColorBuffer { c })
.collect::<Vec<ColorBuffer>>(),
)
}
}

View file

@ -1,7 +1,7 @@
use anyhow::Result;
use vulkan_rs::prelude::*;
use std::{mem, sync::Arc};
use std::sync::Arc;
use super::PositionOnlyVertex;
@ -17,16 +17,10 @@ impl SingleColorPipeline {
width: u32,
height: u32,
) -> Result<Self> {
let vertex_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("single_color.vert.spv"),
ShaderType::Vertex,
)?;
let fragment_shader = ShaderModule::from_slice(
device.clone(),
include_bytes!("single_color.frag.spv"),
ShaderType::Fragment,
)?;
let vertex_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("single_color.vert.spv"))?;
let fragment_shader =
ShaderModule::from_slice(device.clone(), include_bytes!("single_color.frag.spv"))?;
let descriptor_layout = DescriptorSetLayout::builder()
.add_layout_binding(
@ -59,23 +53,7 @@ impl SingleColorPipeline {
};
let pipeline = Pipeline::new_graphics()
.set_vertex_shader(
vertex_shader.clone(),
vec![VkVertexInputBindingDescription {
binding: 0,
stride: mem::size_of::<PositionOnlyVertex>() as u32,
inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
}],
vec![
// position
VkVertexInputAttributeDescription {
location: 0,
binding: 0,
format: VK_FORMAT_R32G32B32A32_SFLOAT,
offset: 0,
},
],
)
.set_vertex_shader::<PositionOnlyVertex>(vertex_shader.clone())
.set_fragment_shader(fragment_shader.clone())
.input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, false)
.default_depth_stencil(false, false)

View file

@ -28,7 +28,7 @@ impl UiOverlay for Watermark {}
impl DataReceiver for Watermark {
fn game_phase_change(&mut self, phase: GamePhase) -> Result<()> {
match phase {
GamePhase::None => self.gui.enable()?,
GamePhase::None | GamePhase::TestDay => self.gui.enable()?,
_ => self.gui.disable()?,
}

View file

@ -9,11 +9,10 @@ mod elements;
mod rendering;
mod rfactor_data;
use anyhow::Result;
use anyhow::{bail, Result};
use assetpath::AssetPath;
use std::{
cell::RefCell,
rc::Rc,
collections::HashMap,
sync::{Arc, Mutex},
};
use ui::{guihandler::guihandler::Font, prelude::*};
@ -62,28 +61,38 @@ impl OverlayConfig {
}
}
#[derive(Debug)]
pub struct InstanceCollection {
pub instance: Arc<Instance>,
pub physical_devices: Vec<VkPhysicalDevice>,
pub device_collection: HashMap<VkDevice, DeviceCollection>,
}
#[derive(Debug)]
pub struct DeviceCollection {
pub device: Arc<Device>,
pub queues: HashMap<VkQueue, Arc<Mutex<Queue>>>,
pub swapchains: HashMap<VkSwapchainKHR, Arc<Swapchain>>,
}
pub struct Overlay {
config: OverlayConfig,
instance: Option<Arc<Instance>>,
device: Option<Arc<Device>>,
queue: Option<Arc<Mutex<Queue>>>,
pub(crate) instances: HashMap<VkInstance, InstanceCollection>,
rendering: Option<Rendering>,
gui_handler: Option<Arc<GuiHandler>>,
ui_elements: Vec<Rc<RefCell<dyn UiOverlay>>>,
ui_elements: Vec<Arc<Mutex<dyn UiOverlay>>>,
rfactor_data: Option<RFactorData>,
}
impl Overlay {
pub const fn new() -> Self {
pub fn new() -> Self {
Self {
config: OverlayConfig::new(),
instance: None,
device: None,
queue: None,
instances: HashMap::new(),
rendering: None,
gui_handler: None,
ui_elements: Vec::new(),
@ -96,28 +105,119 @@ impl Overlay {
self.config = config;
}
pub fn set_instance(&mut self, instance: Arc<Instance>) {
self.instance = Some(instance);
pub fn add_instance(&mut self, instance: Arc<Instance>) {
let physical_devices = match instance.enumerate_physical_devices() {
Ok(devices) => devices,
Err(err) => {
write_log!(format!("failed to enumerate physical devices {err:?}"));
panic!();
}
};
self.instances.insert(
instance.vk_handle(),
InstanceCollection {
instance,
physical_devices,
device_collection: HashMap::new(),
},
);
}
pub fn instance(&self) -> Arc<Instance> {
self.instance.as_ref().unwrap().clone()
pub fn remove_instance(&mut self, handle: VkInstance) {
self.instances.remove(&handle);
}
pub fn remove_device(&mut self, handle: VkDevice) {
for instance_collection in self.instances.values_mut() {
instance_collection.device_collection.remove(&handle);
}
}
pub fn instance_by_physical_device(&self, physical_device: VkPhysicalDevice) -> Arc<Instance> {
match self
.instances
.values()
.find(|collection| {
collection
.physical_devices
.iter()
.find(|&&phys_dev| phys_dev == physical_device)
.is_some()
})
.map(|collection| &collection.instance)
{
Some(instance) => instance.clone(),
None => {
write_log!(format!(
"failed to find instance with physical device ({physical_device:?})"
));
panic!();
}
}
}
pub fn set_device(&mut self, device: Arc<Device>) {
self.device = Some(device);
if let Some(instance_collection) = self
.instances
.get_mut(&device.physical_device().instance().vk_handle())
{
instance_collection.device_collection.insert(
device.vk_handle(),
DeviceCollection {
device,
queues: HashMap::new(),
swapchains: HashMap::new(),
},
);
}
}
pub fn device(&self) -> Arc<Device> {
self.device.as_ref().unwrap().clone()
fn device_collection(&self, device: VkDevice) -> &DeviceCollection {
for instance_collection in self.instances.values() {
if let Some(device_collection) = instance_collection.device_collection.get(&device) {
return device_collection;
}
}
write_log!(format!("device ({device:?}) not found"));
panic!();
}
pub fn device_collection_mut(&mut self, device: &Arc<Device>) -> &mut DeviceCollection {
if let Some(instance_collection) = self
.instances
.get_mut(&device.physical_device().instance().vk_handle())
{
if let Some(device_collection) = instance_collection
.device_collection
.get_mut(&device.vk_handle())
{
return device_collection;
}
}
write_log!(format!("device ({device:?}) not found"));
panic!();
}
pub fn device(&self, handle: VkDevice) -> Arc<Device> {
self.device_collection(handle).device.clone()
}
pub fn set_queue(&mut self, queue: Arc<Mutex<Queue>>) {
self.queue = Some(queue);
let handle = queue.lock().unwrap().vk_handle();
let device = queue.lock().unwrap().device().clone();
self.device_collection_mut(&device)
.queues
.insert(handle, queue);
}
pub fn queue(&self) -> Arc<Mutex<Queue>> {
self.queue.as_ref().unwrap().clone()
pub fn insert_swapchain(&mut self, swapchain: Arc<Swapchain>) {
self.device_collection_mut(swapchain.device())
.swapchains
.insert(swapchain.vk_handle(), swapchain);
}
pub fn swapchain(&self, swapchain: VkSwapchainKHR) -> Option<&Arc<Swapchain>> {
@ -130,14 +230,32 @@ impl Overlay {
}
}
pub fn create_rendering(&mut self, swapchain: Arc<Swapchain>) -> Result<()> {
pub fn create_rendering(&mut self, device: VkDevice) -> Result<()> {
write_log!("-> create rendering: start");
self.rendering = None;
write_log!("-> create rendering: old cleared");
let mut rendering = Rendering::new(self.queue(), swapchain.clone())?;
let device_collection = self.device_collection(device);
let device = &device_collection.device.clone();
let queue = match device_collection.queues.values().next() {
Some(queue) => queue.clone(),
None => {
write_log!(format!("failed to find queue"));
panic!();
}
};
let swapchain = match device_collection.swapchains.values().next() {
Some(swapchain) => swapchain.clone(),
None => {
write_log!(format!("failed to find swapchain"));
panic!();
}
};
let mut rendering = Rendering::new(queue.clone(), swapchain.clone())?;
write_log!("-> create rendering: new created");
@ -152,78 +270,80 @@ impl Overlay {
// provide trait required by GuiHandler
let ctx = Arc::new(ContextImpl::new(
self.device(),
self.queue(),
swapchain,
device.clone(),
queue.clone(),
swapchain.clone(),
rendering.images().clone(),
));
write_log!("create rendering: context created");
// create GuiHandler
let gui_handler = GuiHandler::new(create_info, &(ctx as Arc<dyn ContextInterface>))?;
write_log!("GuiHandler successfully created");
write_log!("create rendering: GuiHandler successfully created");
// create ui elements
// create watermark
if self.config.ui_config.enable_watermark {
let watermark = Rc::new(RefCell::new(Watermark::new(&gui_handler)?));
let watermark = Arc::new(Mutex::new(Watermark::new(&gui_handler)?));
self.ui_elements.push(watermark);
write_log!("Watermark successfully created");
write_log!("create rendering: Watermark successfully created");
}
// create radar
if self.config.ui_config.enable_radar {
let radar = Rc::new(RefCell::new(Radar::new(
let radar = Arc::new(Mutex::new(Radar::new(
self.config.radar_config,
self.device(),
self.queue(),
device.clone(),
queue.clone(),
&rendering,
)?));
rendering.add_render_callback({
let radar = radar.clone();
move |index| radar.borrow().render(index)
move |index| radar.lock().unwrap().render(index)
});
self.ui_elements.push(radar);
write_log!("Radar successfully created");
write_log!("create rendering: Radar successfully created");
}
// create pedals
if self.config.ui_config.enable_pedals {
let pedals = Rc::new(RefCell::new(Pedals::new(
let pedals = Arc::new(Mutex::new(Pedals::new(
&gui_handler,
self.device(),
self.queue(),
device.clone(),
queue.clone(),
)?));
self.ui_elements.push(pedals.clone());
rendering.add_render_callback(move |_| pedals.borrow().render());
rendering.add_render_callback(move |_| pedals.lock().unwrap().render());
write_log!("Pedals successfully created");
write_log!("create rendering: Pedals successfully created");
}
// create leaderboard
if self.config.ui_config.enable_leaderboard {
let leaderboard = Rc::new(RefCell::new(LeaderBoard::new(
let leaderboard = Arc::new(Mutex::new(LeaderBoard::new(
&gui_handler,
self.config.leader_board_config,
)?));
self.ui_elements.push(leaderboard);
write_log!("Leader Board successfully created");
write_log!("create rendering: Leader Board successfully created");
}
// add rendering callbacks
rendering.add_render_callback({
let gui_handler = gui_handler.clone();
let device = self.device();
let queue = self.queue();
let device = device.clone();
let queue = queue.clone();
move |index| {
let command_buffer =
@ -242,17 +362,22 @@ impl Overlay {
}
});
write_log!("render callbacks added");
write_log!("create rendering: render callbacks added");
self.rendering = Some(rendering);
self.gui_handler = Some(gui_handler);
self.rfactor_data = None;
write_log!("-> create rendering: end");
Ok(())
}
pub fn render(&mut self) -> Result<()> {
pub fn render(
&mut self,
wait_semaphores: &[VkSemaphore],
swapchain: &Arc<Swapchain>,
) -> Result<&Arc<Semaphore>> {
if self.rfactor_data.is_none() {
self.rfactor_data = RFactorData::new().ok();
@ -260,7 +385,7 @@ impl Overlay {
write_log!("created RFactorData");
for receiver in self.ui_elements.iter() {
data.add_receiver(receiver.clone());
data.add_receiver(receiver.clone())?;
}
}
}
@ -269,7 +394,13 @@ impl Overlay {
rfactor.update()?;
}
self.rendering.as_ref().unwrap().render()
let rendering = self.rendering.as_ref().unwrap();
if swapchain.vk_handle() != rendering.swapchain().vk_handle() {
bail!("swapchains did not match");
} else {
rendering.render(wait_semaphores)
}
}
}

View file

@ -1,10 +1,7 @@
use anyhow::Result;
use vulkan_rs::prelude::*;
use std::{
sync::{Arc, Mutex},
time::Duration,
};
use std::sync::{Arc, Mutex};
use crate::write_log;
@ -14,7 +11,10 @@ pub struct Rendering {
queue: Arc<Mutex<Queue>>,
render_callbacks: Vec<Box<dyn Fn(u32) -> Result<Arc<CommandBuffer>>>>,
signal_semaphore: Arc<Semaphore>,
fence: Arc<Fence>,
render_callbacks: Vec<Box<dyn Fn(u32) -> Result<Arc<CommandBuffer>> + Send + Sync>>,
}
impl Rendering {
@ -45,6 +45,9 @@ impl Rendering {
));
Ok(Self {
signal_semaphore: Semaphore::new(swapchain.device().clone())?,
fence: Fence::builder().build(swapchain.device().clone())?,
swapchain,
images,
@ -60,12 +63,12 @@ impl Rendering {
pub fn add_render_callback<F>(&mut self, f: F)
where
F: Fn(u32) -> Result<Arc<CommandBuffer>> + 'static,
F: Fn(u32) -> Result<Arc<CommandBuffer>> + Send + Sync + 'static,
{
self.render_callbacks.push(Box::new(f));
}
pub fn render(&self) -> Result<()> {
pub fn render(&self, wait_semaphores: &[VkSemaphore]) -> Result<&Arc<Semaphore>> {
let image_index = self.swapchain.current_index();
let command_buffers: Vec<Arc<CommandBuffer>> = self
@ -74,15 +77,34 @@ impl Rendering {
.map(|c| c(image_index))
.collect::<Result<Vec<Arc<CommandBuffer>>>>()?;
let mut submit = SubmitInfo::default().add_signal_semaphore(&self.signal_semaphore);
for command_buffer in command_buffers.iter() {
submit = submit.add_command_buffer(command_buffer);
}
for wait_semaphore in wait_semaphores {
submit = submit
.add_wait_semaphore_vk(*wait_semaphore, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
}
write_log!(format!(
"submitting {} commandbuffer(s)",
command_buffers.len()
));
write_log!(format!(
"submitting {} wait semaphore(s)",
wait_semaphores.len()
));
let queue = self.queue.lock().unwrap();
queue.minimal_submit(Duration::from_secs(10), &command_buffers)?;
self.queue
.lock()
.unwrap()
.submit(Some(&self.fence), &[submit])?;
Ok(())
write_log!("submitted layer queue");
Ok(&self.signal_semaphore)
}
pub fn images(&self) -> &Vec<Arc<Image>> {

View file

@ -2,8 +2,7 @@ use anyhow::Result;
use rfactor_sm_reader::*;
use std::{
cell::RefCell,
rc::Rc,
sync::{Arc, Mutex},
time::{Duration, Instant},
};
@ -11,7 +10,7 @@ use crate::write_log;
use super::UiOverlay;
pub trait DataReceiver {
pub trait DataReceiver: Send + Sync {
fn game_phase_change(&mut self, phase: GamePhase) -> Result<()>;
fn update_for_phase(&self, phase: GamePhase) -> bool;
@ -67,7 +66,7 @@ pub struct RFactorData {
player_id: Option<i32>,
previous_game_phase: GamePhase,
receivers: Vec<Rc<RefCell<dyn UiOverlay>>>,
receivers: Vec<Arc<Mutex<dyn UiOverlay>>>,
}
impl RFactorData {
@ -89,8 +88,15 @@ impl RFactorData {
})
}
pub fn add_receiver(&mut self, receiver: Rc<RefCell<dyn UiOverlay>>) {
pub fn add_receiver(&mut self, receiver: Arc<Mutex<dyn UiOverlay>>) -> Result<()> {
receiver
.lock()
.unwrap()
.game_phase_change(self.previous_game_phase)?;
self.receivers.push(receiver);
Ok(())
}
fn now(&self) -> f32 {
@ -101,8 +107,9 @@ impl RFactorData {
write_log!(" =================== update RFactorData ===================");
// get scoring info
match self.scoring_reader.vehicle_scoring(self.now()) {
Some((scoring_info, vehicle_scorings)) => {
if let Some((scoring_info, vehicle_scorings)) =
self.scoring_reader.vehicle_scoring(self.now())
{
self.last_scoring_read = self.start_time.elapsed();
write_log!(format!(
@ -123,7 +130,6 @@ impl RFactorData {
}
}
{
let phase = GamePhase::try_from(scoring_info.mSession)?;
if self.previous_game_phase != phase {
@ -131,38 +137,22 @@ impl RFactorData {
for receiver in self.receivers.iter() {
receiver
.borrow_mut()
.lock()
.unwrap()
.game_phase_change(self.previous_game_phase)?;
}
}
write_log!(format!("GamePhase: {:?}", self.previous_game_phase));
}
for receiver in self.receivers.iter() {
let mut rec_mut = receiver.borrow_mut();
let mut rec_mut = receiver.lock().unwrap();
if rec_mut.update_for_phase(self.previous_game_phase) {
rec_mut.scoring_update(self.previous_game_phase, &vehicle_scorings)?;
}
}
}
None => {
let now = self.start_time.elapsed();
if now > (self.last_scoring_read + GAME_PHASE_TIME_OUT) {
if self.previous_game_phase != GamePhase::None {
self.previous_game_phase = GamePhase::None;
for receiver in self.receivers.iter() {
receiver
.borrow_mut()
.game_phase_change(self.previous_game_phase)?;
}
}
}
}
}
// check telemetry data
write_log!("before telemetry update");
@ -170,7 +160,7 @@ impl RFactorData {
write_log!("new telemetry update");
for receiver in self.receivers.iter() {
let mut rec_mut = receiver.borrow_mut();
let mut rec_mut = receiver.lock().unwrap();
if rec_mut.update_for_phase(self.previous_game_phase) {
rec_mut.telemetry_update(self.player_id, &telemetries)?;

View file

@ -65,6 +65,6 @@ create_functions_enum!(
[CreateDevice, create_device],
[DestroyDevice, destroy_device],
[CreateSwapchainKHR, create_swapchain],
[AcquireNextImageKHR, acquire_next_image],
[DestroySwapchainKHR, destroy_swapchain],
[QueuePresentKHR, present_queue],
);

View file

@ -8,12 +8,9 @@ use structs::*;
use vk_handles::*;
use vulkan_rs::prelude::*;
use std::{ffi::c_void, mem, os::raw::c_char, ptr};
use std::{mem, os::raw::c_char, ptr};
static mut ACQUIRE_NEXT_IMAGE: PFN_vkAcquireNextImageKHR =
unsafe { mem::transmute(vkVoidFunction as *const c_void) };
use crate::{get_config, logging, write_log, OVERLAY};
use crate::{get_config, logging, overlay, write_log};
#[no_mangle]
#[allow(non_snake_case)]
@ -24,9 +21,7 @@ pub(crate) extern "C" fn vkNegotiateLoaderLayerInterfaceVersion(
check_logging(&home);
unsafe {
OVERLAY.set_config(get_config(&home));
}
overlay().set_config(get_config(&home));
unsafe {
*pVersionStruct = VkNegotiateLayerInterface {
@ -55,6 +50,10 @@ extern "system" fn get_device_proc_addr(
_device: VkDevice,
function_name: *const c_char,
) -> PFN_vkVoidFunction {
if cfg!(debug_assertions) {
write_log!("get_device_proc_addr");
}
let func_string = match VkString::try_from(function_name) {
Ok(func) => func,
Err(_) => {
@ -65,6 +64,10 @@ extern "system" fn get_device_proc_addr(
let s = func_string.as_str();
if cfg!(debug_assertions) {
write_log!(format!("\t{}", s));
}
if let Some(func) = Functions::get_vk_func(s) {
return func.convert();
}
@ -73,6 +76,10 @@ extern "system" fn get_device_proc_addr(
return func;
}
if cfg!(debug_assertions) {
write_log!("\t-> returning null");
}
Functions::Null.convert()
}
@ -81,6 +88,10 @@ extern "system" fn get_instance_proc_addr(
_instance: VkInstance,
function_name: *const c_char,
) -> PFN_vkVoidFunction {
if cfg!(debug_assertions) {
write_log!("get_instance_proc_addr");
}
let func_string = match VkString::try_from(function_name) {
Ok(func) => func,
Err(_) => {
@ -91,6 +102,10 @@ extern "system" fn get_instance_proc_addr(
let s = func_string.as_str();
if cfg!(debug_assertions) {
write_log!(format!("\t{}", s));
}
if let Some(func) = Functions::get_vk_func(s) {
return func.convert();
}
@ -99,6 +114,10 @@ extern "system" fn get_instance_proc_addr(
return func;
}
if cfg!(debug_assertions) {
write_log!("\t-> returning null");
}
Functions::Null.convert()
}
@ -144,6 +163,8 @@ pub(crate) extern "system" fn create_instance(
// DXVK workaround, it creates the instance twice with different properties
if ext_names.contains(&VkString::new("VK_KHR_surface")) {
write_log!("found VK_KHR_surface");
unsafe {
let panic_result =
match std::panic::catch_unwind(|| -> anyhow::Result<std::sync::Arc<Instance>> {
@ -151,7 +172,11 @@ pub(crate) extern "system" fn create_instance(
*instance,
proc_addr,
&ext_names,
(*(*create_info).pApplicationInfo).apiVersion,
if (*create_info).pApplicationInfo == ptr::null() {
None
} else {
Some((*(*create_info).pApplicationInfo).apiVersion)
},
)
}) {
Ok(panic_ok) => panic_ok,
@ -172,12 +197,14 @@ pub(crate) extern "system" fn create_instance(
}
};
OVERLAY.set_instance(ins);
overlay().add_instance(ins);
}
write_log!("-> created local instance handle");
}
write_log!("returning from create_instance");
VK_SUCCESS
}
@ -190,6 +217,7 @@ pub(crate) extern "system" fn destroy_instance(
unsafe {
if let Some(vk_fn) = vk_handles().handle("vkDestroyInstance") {
let destroy_instance: PFN_vkDestroyInstance = mem::transmute(vk_fn);
overlay().remove_instance(instance);
destroy_instance(instance, allocator);
}
@ -236,17 +264,12 @@ pub(crate) extern "system" fn create_device(
}
vk_handles_mut().load_device_functions(unsafe { *device }, proc_addr);
unsafe {
ACQUIRE_NEXT_IMAGE = match vk_handles().handle("vkAcquireNextImageKHR") {
Some(acquire_next_image) => mem::transmute(acquire_next_image),
None => {
write_log!("failed querying vkAcquireNextImageKHR");
return VK_ERROR_INITIALIZATION_FAILED;
}
};
};
let pdev = match PhysicalDevice::from_raw(unsafe { OVERLAY.instance() }, physical_device) {
let mut overlay = overlay();
let instance = overlay.instance_by_physical_device(physical_device);
let pdev = match PhysicalDevice::from_raw(instance, physical_device) {
Ok(pdev) => pdev,
Err(err) => {
write_log!(format!("failed creating physical device: {:?}", err));
@ -300,10 +323,8 @@ pub(crate) extern "system" fn create_device(
write_log!("got queue from device");
unsafe {
OVERLAY.set_device(device);
OVERLAY.set_queue(queue);
}
overlay.set_device(device.clone());
overlay.set_queue(queue);
VK_SUCCESS
}
@ -317,6 +338,7 @@ pub(crate) extern "system" fn destroy_device(
unsafe {
if let Some(vk_fn) = vk_handles().handle("vkDestroyDevice") {
let destroy_device: PFN_vkDestroyDevice = mem::transmute(vk_fn);
overlay().remove_device(device);
destroy_device(device, allocator);
}
@ -346,18 +368,44 @@ pub(crate) extern "system" fn create_swapchain(
*p_swapchain
}));
let mut overlay = overlay();
let swapchain =
match unsafe { Swapchain::from_raw(OVERLAY.device(), &*create_info, *p_swapchain) } {
Ok(swapchain) => swapchain,
Err(err) => {
write_log!(format!("create swapchain failed: {:?}", err));
return VK_ERROR_INITIALIZATION_FAILED;
unsafe { Swapchain::from_raw(overlay.device(_device), &*create_info, *p_swapchain) };
overlay.insert_swapchain(swapchain);
{
let instances = &overlay.instances;
write_log!(format!("number of instances: {}", instances.len()));
for instance_collection in instances.values() {
write_log!(format!(
"\tnumber of physical devices: {}",
instance_collection.physical_devices.len()
));
write_log!(format!(
"\tnumber of devices: {}",
instance_collection.device_collection.len()
));
for device_collection in instance_collection.device_collection.values() {
write_log!(format!(
"\t\tnumber of queues: {}",
device_collection.queues.len()
));
write_log!(format!(
"\t\tnumber of swapchains: {}",
device_collection.swapchains.len()
));
}
}
}
};
write_log!("-> created Arc<Swapchain>");
if let Err(err) = unsafe { OVERLAY.create_rendering(swapchain) } {
if let Err(err) = overlay.create_rendering(_device) {
write_log!(format!("create overlay rendering struct failed: {:?}", err));
return VK_ERROR_INITIALIZATION_FAILED;
}
@ -367,52 +415,27 @@ pub(crate) extern "system" fn create_swapchain(
VK_SUCCESS
}
pub(crate) extern "system" fn acquire_next_image(
pub(crate) extern "system" fn destroy_swapchain(
device: VkDevice,
swapchain: VkSwapchainKHR,
timeout: u64,
semaphore: VkSemaphore,
fence: VkFence,
image_index: *mut u32,
) -> VkResult {
allocator: *const VkAllocationCallbacks,
) -> () {
write_log!(" ================== vulkan layer destroy swapchain ==================");
unsafe {
match OVERLAY.swapchain(swapchain) {
Some(sc) => {
let device = OVERLAY.device();
if let Some(vk_fn) = vk_handles().handle("vkDestroySwapchainKHR") {
let destroy_swapchain: PFN_vkDestroySwapchainKHR = mem::transmute(vk_fn);
let res = device.acquire_next_image(
sc.vk_handle(),
timeout,
Some(semaphore),
Some(fence),
);
destroy_swapchain(device, swapchain, allocator);
}
write_log!(format!(
"acquire (swapchain: {:?}) res: {:?}",
sc.vk_handle(),
res
));
let mut overlay = overlay();
let device = overlay.device(device);
match res {
Ok(res) => match res {
OutOfDate::Ok(index) => {
sc.set_image_index(index);
VK_SUCCESS
}
OutOfDate::OutOfDate => VK_ERROR_OUT_OF_DATE_KHR,
OutOfDate::TimeOut => VK_TIMEOUT,
},
Err(err) => {
write_log!(format!("failed acquiring next image {:?}", err));
VK_ERROR_DEVICE_LOST
}
}
}
None => {
write_log!("acquired other swapchain image");
ACQUIRE_NEXT_IMAGE(device, swapchain, timeout, semaphore, fence, image_index)
}
}
overlay
.device_collection_mut(&device)
.swapchains
.remove(&swapchain);
}
}
@ -422,9 +445,6 @@ pub(crate) extern "system" fn present_queue(
) -> VkResult {
if logging() {
write_log!(" ================== vulkan layer queue present ==================");
write_log!(format!("iq: {:?}, cq: {:?}", queue, unsafe {
OVERLAY.queue().lock().unwrap().vk_handle()
}));
unsafe {
let swapchains = std::slice::from_raw_parts(
(*present_info).pSwapchains,
@ -436,7 +456,7 @@ pub(crate) extern "system" fn present_queue(
for swapchain in swapchains {
write_log!(format!("present swapchain: {:?}", swapchain));
if let Some(swch) = OVERLAY.swapchain(*swapchain) {
if let Some(swch) = overlay().swapchain(*swapchain) {
write_log!(format!(
" -> internal swapchain found! ({:?})",
swch.vk_handle()
@ -446,13 +466,8 @@ pub(crate) extern "system" fn present_queue(
}
}
match unsafe { OVERLAY.render() } {
Ok(_) => (),
Err(err) => {
write_log!(format!("overlay rendering failed: {:?}", err));
return VK_ERROR_DEVICE_LOST;
}
};
let mut overlay = overlay();
let wait_semaphores = unsafe { (*present_info).wait_semaphores() };
let pfn: PFN_vkQueuePresentKHR = match vk_handles().handle("vkQueuePresentKHR") {
Some(pfn) => unsafe { mem::transmute(pfn) },
@ -462,5 +477,75 @@ pub(crate) extern "system" fn present_queue(
}
};
pfn(queue, present_info)
for (index, swapchain_info) in unsafe { (*present_info).swapchain_info() }
.iter()
.enumerate()
{
if let Some(swapchain) = overlay.swapchain(swapchain_info.swapchain).cloned() {
unsafe { swapchain.set_image_index(swapchain_info.index) };
let swapchain_handle = swapchain.vk_handle();
match overlay.render(wait_semaphores, &swapchain) {
Ok(signal_semaphore) => {
let wait_semaphores = &[signal_semaphore.vk_handle()];
let swapchain_handles = &[swapchain_handle];
let indices = &[swapchain_info.index];
let mut new_present_info =
VkPresentInfoKHR::new(wait_semaphores, swapchain_handles, indices, &mut []);
new_present_info.pNext = unsafe { (*present_info).pNext };
if signal_semaphore.vk_handle() != new_present_info.wait_semaphores()[0] {
write_log!(format!(
"wait_semaphore: expected ({:?}) - found ({:?})",
signal_semaphore.vk_handle(),
new_present_info.wait_semaphores()[0],
));
}
if swapchain_handle != new_present_info.swapchain_info()[0].swapchain {
write_log!(format!(
"swapchain: expected ({:?}) - found ({:?})",
swapchain_handle,
new_present_info.swapchain_info()[0].swapchain,
));
}
if swapchain_info.index != new_present_info.swapchain_info()[0].index {
write_log!(format!(
"index: expected ({:?}) - found ({:?})",
swapchain_info.index,
new_present_info.swapchain_info()[0].index,
));
}
let res = pfn(queue, &new_present_info);
let results = unsafe { (*present_info).results() };
if results.len() > index {
results[index] = res;
}
if res != VK_SUCCESS {
write_log!(format!("queue present failed: {:?}", res));
}
}
Err(err) => {
write_log!(format!("overlay rendering failed: {:?}", err));
return VK_ERROR_DEVICE_LOST;
}
}
}
}
write_log!("finish present queue");
match unsafe { (*present_info).results() }
.iter()
.find(|&&result| result != VK_SUCCESS)
{
Some(&error) => error,
None => VK_SUCCESS,
}
}

View file

@ -2,6 +2,8 @@ use anyhow::Result;
use std::{collections::HashMap, ffi::c_void, mem, ptr};
use vulkan_rs::prelude::*;
use crate::write_log;
static mut FN_HANDLES: Option<VkTypedefHandles> = None;
pub fn vk_handles() -> &'static VkTypedefHandles {
@ -43,7 +45,13 @@ impl VkTypedefHandles {
let function = proc_addr(instance, name.as_ptr());
if mem::transmute::<PFN_vkVoidFunction, *const c_void>(function) != ptr::null() {
if cfg!(debug_assertions) {
write_log!(format!("layer (instance): successfully read: {}", symbol));
}
self.functions.insert(symbol.clone(), function);
} else {
write_log!(format!("layer (instance): failed reading {}", symbol));
}
}
}
@ -56,7 +64,13 @@ impl VkTypedefHandles {
let function = proc_addr(device, name.as_ptr());
if mem::transmute::<PFN_vkVoidFunction, *const c_void>(function) != ptr::null() {
if cfg!(debug_assertions) {
write_log!(format!("layer (device): successfully read: {}", symbol));
}
self.functions.insert(symbol.clone(), function);
} else {
write_log!(format!("layer (device): failed reading {}", symbol));
}
}
}