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
. Все пять параметров конструктора переданы по имени, четыре из них используют короткий формат для случая, когда имя параметра совпадает с именем передаваемой в качестве значения привязки.