Only two unsafe functions were used internally:
- `slice::from_raw_parts`
- `Box::from_raw`
The safety messages are adapted from the safety messages of these functions.
448: Fix framebuffers not always being cleaned up if invalid r=kvark a=LaylConway
This changes framebuffers to be cleaned up if only one view is cleaned up, instead of if all views are cleaned up. This is necessary because currently, at least for me, swapchain images will have a different view every frame. This means that if other views continue to exist between frames, the resulting framebuffers will never be cleaned up.
Fixes#447
Co-authored-by: Layl <2385329-layl@users.noreply.gitlab.com>
449: Fix missing memory release r=kvark a=zakorgy
This fixes the issue where the underlying memory of buffers and textures not released when calling `Global::delete`.
cc @kvark
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/gfx-rs/wgpu/449)
<!-- Reviewable:end -->
Co-authored-by: Zakor Gyula <gyula.zakor@h-lab.eu>
PowerPreference::Default will now prefer discrete GPUs
when on AC power and will prefer integrated GPUs while
on battery power (i.e. the battery is discharging).
439: Refactor usage tracking to be truly sparse r=dependency a=kvark
~~This is a required step towards #438 . We want to be tracking the usage by only having resource IDs around, not resources themselves. So we aren't going to have access to `full_selector`.~~
It's also streamlining some of the verbose parts of the internal API for usage tracking.
It also uses `SmallVec` for the texture tracker ranges, essentially making it lightweight for most cases (where the layer count is 1).
Compromises:
- removes `SEPARATE_DEPTH_STENCIL_STATES` support. It's not in the near future to enable it anyway.
Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
427: Rewrite of the resource lifetime tracking r=crossed-fingers a=kvark
Addresses this TODO item in `triage_referenced()`:
> //TODO: lock less, if possible
Now, also fixes#428
Pros:
- only locking the storages that need to be, and only for the duration of their cleanup
- less run-time branching, more predefined code paths, which may lead to better cache utilization (thinking of both instruction and data cache here)
- more consistent use of `Stored` type
Cons:
- a bit of verbosity / code duplication in `triage_referenced()`. In particular, the code that finds where to register an unreferenced resource, it used to be unified for all resources.
---
@grovesNL this should be reviewable on a commit basis. The high-level breakdown of changes is:
1. Switch from enum of resource types to structure of arrays for the matter of lifetime tracker
2. Rename the involved structures to better reflect what they do (the old `PendingResources` was bad)
3. Separate lifetime tracking into a sub-module
4. Make `RefCount` in objects optional, getting the semantics of "user needs it" when `Some`.
5. Rewrite the first stage of lifetime tracking: instead of permanently staging resources that the user doesn't need, and adding strong refcounts to them, we only populate it temporarily with anything that gets the refcount reduced. This means less overhead for `maintain()` at an increased risk of leaking some stuff (depends on our code quality).
6. Consequently, device tracker becomes the main (and last) owner of all the resources.
Overall, it's a major change and risk. I tested on `vange-rs` (which I consider to be the most complex wgpu-rs app) with Vulkan validation enabled, and it seems all to be working good now.
Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
442: Fix cmd buffer cleanup not always using lowest active index r=kvark a=LaylConway
This fixes the index picked for cleanup not always being the lowest index.
Additionally this fixes command buffers not being cleaned up if there are no active submissions, because in that case 0 would be picked, which resulted in nothing being cleaned up. Now instead if there are no active submissions, usize MAX will be picked.
Fixes#441
Co-authored-by: Layl <2385329-layl@users.noreply.gitlab.com>
431: Expose FFI for creating wayland surface on wgpu-native r=kvark a=segfault87
* Added `wgpu_create_surface_from_wayland()` for creating Wayland surface from C side.
* Updated FFI header and `examples/triangle` example accordingly.
Co-authored-by: Park Joon-Kyu <segfault87@gmail.com>
429: Defer command buffer recycling until allocate r=kvark a=LaylConway
As discussed on Matrix, this change defers command buffer recycling until allocation.
This lets a rendering thread clean up its own command buffers, making sure only the owning thread accesses anything from its command pool.
I have also added a TODO comment about cleaning up thread pools, which currently isn't happening as far as I can tell. This previously was an issue as well but now is a slightly bigger one as the command buffer wouldn't get recycled either.
I figured that, for now, fixing that issue is out of the scope of this PR. This PR focuses only on resolving the race condition causing the validation error.
This fixes#423
Co-authored-by: Layl <2385329-layl@users.noreply.gitlab.com>