118 lines
3.3 KiB
C
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
|