Commit Graph

1089 Commits

Author SHA1 Message Date
Thaddeus Crews
38775731e8
Merge pull request #99965 from Riteo/unstable-galore
Wayland: Add support for xdg-foreign-unstable-v2
2024-12-11 17:36:07 -06:00
Thaddeus Crews
84da7c9cf5
Merge pull request #99997 from akien-mga/mbedtls-3.6.2
mbedtls: Update to upstream 3.6.2
2024-12-11 17:35:31 -06:00
Pāvels Nadtočajevs
a8c8eca74a [Windows] Fix loading debug symbol files over 2GB. 2024-12-11 17:42:47 +02:00
Rémi Verschelde
44dfa7e710
Merge pull request #99895 from mihe/jolt-physics
Add Jolt Physics as an alternative 3D physics engine
2024-12-11 14:53:57 +01:00
Mikael Hermansson
d470c2ac6a Add Jolt Physics as an alternative 3D physics engine
Co-authored-by: Jorrit Rouwe <jrouwe@gmail.com>
2024-12-11 13:57:25 +01:00
Thaddeus Crews
66dea152b5
Merge pull request #99257 from darksylinc/matias-TheForge-pr04-excluded-ubo+render_opt
Improvements from TheForge
2024-12-10 14:15:55 -06:00
Riteo
65c28ed31d Wayland: Add support for xdg-foreign-unstable-v2
The v1 version is deprecated and bound to be removed in the future from
all compositors. This patch adds a v1/v2 designator to everything
related to the protocol and prefers the v2 protocol if both are
available.

Additionally, renames the event handler to follow the Wayland interface
name, for consistency with the rest of the codebase.
2024-12-10 01:29:46 +01:00
Matias N. Goldberg
c77cbf096b Improvements from TheForge (see description)
The work was performed by collaboration of TheForge and Google. I am
merely splitting it up into smaller PRs and cleaning it up.

This is the most "risky" PR so far because the previous ones have been
miscellaneous stuff aimed at either [improve
debugging](https://github.com/godotengine/godot/pull/90993) (e.g. device
lost), [improve Android
experience](https://github.com/godotengine/godot/pull/96439) (add Swappy
for better Frame Pacing + Pre-Transformed Swapchains for slightly better
performance), or harmless [ASTC
improvements](https://github.com/godotengine/godot/pull/96045) (better
performance by simply toggling a feature when available).

However this PR contains larger modifications aimed at improving
performance or reducing memory fragmentation. With greater
modifications, come greater risks of bugs or breakage.

Changes introduced by this PR:

TBDR GPUs (e.g. most of Android + iOS + M1 Apple) support rendering to
Render Targets that are not backed by actual GPU memory (everything
stays in cache). This works as long as load action isn't `LOAD`, and
store action must be `DONT_CARE`. This saves VRAM (it also makes
painfully obvious when a mistake introduces a performance regression).
Of particular usefulness is when doing MSAA and keeping the raw MSAA
content is not necessary.

Some GPUs get faster when the sampler settings are hard-coded into the
GLSL shaders (instead of being dynamically bound at runtime). This
required changes to the GLSL shaders, PSO creation routines, Descriptor
creation routines, and Descriptor binding routines.

 - `bool immutable_samplers_enabled = true`

Setting it to false enforces the old behavior. Useful for debugging bugs
and regressions.

Immutable samplers requires that the samplers stay... immutable, hence
this boolean is useful if the promise gets broken. We might want to turn
this into a `GLOBAL_DEF` setting.

Instead of creating dozen/hundreds/thousands of `VkDescriptorSet` every
frame that need to be freed individually when they are no longer needed,
they all get freed at once by resetting the whole pool. Once the whole
pool is no longer in use by the GPU, it gets reset and its memory
recycled. Descriptor sets that are created to be kept around for longer
or forever (i.e. not created and freed within the same frame) **must
not** use linear pools. There may be more than one pool per frame. How
many pools per frame Godot ends up with depends on its capacity, and
that is controlled by
`rendering/rendering_device/vulkan/max_descriptors_per_pool`.

- **Possible improvement for later:** It should be possible for Godot
to adapt to how many descriptors per pool are needed on a per-key basis
(i.e. grow their capacity like `std::vector` does) after rendering a few
frames; which would be better than the current solution of having a
single global value for all pools (`max_descriptors_per_pool`) that the
user needs to tweak.

 - `bool linear_descriptor_pools_enabled = true`

Setting it to false enforces the old behavior. Useful for debugging bugs
and regressions.
Setting it to false is required when workarounding driver bugs (e.g.
Adreno 730).

