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.