99 lines
2.8 KiB
C
99 lines
2.8 KiB
C
#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_canvas;
|
|
|
|
/* ========================== *
|
|
* Shaders
|
|
* ========================== */
|
|
|
|
enum shader_kind {
|
|
SHADER_NONE,
|
|
SHADER_TEXTURE,
|
|
SHADER_GRID,
|
|
|
|
NUM_SHADERS
|
|
};
|
|
|
|
struct renderer_cmd_parameters {
|
|
enum shader_kind kind;
|
|
union {
|
|
struct {
|
|
struct renderer_handle texture; /* Overrides sprite if set */
|
|
struct sprite_tag sprite;
|
|
} texture_params;
|
|
};
|
|
};
|
|
|
|
PACK(struct texture_shader_vertex {
|
|
struct v2 pos;
|
|
struct v2 uv;
|
|
u32 color;
|
|
});
|
|
|
|
PACK(struct grid_shader_vertex {
|
|
struct v2 pos;
|
|
u32 color;
|
|
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);
|
|
|
|
/* ========================== *
|
|
* Canvas
|
|
* ========================== */
|
|
|
|
struct renderer_canvas *renderer_canvas_alloc(void);
|
|
|
|
void renderer_canvas_release(struct renderer_canvas *canvas);
|
|
|
|
/* Set the canvas view xform to be used when presenting the canvas.
|
|
* NOTE: `view` should be in row-major order.
|
|
*/
|
|
void renderer_canvas_set_view(struct renderer_canvas *canvas, struct xform view);
|
|
|
|
/* 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_canvas_push_vertices(struct renderer_canvas *canvas, 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_canvas_ensure_cmd(struct renderer_canvas *canvas, struct renderer_cmd_parameters *params);
|
|
|
|
void renderer_canvas_send_to_gpu(struct renderer_canvas *canvas);
|
|
|
|
void renderer_canvas_present(struct renderer_canvas **canvases, u32 canvases_count, struct v2 screen_size, struct rect viewport, i32 vsync, struct sprite_scope *sprite_scope);
|
|
|
|
/* ========================== *
|
|
* Texture
|
|
* ========================== */
|
|
|
|
INLINE struct renderer_handle renderer_handle_nil(void) { return (struct renderer_handle) { 0 }; }
|
|
|
|
struct renderer_handle renderer_texture_alloc(struct image_rgba data);
|
|
void renderer_texture_release(struct renderer_handle handle);
|
|
b32 renderer_texture_is_nil(struct renderer_handle handle);
|
|
|
|
#endif
|