A ridiculous optimization. Ridiculous because the original code
should've done this in the first place. Previously Godot was doing the
following:

  1. Create a command buffer **pool**. One per frame.
  2. Create multiple command buffers from the pool in point 1.
3. Call `vkBeginCommandBuffer` on the cmd buffer in point 2. This
resets the cmd buffer because Godot requests the
`VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT` flag.
  4. Add commands to the cmd buffers from point 2.
  5. Submit those commands.
6. On frame N + 2, recycle the buffer pool and cmd buffers from pt 1 &
2, and repeat from step 3.

The problem here is that step 3 resets each command buffer individually.
Initially Godot used to have 1 cmd buffer per pool, thus the impact is
very low.

But not anymore (specially with Adreno workarounds to force splitting
compute dispatches into a new cmd buffer, more on this later). However
Godot keeps around a very low amount of command buffers per frame.

The recommended method is to reset the whole pool, to reset all cmd
buffers at once. Hence the new steps would be:

  1. Create a command buffer **pool**. One per frame.
  2. Create multiple command buffers from the pool in point 1.
3. Call `vkBeginCommandBuffer` on the cmd buffer in point 2, which is
already reset/empty (see step 6).
  4. Add commands to the cmd buffers from point 2.
  5. Submit those commands.
6. On frame N + 2, recycle the buffer pool and cmd buffers from pt 1 &
2, call `vkResetCommandPool` and repeat from step 3.

**Possible issues:** @dariosamo added `transfer_worker` which creates a
command buffer pool:

```cpp
transfer_worker->command_pool =
driver->command_pool_create(transfer_queue_family,
RDD::COMMAND_BUFFER_TYPE_PRIMARY);
```

As expected, validation was complaining that command buffers were being
reused without being reset (that's good, we now know Validation Layers
will warn us of wrong use).
I fixed it by adding:

```cpp
void RenderingDevice::_wait_for_transfer_worker(TransferWorker
*p_transfer_worker) {
	driver->fence_wait(p_transfer_worker->command_fence);
	driver->command_pool_reset(p_transfer_worker->command_pool); //
! New line !
```

**Secondary cmd buffers are subject to the same issue but I didn't alter
them. I talked this with Dario and he is aware of this.**
Secondary cmd buffers are currently disabled due to other issues (it's
disabled on master).

 - `bool RenderingDeviceCommons::command_pool_reset_enabled`

Setting it to false enforces the old behavior. Useful for debugging bugs
and regressions.

There's no other reason for this boolean. Possibly once it becomes well
tested, the boolean could be removed entirely.

Adds `command_bind_render_uniform_sets` and
`add_draw_list_bind_uniform_sets` (+ compute variants).

It performs the same as `add_draw_list_bind_uniform_set` (notice
singular vs plural), but on multiple consecutive uniform sets, thus
reducing graph and draw call overhead.

 - `bool descriptor_set_batching = true;`

Setting it to false enforces the old behavior. Useful for debugging bugs
and regressions.

There's no other reason for this boolean. Possibly once it becomes well
tested, the boolean could be removed entirely.

Godot currently does the following:

 1. Fill the entire cmd buffer with commands.
 2. `submit()`
    - Wait with a semaphore for the swapchain.
- Trigger a semaphore to indicate when we're done (so the swapchain
can submit).
 3. `present()`

The optimization opportunity here is that 95% of Godot's rendering is
done offscreen.
Then a fullscreen pass copies everything to the swapchain. Godot doesn't
practically render directly to the swapchain.

The problem with this is that the GPU has to wait for the swapchain to
be released **to start anything**, when we could start *much earlier*.
Only the final blit pass must wait for the swapchain.

TheForge changed it to the following (more complicated, I'm simplifying
the idea):

 1. Fill the entire cmd buffer with commands.
 2. In `screen_prepare_for_drawing` do `submit()`
    - There are no semaphore waits for the swapchain.
    - Trigger a semaphore to indicate when we're done.
3. Fill a new cmd buffer that only does the final blit to the
swapchain.
 4. `submit()`
    - Wait with a semaphore for the submit() from step 2.
- Wait with a semaphore for the swapchain (so the swapchain can
submit).
- Trigger a semaphore to indicate when we're done (so the swapchain
can submit).
 5. `present()`

Dario discovered this problem independently while working on a different
platform.

**However TheForge's solution had to be rewritten from scratch:** The
complexity to achieve the solution was high and quite difficult to
maintain with the way Godot works now (after Übershaders PR).
But on the other hand, re-implementing the solution became much simpler
because Dario already had to do something similar: To fix an Adreno 730
driver bug, he had to implement splitting command buffers. **This is
exactly what we need!**. Thus it was re-written using this existing
functionality for a new purpose.

