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