Buffer

type BufferType =
    | Vertex
    | Index
    | Storage
    | Image
    | Uniform

BufferType это перечисление, частный случай типа-суммы, в котором все возможные значения являются символами, также известными как единичные типы.

type Buffer =
    val type : BufferType
    var object : VkBuffer
    var size : u32
    val offset : u64
    val usage : BufferUsageFlags

Buffer это объект, хранится в куче и передаётся по ссылке. Он содержит пять полей. Ни одному из полей не присвоено значение, что делает их параметрами конструктора. object и size могут быть изменены в пределах файла. Для повсеместно изменяемого поля нужно добавить атрибут @mut.

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 наследует Buffer, передаёт значения полей type и offset в его конструктор. Поля object, size и usage становятся параметрами конструктора самого StorageBuffer, так же как и его собственные поля device и 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 создаёт статический объект.

size.as<u64> означает то же самое что и size as u64, но не требует скобок.

Функция buffer/create возвращает кортеж из двух элементов, который разделяется на привязки buffer и memory.

В последнем выражении создаётся объект типа StorageBuffer. Все пять параметров конструктора переданы по имени, четыре из них используют короткий формат для случая, когда имя параметра совпадает с именем передаваемой в качестве значения привязки.