To achieve this, I added a new argument, `bool p_split_cmd_buffer`, to
`RenderingDeviceGraph::add_draw_list_begin`, which is only set to true
by `RenderingDevice::draw_list_begin_for_screen`.

The graph will split the draw list into its own command buffer.

 - `bool split_swapchain_into_its_own_cmd_buffer = true;`

Setting it to false enforces the old behavior. This might be necessary
for consoles which follow an alternate solution to the same problem.
If not, then we should consider removing it.

PR #90993 added `shader_destroy_modules()` but it was not actually in
use.

This PR adds several places where `shader_destroy_modules()` is called
after initialization to free up memory of SPIR-V structures that are no
longer needed.
2024-12-09 11:49:28 -03:00
Jakub Marcowski
2481632b3c
thorvg: Regenerate and apply patches 2024-12-07 13:11:37 +01:00
Thaddeus Crews
4b91e98656
Merge pull request #99959 from fire/vsk-csg-error-and-ctd
Print better manifold errors and avoid crash on non manifold csg input.
2024-12-05 14:12:25 -06:00
Thaddeus Crews
b34a643404
Merge pull request #96346 from DeeJayLSP/qoa-opt
Use `qoa.c` and custom compress procedure
2024-12-05 14:12:15 -06:00
Thaddeus Crews
30b32396de
Merge pull request #100053 from bruvzg/font_change
Change default Arabic font to Vazirmatn.
2024-12-05 14:12:14 -06:00
Thaddeus Crews
49e033f8e2
Merge pull request #100047 from MBCX/fix-freebsd-compilation
Make Godot compile on `FreeBSD`
2024-12-05 14:12:11 -06:00
Thaddeus Crews
ec7ffdcb15
Merge pull request #100008 from Chubercik/thorvg-0.15.5
thorvg: Update to 0.15.5
2024-12-05 14:11:50 -06:00
Thaddeus Crews
755f600173
Merge pull request #99999 from akien-mga/ufbx-0.15.0
ufbx: Update to upstream 0.15.0
2024-12-05 14:11:46 -06:00
MBCX
6bc80effbb Make Godot compile on FreeBSD 2024-12-05 12:33:55 -04:00
DeeJayLSP
afd68d785b Use qoa.c and custom compress procedure 2024-12-05 13:20:09 -03:00
Pāvels Nadtočajevs
06cae04b87 Change default Arabic font to Vazirmatn. 2024-12-05 16:26:52 +02:00
Jakub Marcowski
5318008ce6
thorvg: Update to 0.15.5 2024-12-04 17:24:43 +01:00
K. S. Ernest (iFire) Lee
6cf1d3c13e Print better manifold errors and avoid crash on non manifold csg input.
* Manifold does not have a snap property.
* Tolerance means simplification amount.
* CSG snap has been removed
* Add better error messages.
* Verbose print manifold meshgl64 properties as json.
* Update manifold for error fixes
2024-12-03 20:19:47 -08:00
Rémi Verschelde
4051b43879
ufbx: Update to upstream 0.15.0 2024-12-04 02:19:04 +01:00
Rémi Verschelde
56922db85b
mbedtls: Update to upstream 3.6.2 2024-12-04 02:14:05 +01:00
Pāvels Nadtočajevs
84650f2018 Implement DisplayServer.beep. 2024-12-03 12:43:26 +02:00
Rémi Verschelde
d14672863b
Merge pull request #99556 from ArchercatNEO/miniupnpc-include
Fix broken includes when compiling with `builtin_miniupnpc=false`
2024-11-29 22:02:10 +01:00
Rémi Verschelde
c814493e95
Merge pull request #94321 from fire/vsk-csg-manifold-update-4.3
Fix mesh corruption of CSG by using elalish/manifold
2024-11-29 22:01:44 +01:00
K. S. Ernest (iFire) Lee
fda444bb01 Add csg boolean operators using elalish/manifold.
Uses MeshGL64 for more floating point precision.

Co-Authored-By: 31 <31eee384@gmail.com>
Co-Authored-By: Claudio Z <120678869+cloudofoz@users.noreply.github.com>
2024-11-28 06:26:52 -08:00
ArchercatNEO
84bf1cc7ac Fix broken includes when compiling with builtin_miniupnpc=false
Fixes #99196
Supersedes #99218
2024-11-27 15:37:54 +00:00
Jakub Marcowski
1bd52fed76
clipper2: Update to 1.4.0 2024-11-26 17:23:06 +01:00
Yevhen Babiichuk (DustDFG)
b607997bfc Delete unused files of thirparty libs (zlib, mbedtls)
Signed-off-by: Yevhen Babiichuk (DustDFG) <dfgdust@gmail.com>
2024-11-07 18:54:57 +02:00
Rémi Verschelde
eb41ff0fee
certs: Sync with Mozilla bundle as of Oct 19, 2024
4d3fe6683f

