#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);