module gfx.graal.queue;

import gfx.core.rc;
import gfx.graal.cmd;
import gfx.graal.device;
import gfx.graal.presentation;
import gfx.graal.sync;

enum QueueCap {
    graphics    = 0x01,
    compute     = 0x02,
}

struct QueueFamily
{
    QueueCap cap;
    uint count;
}

struct StageWait {
    Semaphore sem;
    PipelineStage stages;
}

struct Submission {
    StageWait[] stageWaits;
    Semaphore[] sigSems;
    PrimaryCommandBuffer[] cmdBufs;
}

struct PresentRequest {
    Swapchain swapChain;
    uint imageIndex;
}

interface Queue
{
    @property Device device();
    @property uint index();
    void waitIdle();
    void submit(Submission[] submissions, Fence fence);
    void present(Semaphore[] waitSems, PresentRequest[] prs);
}