### 🚧 Warning this library is not ready for production use 🚧
Bugs need to be fixed, and the API could change
a lot in the coming weeks.
Any feedback is appreciated!
# Overview
`quickgpu` wraps the `wgpu` API
allowing users to write shorter,
clearer Rust graphics code.
It consists mainly
of builders for `wgpu` structs.
As a wrapper library,
`quickgpu` doesn't manage or own
any state after
a builder is done building.
There's no need to convert
all of your code to `quickgpu`,
you can just use it where it's helpful.
For an example of the library in use,
take a look at [/example/src/scene.rs](/example/src/scene.rs)
## Architecture
This repo is split up into:
- [/quickgpu](/quickgpu)
The user-facing crate
which wraps wgpu APIs.
The main code here is generated by the other,
non-user-facing crates.
- [/example](/example)
An example of using quickgpu
in an app.
- [/bunnymark](/bunnymark)
Quick port of wgpu bunnymark
to make sure performance is comparable.
- [/xtask](/xtask)
Code which generates
he quickgpu bindings
using `syn` and other tools.
Also includes scripts
or building and releasing new code.
- [/discover_exports](/discover_exports)
An experimental library
or helping to resolve exports from a crate,
type aliases, etc, to help with code generation.
`discover_exports` isn't a general solution,
it only has the features needed for this project.
Lots of assumptions,
unnecessary use of `clone`,
and inefficient algrorithms.
However, this crate is not a user-facing part
of `quickgpu`, it just helps generates the bindings.
### Tech Decisions
- **All structs** `quickgpu`'s goal is that for any `wgpu` struct `SomeStruct`, as long at doesn't contain private fields, you can use a builder by typing `some_struct()`. This means even structs with zero or one fields have builders. This way developers don't have to memorize which structs have builders.
- **Custom builders** For most of quickgpu's development, quickgpu used the excellent `bon` to generate builders. However, figuring out some tricky issues involving trait bounds etc made me realize it would be quicker to write custom builders for now. I'm happy to discuss going back to using a builder library though.
- **Nested trait** Nested builders shouldn't need to call `build()`, so all builders implement a custom `Nested` trait. This was chosen over using `Into`, so quickgpu doesn't need to worry about implications of other `Into` conversions unrelated to nested builders.
### Next steps
- More tests and benchmarks to ensure `quickgpu` has minimal cost over `wgpu`
- Better code documentation
- Better docs for defaults. Best case, the user would be able to see the actual default value rather than `Default::default()`
- Better support for fields that take slices. For example, render pass `attachments` could be exposed as an `attachment` method that can be called multiple times, similar to how you can call std `Command` `args` once, or you can call `arg` multiple times.
- Add convenience methods beyond simple builders