Created
April 29, 2025 10:57
-
-
Save cloudwu/5f431c8d694e374e006b407e9efa91a6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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