Document matching mozilla-release changeset.
2024-11-05 20:42:42 +01:00
Thaddeus Crews
0a2a259ad5
Merge pull request #98771 from stuartcarnie/update_smolv
smol-v: update to 2024 to support SPIR-V 1.6
2024-11-04 21:51:59 -06:00
David Snopek
09e09d9335 Patch the OpenXR headers to get EGL from GLAD if we're using it 2024-11-04 10:43:07 -06:00
Stuart Carnie
dd8582a319
smol-v: update to 2024 to support SPIR-V 1.6 2024-11-03 07:14:16 +11:00
Thaddeus Crews
49cf7996e1
Merge pull request #98496 from bruvzg/icu761
Update ICU to 76.1
2024-10-29 19:25:49 -05:00
Clay John
748f4079e3
Merge pull request #96439 from darksylinc/matias-TheForge-pr03-rebased
Add Swappy & Pre-Transformed Swapchain
2024-10-29 12:34:40 -07:00
Matias N. Goldberg
aaa0e2fddf Add Swappy & Pre-Transformed Swapchain
- Adds Swappy for Android for stable frame pacing
- Implements pre-transformed Swapchain so that Godot's compositor is in
charge of rotating the screen instead of Android's compositor
(performance optimization for phones that don't have HW rotator)

============================

The work was performed by collaboration of TheForge and Google. I am
merely splitting it up into smaller PRs and cleaning it up.

Changes from original PR:

- Removed "display/window/frame_pacing/android/target_frame_rate" option
to use Engine::get_max_fps instead.
- Target framerate can be changed at runtime using Engine::set_max_fps.
- Swappy is enabled by default.
- Added documentation.
- enable_auto_swap setting is replaced with swappy_mode.
2024-10-28 18:55:37 -03:00
Arseny Kapoulkine
e2cc0e484e Update meshoptimizer to 0.22
The Godot-specific patch is just a single line now; removing this patch
will likely require adjusting Godot importer code to handle error limits
better.

This also adds new SIMPLIFY_ options; Godot is currently not using any
of these but might use SIMPLIFY_PRUNE and SIMPLIFY_SPARSE in the future.
2024-10-26 07:26:07 -07:00
bruvzg
e698870caa
Update ICU to 76.1 2024-10-24 22:47:59 +03:00
Thaddeus Crews
56ed76a372
Merge pull request #97582 from BlueCube3310/basisu-hdr
BasisU: Update to 1.50.0 and add HDR support
2024-10-14 14:09:57 -05:00
Thaddeus Crews
a1e768c508
Merge pull request #97295 from BlueCube3310/betsy-bc4
Betsy: Implement BC4 compression
2024-10-14 14:09:56 -05:00
BlueCube3310
200ed0971a BasisU: Update to 1.50.0 and add HDR support 2024-10-12 18:02:44 +02:00
Rémi Verschelde
991b741f6c
Merge pull request #97677 from bruvzg/hb1001
Update HarfBuzz to 10.0.1
2024-10-02 15:01:23 +02:00
Rémi Verschelde
dec83d5088
Merge pull request #97611 from BlueCube3310/bcdec-update
Update bcdec to latest version
2024-10-01 17:31:24 +02:00
bruvzg
b6a369de79
Update HarfBuzz to 10.0.1 2024-10-01 08:20:45 +03:00
Gergely Kis
146ba4106f Move Vulkan includes to a central godot_vulkan.h header
Also fixes Vulkan build problem with recent Clang.
2024-09-29 17:53:18 +02:00
BlueCube3310
529897cb0c Update bcdec to latest version 2024-09-29 10:25:48 +02:00
Rémi Verschelde
422306ef87
Merge pull request #97325 from BlueCube3310/bcdec
Replace squish with bcdec for BC decompression
2024-09-29 00:47:02 +02:00
Bastiaan Olij
e0478fe3a3 Update thirdparty OpenXR to 1.1.41 2024-09-27 14:34:43 +10:00
Fabio Alessandrelli
8ffb7699af [mbedTLS] Enable TLS 1.3 support
Move library initialization to module registration functions.

Only set library debug threshold when verbose output is enabled.

TLSv1.3 functions seems to be a bit more verbose then expected, and
generate a lot of noise. Yet, some level of debugging without
recompiling the engine would be nice. We should discuss this upstream.
2024-09-26 17:37:38 +02:00
BlueCube3310
2167157aaf Replace squish with bcdec for BC decompression 2024-09-26 14:42:54 +02:00