Skip to content

Instantly share code, notes, and snippets.

@cloudwu
Created April 29, 2025 10:57
Show Gist options
  • Save cloudwu/5f431c8d694e374e006b407e9efa91a6 to your computer and use it in GitHub Desktop.
Save cloudwu/5f431c8d694e374e006b407e9efa91a6 to your computer and use it in GitHub Desktop.
#ifndef soluna_render_h
#define soluna_render_h
#include <stdint.h>
#include "sokol/sokol_gfx.h"
#define SOKOL_COMMAND_INVALID 0
#define SOKOL_COMMAND_MAKE 1
#define SOKOL_COMMAND_PASS 2
#define SOKOL_COMMAND_UPDATE 3
#define SOKOL_COMMAND_APPLY 4
#define SOKOL_COMMAND_DRAW 5
#define SOKOL_COMMAND_DRAW_INSTANCE 6
#define SOKOL_COMMAND_UNIFORM_SET 7
#define SOKOL_COMMAND_UNIFORM_SET_RANGE 8
#define SOKOL_DESC_INVALID 0
#define SOKOL_DESC_BUFFER 1
#define SOKOL_DESC_IMAGE 2
#define SOKOL_DESC_SAMPLER 3
#define SOKOL_DESC_SHADER 4
#define SOKOL_DESC_PIPELINE 5
#define SOKOL_DESC_ATTACHMENTS 6
#define SOKOL_BINDINGS 7
#define SOKOL_UNIFORM 8
#define SOKOL_MAX_HANDLE 4096
#define SOKOL_MAX_PASS 16
#define SOKOL_MAX_UPDATE 4096
#define SOKOL_MAX_BINDINGS 4096
#define SOKOL_MAX_UNIFORM 256
union render_desc_buffer {
struct sg_buffer_desc buffer;
struct sg_image_desc image;
struct sg_sampler_desc sampler;
struct sg_shader_desc shader;
struct sg_pipeline_desc pipeline;
struct sg_attachments_desc attachments;
};
struct render_command_make {
uint32_t id; // high 8bit (type) / low 24bit base 0 id
int index; // index of desc buffer
};
struct render_command_pass {
uint32_t id; // 0 for end
};
struct render_command_update {
uint32_t id;
uint16_t index;
uint8_t cubeface;
uint8_t mipmap;
};
struct render_command_apply {
int index;
uint16_t ub_slot;
uint16_t ub_size;
};
struct render_command_draw {
int base;
int elem;
};
struct render_command_draw_instance {
int inst;
};
union render_command_arg {
struct render_command_make make;
struct render_command_pass pass;
struct render_command_update update;
struct render_command_pipeline pipeline;
struct render_command_apply apply;
struct render_command_draw draw;
struct render_command_draw_instance inst;
};
struct render_command {
int type;
union render_command_arg arg;
};
struct render_command_queue {
int ready;
int cmd_cap;
int cmd_n;
int desc_cap;
int desc_n;
int bindings_n;
int range_count;
int range_reserve;
int uniform_size;
struct sg_bindings[SOKOL_MAX_BINDINGS];
struct sg_range[SOKOL_MAX_UPDATE];
struct sg_range uniform;
struct render_command *cmd;
union render_desc_buffer *desc;
};
struct render_command_queue;
struct render_context {
int id_count;
int pass_count;
uint32_t id_map[SOKOL_MAX_HANDLE];
struct sg_pass[SOKOL_MAX_PASS];
struct render_command_queue *q[2];
};
void render_init(struct render_context *ctx);
void render_deinit(struct render_context *ctx);
struct sg_buffer_desc * render_make_buffer(struct render_command_queue *q, uint32_t *id);
struct sg_image_desc * render_make_image(struct render_command_queue *q, uint32_t *id);
struct sg_sampler_desc * render_make_sampler(struct render_command_queue *q, uint32_t *id);
struct sg_shader_desc * render_make_shader(struct render_command_queue *q, uint32_t *id);
struct sg_pipeline_desc * render_make_pipeline(struct render_command_queue *q, uint32_t *id);
struct sg_attachments_desc * render_make_attachments(struct render_command_queue *q, uint32_t *id);
struct sg_pass * render_pass_new(struct render_context *ctx, uint32_t *id);
void render_pass_begin(struct render_command_queue *q, uint32_t id);
void render_pass_end(struct render_command_queue *q);
void render_update_buffer(struct render_command_queue *q, uint32_t id, sg_range *r);
void render_update_image(struct render_command_queue *q, uint32_t id, sg_image_data* data);
void render_apply_uniform(struct render_command_queue *q, int ub_slot, const sg_range *r);
void render_apply_bindings(struct render_command_queue *q, const sg_bindings* bindings);
void render_apply_pipeline(struct render_command_queue *q, uint32_t pip);
struct render_draw(struct render_command_queue *q, int base, int elem, int inst);
void render_command_submit(struct render_command_queue *q); // for command thread
void render_command_apply(struct render_context *ctx); // for render thread
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment