revolver

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

render.h (12574B)


      1 //////////////////////////////////////////////////////////////////
      2 // render.h
      3 
      4 //////////////////////////////////////////////////////////////////
      5 // Render types
      6 
      7 typedef union {void* vptr; u32 u;} rv_render_handle_t;
      8 
      9 typedef enum {
     10     RV_TEXTURE_FORMAT_RGBA8,
     11     RV_TEXTURE_FORMAT_RGB8,
     12     RV_TEXTURE_FORMAT_RGBA16F,
     13     RV_TEXTURE_FORMAT_RGBA32F,
     14     RV_TEXTURE_FORMAT_A8,
     15     RV_TEXTURE_FORMAT_R8,
     16     RV_TEXTURE_FORMAT_DEPTH8,
     17     RV_TEXTURE_FORMAT_DEPTH16,
     18     RV_TEXTURE_FORMAT_DEPTH24,
     19     RV_TEXTURE_FORMAT_DEPTH32F,
     20     RV_TEXTURE_FORMAT_DEPTH24_STENCIL8,
     21     RV_TEXTURE_FORMAT_DEPTH32F_STENCIL8,
     22     RV_TEXTURE_FORMAT_STENCIL8
     23 } rv_texture_format_t;
     24 
     25 typedef enum {
     26     RV_TEXTURE_WRAP_REPEAT,
     27     RV_TEXTURE_WRAP_MIRRORED_REPEAT,
     28     RV_TEXTURE_WRAP_CLAMP_TO_EDGE,
     29 } rv_texture_wrap_t;
     30 
     31 typedef enum {
     32     RV_TEXTURE_FILTER_NEAREST,
     33     RV_TEXTURE_FILTER_LINEAR,
     34 } rv_texture_filter_t;
     35 
     36 typedef struct {
     37     // creation data
     38     rv_vec2 size;
     39     rv_texture_format_t format;
     40     rv_texture_wrap_t wrap_s;
     41     rv_texture_wrap_t wrap_t;
     42     rv_texture_filter_t min_filter;
     43     rv_texture_filter_t mag_filter;
     44     rv_texture_filter_t mip_filter;
     45     u32 num_mips;
     46     void* data;
     47 
     48     rv_render_handle_t handle;
     49 } rv_texture_t;
     50 
     51 typedef struct rv_texture_node_t rv_texture_node_t;
     52 struct rv_texture_node_t {
     53     rv_texture_node_t* next;
     54     rv_texture_t* tex;
     55 };
     56 
     57 typedef struct {
     58     rv_texture_node_t* color_attachement_first;
     59     // TODO(Samdal): depth buffer
     60 
     61     rv_render_handle_t handle;
     62 } rv_framebuffer_t;
     63 
     64 typedef enum {
     65     RV_UNIFORM_INVALID,
     66     RV_UNIFORM_F32,
     67     RV_UNIFORM_VEC2,
     68     RV_UNIFORM_VEC3,
     69     RV_UNIFORM_VEC4,
     70     RV_UNIFORM_MAT4,
     71     RV_UNIFORM_TEX,
     72 } rv_uniform_type_t;
     73 typedef union {
     74     f32     v_f32;
     75     rv_vec2 v_vec2;
     76     rv_vec3 v_vec3;
     77     rv_vec4 v_vec4;
     78     rv_mat4 v_mat4;
     79     rv_texture_t* v_tex;
     80 } rv_uniform_variant_t;
     81 
     82 typedef struct rv_uniform_t rv_uniform_t;
     83 struct rv_uniform_t {
     84     // NOTE(Samdal): uniforms are specific to their corresponding pipeline
     85     rv_uniform_t* next;
     86 
     87     // create info
     88     // uniforms are created when it's pipeline is created
     89     rv_str8 name_null_terminated; // MUST be null terminated
     90 
     91     rv_uniform_type_t type;
     92 
     93     rv_render_handle_t pipeline_uniform_handle;
     94     rv_uniform_variant_t last_val;
     95     bool32 has_been_set;
     96 };
     97 
     98 typedef enum {
     99     RV_BUFFER_USAGE_STATIC,
    100     RV_BUFFER_USAGE_DYNAMIC,
    101     RV_BUFFER_USAGE_STREAM,
    102 } rv_buffer_usage_t;
    103 
    104 typedef struct {
    105     void* data;
    106     s32 size;
    107     rv_buffer_usage_t usage;
    108     rv_render_handle_t handle;
    109 } rv_vbo_t;
    110 
    111 typedef struct {
    112     void* data;
    113     s32 size;
    114     s32 elem_size;
    115     rv_buffer_usage_t usage;
    116     rv_render_handle_t handle;
    117 } rv_ibo_t;
    118 
    119 typedef enum {
    120     RV_SHADER_TYPE_INVALID,
    121     RV_SHADER_TYPE_VERTEX,
    122     RV_SHADER_TYPE_FRAGMENT,
    123     //RV_SHADER_TYPE_COMPUTE
    124 } rv_shader_type_t;
    125 
    126 typedef struct {
    127     rv_str8 source;
    128 
    129     rv_shader_type_t type;
    130     rv_render_handle_t handle;
    131 } rv_shader_t;
    132 typedef struct rv_shader_node_t rv_shader_node_t;
    133 struct rv_shader_node_t {
    134     rv_shader_node_t* next;
    135     rv_shader_t* shader;
    136 };
    137 
    138 typedef enum {
    139     RV_VATTR_TYPE_FLOAT4,
    140     RV_VATTR_TYPE_FLOAT3,
    141     RV_VATTR_TYPE_FLOAT2,
    142     RV_VATTR_TYPE_FLOAT,
    143     RV_VATTR_TYPE_UINT4,
    144     RV_VATTR_TYPE_UINT3,
    145     RV_VATTR_TYPE_UINT2,
    146     RV_VATTR_TYPE_UINT,
    147     RV_VATTR_TYPE_BYTE4,
    148     RV_VATTR_TYPE_BYTE3,
    149     RV_VATTR_TYPE_BYTE2,
    150     RV_VATTR_TYPE_BYTE,
    151 } rv_vattr_type_t;
    152 
    153 typedef struct rv_vattr_t rv_vattr_t;
    154 struct rv_vattr_t {
    155     rv_vattr_t* next;
    156     rv_vattr_type_t type;
    157     s32 bind_index;
    158     s32 divisor;
    159 };
    160 
    161 typedef struct rv_vattr_bind_t rv_vattr_bind_t;
    162 struct rv_vattr_bind_t {
    163     rv_vattr_bind_t* next;
    164     rv_vattr_t* desc;
    165     s32 offset;
    166     s32 stride;
    167     s32 divisor;
    168 };
    169 
    170 typedef enum {
    171     RV_BLEND_EQUATION_ADD,
    172     RV_BLEND_EQUATION_SUBTRACT,
    173     RV_BLEND_EQUATION_REVERSE_SUBTRACT,
    174     RV_BLEND_EQUATION_MIN,
    175     RV_BLEND_EQUATION_MAX
    176 } rv_blend_equation_t;
    177 
    178 typedef enum {
    179     RV_BLEND_MODE_DEFAULT,
    180     RV_BLEND_MODE_ZERO,
    181     RV_BLEND_MODE_ONE,
    182     RV_BLEND_MODE_SRC_COLOR,
    183     RV_BLEND_MODE_ONE_MINUS_SRC_COLOR,
    184     RV_BLEND_MODE_DST_COLOR,
    185     RV_BLEND_MODE_ONE_MINUS_DST_COLOR,
    186     RV_BLEND_MODE_SRC_ALPHA,
    187     RV_BLEND_MODE_ONE_MINUS_SRC_ALPHA,
    188     RV_BLEND_MODE_DST_ALPHA,
    189     RV_BLEND_MODE_ONE_MINUS_DST_ALPHA,
    190     RV_BLEND_MODE_CONSTANT_COLOR,
    191     RV_BLEND_MODE_ONE_MINUS_CONSTANT_COLOR,
    192     RV_BLEND_MODE_CONSTANT_ALPHA,
    193     RV_BLEND_MODE_ONE_MINUS_CONSTANT_ALPHA
    194 } rv_blend_mode_t;
    195 
    196 typedef struct {
    197     rv_uniform_t* uniform_desc_first;
    198     rv_shader_node_t* shader_first;
    199     rv_vattr_t* vattr_first;
    200     rv_vattr_t* vattr_last;
    201     rv_render_handle_t handle;
    202 
    203     bool32 disable_blend;
    204     rv_blend_mode_t blend_src;
    205     rv_blend_mode_t blend_dst;
    206     rv_blend_equation_t blend_equation;
    207 } rv_pipeline_t;
    208 
    209 typedef enum {
    210     RV_PRIMITIVE_TYPE_TRIANGLES,
    211 } rv_primitive_type_t;
    212 
    213 typedef enum {
    214     RV_RENDER_CLEAR_FLAG_NONE    = 0,
    215 
    216     RV_RENDER_CLEAR_FLAG_COLOR   = (1 << 0),
    217     RV_RENDER_CLEAR_FLAG_DEPTH   = (1 << 1),
    218     RV_RENDER_CLEAR_FLAG_STENCIL = (1 << 2),
    219 
    220     RV_RENDER_CLEAR_FLAG_ALL = RV_RENDER_CLEAR_FLAG_COLOR | RV_RENDER_CLEAR_FLAG_DEPTH | RV_RENDER_CLEAR_FLAG_STENCIL
    221 } rv_graphics_clear_flag_t;
    222 
    223 typedef struct rv_render_clear_desc_t rv_render_clear_desc_t;
    224 struct rv_render_clear_desc_t {
    225     rv_render_clear_desc_t* next;
    226 
    227     rv_graphics_clear_flag_t flags;
    228     union {
    229         f32 color[4];
    230         rv_vec4 color_v;
    231 
    232         f32 depth;
    233         s32 stencil;
    234     };
    235 };
    236 
    237 typedef enum {
    238     RV_RENDER_OBJ_OP_CREATE,
    239     RV_RENDER_OBJ_OP_UPDATE,
    240     RV_RENDER_OBJ_OP_BIND,
    241     RV_RENDER_OBJ_OP_DESTROY,
    242 } rv_command_obj_operation_t;
    243 
    244 typedef enum {
    245     RV_COMMAND_INVALID,
    246 
    247     RV_COMMAND_CUSTOM,
    248 
    249     RV_COMMAND_COMMAND_LIST,
    250 
    251     RV_COMMAND_OBJ_VERTEX,
    252     RV_COMMAND_OBJ_INDEX,
    253     RV_COMMAND_OBJ_SHADER,
    254     RV_COMMAND_OBJ_PIPELINE,
    255     RV_COMMAND_OBJ_TEXTURE,
    256     RV_COMMAND_OBJ_FRAMEBUFFER,
    257 
    258     RV_COMMAND_UNIFORM_UPDATE, // only allowed during pipeline bind
    259 
    260     RV_COMMAND_DRAW, // only allowed during pipeline bind
    261 
    262     RV_COMMAND_CLEAR,
    263     RV_COMMAND_SET_VIEWPORT,
    264 } rv_command_type_t;
    265 
    266 typedef struct rv_command_t rv_command_t;
    267 
    268 typedef struct {
    269     rv_command_t* first;
    270     rv_command_t* last;
    271 } rv_command_list_t;
    272 
    273 struct rv_command_t {
    274     rv_command_t* next;
    275     rv_command_t* prev;
    276 
    277     rv_command_type_t type;
    278 
    279     union {
    280         struct {
    281             rv_render_clear_desc_t* first;
    282             rv_render_clear_desc_t* last;
    283         } clear;
    284         rv_vec4 viewport;
    285         struct {
    286             void(*func)(void*);
    287             void* data;
    288         } custom;
    289         struct {
    290             rv_command_obj_operation_t operation;
    291 
    292             // parameters
    293             union {
    294                 // TODO(Samdal): make these named structs and
    295                 // add ability to switch between different
    296                 // update methods
    297                 struct {void* data; s64 size;} ibo_update;
    298                 struct {void* data; s64 size;} vbo_update;
    299 
    300                 struct {
    301                     s32 bind_index;
    302                     s32 base_offset;
    303                     rv_vattr_bind_t* vattr_override_first;
    304                 } vbo_bind;
    305 
    306                 struct {
    307                     void* data;
    308                     rv_rect sub_part;
    309                 } tex_update;
    310 
    311                 struct {
    312                     // uniforms bind textures automatically,
    313                     // only for manual overriding or doing something special
    314                     s32 sampler_index;
    315                 } tex_bind;
    316             };
    317 
    318             // desc reference
    319             union {
    320                 rv_pipeline_t* pipeline;
    321                 rv_shader_t* shader;
    322                 rv_vbo_t* vbo;
    323                 rv_ibo_t* ibo;
    324                 rv_texture_t* tex;
    325                 rv_framebuffer_t* framebuffer;
    326                 void* generic;
    327             };
    328         } obj;
    329         struct {
    330             rv_primitive_type_t primitive;
    331             s64 first; // first index
    332             s64 count;
    333             s64 instances;
    334         } draw;
    335 
    336         rv_command_list_t command_list;
    337 
    338         struct {
    339             rv_uniform_t* desc;
    340             rv_uniform_variant_t value;
    341         } uniform_update;
    342     };
    343 };
    344 
    345 typedef struct rv_render_pass_t rv_render_pass_t;
    346 struct rv_render_pass_t {
    347     rv_render_pass_t* next;
    348     rv_command_list_t commands;
    349 
    350     rv_framebuffer_t* framebuffer; // auto bind framebuffer
    351 };
    352 
    353 // non-framebuffer command list node
    354 typedef struct rv_command_list_node_t rv_command_list_node_t;
    355 struct rv_command_list_node_t {
    356     rv_command_list_node_t* next;
    357     rv_command_list_t commands;
    358 };
    359 
    360 
    361 typedef struct {
    362     rv_render_pass_t* first;
    363     rv_render_pass_t* last;
    364 } rv_render_pass_list_t;
    365 
    366 //////////////////////////////////////////////////////////////////
    367 // Helpers
    368 
    369 RV_GLOBAL void rv_get_default_texture(void** data_out, rv_vec2* size_out);
    370 
    371 // render pass
    372 RV_GLOBAL rv_render_pass_t* rv_render_push_render_pass(rv_arena* arena, rv_render_pass_list_t* rpass_list);
    373 
    374 // command list
    375 RV_GLOBAL rv_command_t* rv_cmd_copy(rv_command_t* dest, rv_command_t source); // returns dest, does not modify next/prev
    376 RV_GLOBAL rv_command_t* rv_cmd_push(rv_arena* arena, rv_command_list_t* commands);
    377 RV_GLOBAL rv_command_t* rv_cmd_insert(rv_arena* arena, rv_command_list_t* commands, rv_command_t* after);
    378 RV_GLOBAL rv_command_t* rv_render_copy_commands(rv_arena* arena, rv_command_list_t* dest, rv_command_list_t* source); // reurns the first command addded
    379 
    380 
    381 // ctors
    382 #define rv_cmd(_type, ...) (rv_command_t){.type = _type, __VA_ARGS__}
    383 RV_GLOBAL rv_command_t rv_cmd_type(rv_command_type_t type);
    384 RV_GLOBAL rv_command_t rv_cmd_obj(rv_command_type_t type, rv_command_obj_operation_t operation, void* obj);
    385 RV_GLOBAL rv_command_t rv_cmd_uniform_update(rv_uniform_t* uniform, rv_uniform_variant_t value);
    386 
    387 #define rv_cmd_push_copy(arena,             commands,        ...)            rv_cmd_copy(rv_cmd_push(arena,   commands),        (rv_command_t)__VA_ARGS__)
    388 #define rv_cmd_insert_copy(arena,           commands, after, ...)            rv_cmd_copy(rv_cmd_insert(arena, commands, after), (rv_command_t)__VA_ARGS__)
    389 
    390 #define rv_cmd_push_type(arena,             commands,        _type)          rv_cmd_copy(rv_cmd_push(arena,   commands),        rv_cmd_type(_type))
    391 #define rv_cmd_insert_type(arena,           commands, after, _type)          rv_cmd_copy(rv_cmd_insert(arena, commands, after), rv_cmd_type(_type))
    392 
    393 #define rv_cmd_push_compound(arena,         commands,        _type, ...)     rv_cmd_copy(rv_cmd_push(arena,   commands),        rv_cmd(_type, __VA_ARGS__))
    394 #define rv_cmd_insert_compound(arena,       commands, after, _type, ...)     rv_cmd_copy(rv_cmd_insert(arena, commands, after), rv_cmd(_type, __VA_ARGS__))
    395 
    396 #define rv_cmd_push_obj(arena,              commands,        _type, op, obj) rv_cmd_copy(rv_cmd_push(arena,   commands),        rv_cmd_obj(_type, op, obj))
    397 #define rv_cmd_insert_obj(arena,            commands, after, _type, op, obj) rv_cmd_copy(rv_cmd_insert(arena, commands, after), rv_cmd_obj(_type, op, obj))
    398 
    399 #define rv_cmd_push_uniform_update(arena,   commands,        uniform, ...)   rv_cmd_copy(rv_cmd_push(arena,   commands),        rv_cmd_uniform_update(uniform, (rv_uniform_variant_t)__VA_ARGS__))
    400 #define rv_cmd_insert_uniform_update(arena, commands, after, uniform, ...)   rv_cmd_copy(rv_cmd_insert(arena, commands, after), rv_cmd_uniform_update(uniform, (rv_uniform_variant_t)__VA_ARGS__))
    401 
    402 // command modification helpers
    403 RV_GLOBAL rv_render_clear_desc_t*   rv_render_push_clear_desc(rv_arena* arena, rv_command_t* clear, rv_graphics_clear_flag_t flags);
    404 RV_GLOBAL bool32 rv_command_has_pipeline(rv_command_t* command, rv_pipeline_t* prog);
    405 
    406 // framebuffer modificatoin helpers
    407 RV_GLOBAL void rv_framebuffer_push_texture(rv_arena* arena, rv_framebuffer_t* fbuf, rv_texture_t* tex);
    408 RV_GLOBAL rv_framebuffer_t* rv_framebuffer_color_simple(rv_arena* arena, rv_vec2 color_size, rv_command_list_t* append_construction);
    409 
    410 // pipeline modificatoin helpers
    411 RV_GLOBAL rv_shader_node_t* rv_pipeline_push_shader(rv_arena* arena, rv_pipeline_t* pipeline, rv_shader_t* shader);
    412 RV_GLOBAL rv_uniform_t*     rv_pipeline_push_uniform(rv_arena* arena, rv_pipeline_t* pipeline, rv_str8 name, rv_uniform_type_t type);
    413 RV_GLOBAL rv_vattr_t*       rv_pipeline_push_vattr(rv_arena* arena, rv_pipeline_t* pipeline, rv_vattr_type_t type, s32 bind_index, s32 divisor);
    414 
    415 //////////////////////////////////////////////////////////////////
    416 // Submit
    417 RV_GLOBAL void  rv_window_render_commit(rv_window_handle_t* window, rv_render_pass_list_t* passes);