Buffer
type BufferType =
| Vertex
| Index
| Storage
| Image
| Uniform
BufferType is an enum, a special case of a sum type, where all possible values are symbols, also known as unit types.
type Buffer =
val type : BufferType
var object : VkBuffer
var size : u32
val offset : u64
val usage : BufferUsageFlags
Buffer is an object, stored on the heap and passed by reference. It contains five public fields. Neither field has a value assigned, which makes them constructor parameters. object and size are mutable, but only until the file ends. @mut attribute can be added to make a field mutable everywhere.
type StorageBuffer =
inherit Buffer type = BufferType/Storage
offset = 0
let device : VkDevice
let memory : VkMemory
def discard =
vk/destroy_buffer device object null
vk/free_memory device memory null
StorageBuffer inherits Buffer, passing values for its type and offset fields. object, size and usage become constructor parameters for StorageBuffer, as well as device and memory.
object StorageBuffer =
def create (instance : Instance) (size : u32) =
let device = instance.device
let usage = BufferUsageFlags/TransferSrc
| BufferUsageFlags/TransferDst
| BufferUsageFlags/StorageBuffer
let (buffer, memory) =
let flags = MemoryPropertyFlags/DeviceLocal
buffer/create instance.physical_device device
size.as<u64> usage flags
StorageBuffer object = buffer
=size =usage =device =memory
object defines a static object.
size.as<u64> is the same as size as u64, but does not require parentheses.
buffer/create function returns a tuple of two items, which is destructured into the buffer and memory bindings.
In the last expression a StorageBuffer object is created. All five constructor parameters are passed by name, four of them utilizing a shorthand notation for the case when parameter name equals the name of a value binding.