#ifndef RENDERER_H #define RENDERER_H struct sys_window; struct sprite_scope; #define RENDERER_TEXTURE_MAX_WIDTH 16384 #define RENDERER_TEXTURE_MAX_HEIGHT 16384 typedef u32 vidx; struct renderer_cmd_buffer; struct renderer_texture { u64 handle; }; /* ========================== * * Shaders * ========================== */ enum shader_kind { SHADER_NONE, SHADER_TRIANGLE, SHADER_GRID, NUM_SHADERS }; struct renderer_cmd_parameters { enum shader_kind kind; union { struct { struct renderer_texture texture; /* Overrides sprite if set */ struct sprite_tag sprite; } texture_params; }; }; PACK(struct triangle_shader_vertex { struct v2 pos; struct v2 uv; u32 color; }); PACK(struct grid_shader_vertex { struct v2 pos; u32 color_bg; u32 color_line; u32 color_x; u32 color_y; f32 line_thickness; f32 line_spacing; struct v2 offset; }); /* ========================== * * Startup * ========================== */ struct renderer_startup_receipt { i32 _; }; struct renderer_startup_receipt renderer_startup(struct sys_window *window); /* ========================== * * Texture * ========================== */ enum renderer_texture_format { RENDERER_TEXTURE_FORMAT_NONE, RENDERER_TEXTURE_FORMAT_R8G8B8A8_UNORM, NUM_RENDERER_TEXTURE_FORMATS }; #define RENDERER_TEXTURE_FLAG_NONE (0) #define RENDERER_TEXTURE_FLAG_TARGET (1<<0) struct renderer_texture renderer_texture_alloc(enum renderer_texture_format format, u32 flags, struct v2i32 size, void *initial_data); void renderer_texture_release(struct renderer_texture t); void renderer_texture_clear(struct renderer_texture target_texture, u32 clear_color); void renderer_texture_render(struct renderer_texture texture, struct renderer_cmd_buffer *cmdbuff, struct xform view, struct rect viewport, struct sprite_scope *sprite_scope); struct v2i32 renderer_texture_get_size(struct renderer_texture texture); /* ========================== * * Backbuffer * ========================== */ /* Returns a texture linking to the internal backbuffer. Lifetime is managed by renderer. */ struct renderer_texture renderer_backbuffer_recreate(struct v2i32 size); void renderer_backbuffer_present(i32 vsync); /* ========================== * * Cmd buffer * ========================== */ struct renderer_cmd_buffer *renderer_cmd_buffer_alloc(void); void renderer_cmd_buffer_release(struct renderer_cmd_buffer *cmdbuff); /* Pushes array of vertices based on `vertices_count` & `indices_count`. * Sets `vertices_out` and `indices_out` to start of the pushed arrays, to be filled out by the caller. * Returns the index of the first vertex. Each inserted index should be incremented by this. * * NOTE: This should be preceded by an `ensure_cmd` call to ensure that the correct vertex types * are being pushed. */ u32 renderer_cmd_buffer_push_vertices(struct renderer_cmd_buffer *cmdbuff, u8 **vertices_out, vidx **indices_out, u32 vertices_count, u32 indices_count); /* Checks the currently active draw command. Ensures a new command is created * if it doesn't match the expected parameters (otherwise the existing command * can be re-used for batching). */ void renderer_cmd_buffer_ensure_cmd(struct renderer_cmd_buffer *cmdbuff, struct renderer_cmd_parameters *params); void renderer_cmd_buffer_send_to_gpu(struct renderer_cmd_buffer *cmdbuff); #endif