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.