/// GrAAL buffer module
module gfx.graal.buffer;

import gfx.core.rc;
import gfx.graal.format;
import gfx.graal.memory;

enum BufferUsage
{
    transferSrc     = 0x0001,
    transferDst     = 0x0002,
    uniformTexel    = 0x0004,
    storageTexel    = 0x0008,
    uniform         = 0x0010,
    storage         = 0x0020,
    index           = 0x0040,
    vertex          = 0x0080,
    indirect        = 0x0100,
}

enum IndexType {
    u16, u32
}

interface Buffer : AtomicRefCounted
{
    @property size_t size();
    @property BufferUsage usage();
    @property MemoryRequirements memoryRequirements();
    /// The buffer keeps a reference to the device memory
    void bindMemory(DeviceMemory mem, in size_t offset)
    in {
        assert(mem);
        assert(!boundMemory);
    }
    out {
        assert(boundMemory);
    }

    @property DeviceMemory boundMemory();

    BufferView createView(Format format, size_t offset, size_t size);
}

interface BufferView : AtomicRefCounted
{
    @property Format format();
    @property Buffer buffer();
    @property size_t offset();
    @property size_t size();
}