The sky rotation now affects the baked environment lighting as it should,
making it match how real-time ambient light rendering works.
Co-authored-by: Per Melin <git@melin.net>
(cherry picked from commit 661cf1f351)
This fixes a rare but possible deadlock, maybe due to undefined behavior. The new implementation is safer, at the cost of some added boilerplate.
(cherry picked from commit f4d76853b9)
1. Make handling of user tokens atomic:
Loads started with the external-facing API used to perform a two-step setup of the user token. Between both, the mutex was unlocked without its reference count having been increased. A non-user-initiated load could therefore destroy the load task when it unreferenced the token.
Those stages now happen atomically so in the one hand, the described race condition can't happen so the load task life insurance doesn't have a gap anymore and, on the other hand, the ugliness that the call to load could return `ERR_BUSY` if happening while other thread was between both steps is gone.
The code has been refactored so the user token concerns are still outside the inner load start function, which is agnostic to that for a cleaner implementation.
2. Clear ambiguity between load operations running on `WorkerThreadPool`:
The two cases are: single-loaded thread directly started by a user pool task and a load started by the system as part of a multi-threaded load.
Since ensuring all the code dealing with this distinction would make it very complex, and error-prone, a different measure is applied instead: just take one of the cases out of the dicotomy. We now ensure every load happening on a pool thread has been initiated by the system.
The way of achieving that is that a single-threaded user-started load initiated from a pool thread, is run as another task.
(cherry picked from commit df23858488)
Benefits:
- Simpler code. The main load function is renamed so it's apparent that it's not just a thread entry point anymore.
- Cache and thread modes of the original task are honored. A beautiful consequence of this is that, unlike formerly, re-issued loads can use the resource cache, which makes this mechanism much more performant.
- The newly added getter for caller task id in WorkerThreadPool allows to remove the custom tracking of that in ResourceLoader.
- The check to replace a cached resource and the replacement itself happen atomically. That fixes deadlock prevention leading to multiple resource instances of the same one on disk. As a side effect, it also makes the regular check for replace load mode more robust.
(cherry picked from commit 28619e26cf)
This release turned out to be a massive one, exceeding our original
plans for the development cycle, but for good reasons to address many
critical issues that users identified since the 4.0 release.
The user experience should be much stabler and more polished than in
previous releases, with less obscure and game or workflow-breaking
bugs. And of course the feature set kept increasing with a number of
highly awaited improvements to all engine areas.
We have close to 3500 commits in this release, twice as many as 4.2!
More than 500 contributors were involved in this new feature release,
and we want to thank them all for their amazing contributors, as well
as all users who sponsor the Development Fund, reported bugs, opened
proposals, or supported each other on our community platforms.