mirror of
https://github.com/vulkano-rs/vulkano.git
synced 2024-11-25 16:25:31 +00:00
Start working on FEATURES.md
This commit is contained in:
parent
4ae0c4541a
commit
7bd2b6e3c9
116
FEATURES.md
Normal file
116
FEATURES.md
Normal file
@ -0,0 +1,116 @@
|
||||
# Differences between Vulkan and vulkano
|
||||
|
||||
This page lists the features that vulkano brings over Vulkan, and the design decisions of vulkano
|
||||
that you have to be aware of compared to Vulkan.
|
||||
|
||||
## Arcs usage
|
||||
|
||||
If you use vulkano, you quickly notice that all `Foo::new` functions return an `Arc<Foo>` instead
|
||||
of a `Foo`.
|
||||
|
||||
Take this code for example:
|
||||
|
||||
```rust
|
||||
pub struct SpriteDrawSystem<R> {
|
||||
cb: Arc<SecondaryGraphicsCommandBuffer<R>>,
|
||||
}
|
||||
|
||||
impl<R> SpriteDrawSystem<R> {
|
||||
pub fn new(queue: &Arc<Queue>, subpass: Subpass<R>) -> SpriteDrawSystem<R> {
|
||||
.. build the descriptor set layouts ..
|
||||
.. build the descriptor pool ..
|
||||
.. build the pipeline layout ..
|
||||
.. build the descriptor sets ..
|
||||
.. build the shader modules ..
|
||||
.. build the pipeline ..
|
||||
.. build the command buffer ..
|
||||
|
||||
SpriteDrawSystem { cb: .. }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn draw(&self, out: PrimaryCommandBufferBuilderSecondaryDraw<R>)
|
||||
-> PrimaryCommandBufferBuilderSecondaryDraw<R>
|
||||
{
|
||||
out.execute_commands(&self.cb)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Buffer strong typing
|
||||
|
||||
In vulkano, buffers are strongly-typed. For example, creating an index buffer is done like this:
|
||||
|
||||
```rust
|
||||
use vulkano::buffer::Buffer;
|
||||
use vulkano::buffer::Usage as BufferUsage;
|
||||
use vulkano::memory::DeviceLocal;
|
||||
|
||||
let index_buffer = Buffer::<[u16], _>::array(&device, 128 /* number of elements */,
|
||||
&BufferUsage::all(), DeviceLocal, &queue).unwrap();
|
||||
```
|
||||
|
||||
Notice that we explicitely tell vulkano that the content of the buffer is of type `[u16]`.
|
||||
|
||||
## Image strong typing
|
||||
|
||||
Just like buffers, images also use strong typing.
|
||||
|
||||
## Choosing between compile-time checks and runtime checks
|
||||
|
||||
Whenever you build a render pass, you have to pass an object that describes the layout of the
|
||||
render pass.
|
||||
|
||||
## Keeping command buffers alive
|
||||
|
||||
In Vulkan, care must be taken to not destroy command buffers that are still in use by the GPU.
|
||||
In vulkano, submitting a command buffer to a queue returns a `Submission` object that holds
|
||||
an `Arc` to the command buffer that has been submitted. Destroying this object will block
|
||||
until it is known that the command buffer is no longer in use.
|
||||
|
||||
The best way to deal with `Submission` objects is to store them in a `Vec`. You can either return
|
||||
the `Submission` objects from functions that produce them, and then store them all on the stack
|
||||
around your main loop. Or you can store the objects within another long-lived object, for example
|
||||
in your `Scene` or your `SpritesDrawingSystem`.
|
||||
|
||||
If you keep pushing submission objects in your `Vec` you will ultimately run out of memory.
|
||||
Cleaning the objects that are no longer needed can be done like this:
|
||||
|
||||
```rust
|
||||
submissions.retain(|s| !s.destroying_would_block());
|
||||
```
|
||||
|
||||
## Buffers and images queue ownership
|
||||
|
||||
Whenver you create a buffer or an image with Vulkan, you have to explicitely tell the driver
|
||||
whether the buffer or image is in *exclusive mode* or in *shared mode*.
|
||||
|
||||
Exclusive mode means that one queue family will have ownership of the image or buffer. You
|
||||
don't need to tell Vulkan which queue family it is, as the first queue that uses the resource
|
||||
will be considered as having the ownership. The ownership of a resource can be changed by
|
||||
submitting a command buffer with a barrier command to both the old owner and the new owner.
|
||||
|
||||
Shared mode means that the resource can be used simultaneously by multiple queue families.
|
||||
If you use this mode, you have to tell Vulkano which queue families can use it.
|
||||
|
||||
In vulkano you can also choose between exclusive and shared, but in exclusive mode you have
|
||||
to specify which queue family is the owner.
|
||||
|
||||
## Image layouts
|
||||
|
||||
In the Vulkan API, each subresource (ie. mipmap or array level) of an image has a specific
|
||||
layout: color-attachment-optimal, transfer-source-optimal, shader-read-only-optimal, etc.
|
||||
Despite the fact that their names contain `optimal`, switching to the correct layout is
|
||||
mandatory. For example, you must transition an image to the color attachment layout before
|
||||
using an image as a color attachment. Transitionning an image must be done with a barrier
|
||||
command in a command buffer.
|
||||
|
||||
This is handled automatically by vulkano. Vulkano, however, has no way of knowing in which
|
||||
order the command buffers you build will be submitted. To solve this problem it has to use a
|
||||
trick: images have a default layout.
|
||||
|
||||
Whenever you create an image, you have to specify in which layout it is going to be used the
|
||||
most. If then you use that image in a way that corresponds to the layout you specified, vulkano
|
||||
won't perform any layout transition. However if you use the image in another way, vulkano
|
||||
will perform a layout transition to the required layout, then back to the default layout at
|
||||
the end of the command buffer.
|
@ -2,7 +2,9 @@
|
||||
|
||||
*Warning: this library breaks every five minutes for the moment.*
|
||||
|
||||
## [Documentation](http://tomaka.github.io/vulkano/vulkano/index.html)
|
||||
## [Documentation](http://tomaka.github.io/vulkano/vulkano/index.tml)
|
||||
|
||||
## [Differences between Vulkan and vulkano](FEATURES.md)
|
||||
|
||||
This repository contains three libraries:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user