power_play/src/renderer.h

118 lines
3.3 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_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;
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