quick_submit.h

cross platform rendering playground

src/quick_submit.h

1.04 KB
#pragma once

#include "backend/rhi.h"
#include "core/globals.h"

#define MAX_QUICK_SUBMIT_BUFFERS 64

enum class QsCmdState : u8 {
    Free,
    Recording,
    Submitted,
};

struct QsSubmitHandle {
    u64 value;
};

struct QsCmd {
    QsCmdState state = QsCmdState::Free;
    u32 index;
    rhi::CmdBuffer cmd;
    u64 submitted_value;
};

struct QuickSubmit {
    rhi::Device *device = nullptr;
    rhi::Queue queue;
    rhi::CmdPool pool;
    QsCmd buffers[MAX_QUICK_SUBMIT_BUFFERS];
    u32 max_buffer_count = MAX_QUICK_SUBMIT_BUFFERS;
    u32 next_idx;
    rhi::Sync *timeline = nullptr;
    u64 timeline_ctr;
    u64 timeline_value;
};

void qs_init(QuickSubmit &qs, rhi::Queue queue, rhi::Device &device);
void qs_shutdown(QuickSubmit &qs);
QsCmd *qs_acquire(QuickSubmit &qs);

QsSubmitHandle qs_submit(QuickSubmit &qs, QsCmd &buf);

void qs_submit_and_wait(QuickSubmit &qs, QsCmd &buf);
void qs_purge(QuickSubmit &qs);
bool qs_is_ready(QuickSubmit &qs, QsSubmitHandle h);
void qs_wait(QuickSubmit &qs, QsSubmitHandle h);
void qs_wait_all(QuickSubmit &qs);