power_play/src/gpu.h

149 lines
3.3 KiB
C

#ifndef GPU_H
#define GPU_H
struct sys_window;
#define GPU_TEXTURE_MAX_WIDTH 16384
#define GPU_TEXTURE_MAX_HEIGHT 16384
/* ========================== *
* Startup
* ========================== */
struct gpu_startup_receipt { i32 _; };
struct gpu_startup_receipt gpu_startup(struct sys_window *window);
/* ========================== *
* Texture
* ========================== */
enum gpu_texture_format {
GPU_TEXTURE_FORMAT_NONE,
GPU_TEXTURE_FORMAT_R8G8B8A8_UNORM,
GPU_TEXTURE_FORMAT_R8G8B8A8_UNORM_SRGB,
NUM_GPU_TEXTURE_FORMATS
};
enum gpu_texture_flag {
GPU_TEXTURE_FLAG_NONE = (0),
GPU_TEXTURE_FLAG_TARGETABLE = (1 << 0)
};
struct gpu_texture {
u64 handle;
};
struct gpu_texture gpu_texture_alloc(enum gpu_texture_format format, u32 flags, struct v2i32 size, void *initial_data);
void gpu_texture_release(struct gpu_texture t);
void gpu_texture_clear(struct gpu_texture target_texture, u32 clear_color);
struct v2i32 gpu_texture_get_size(struct gpu_texture texture);
/* ========================== *
* Cmd buffer
* ========================== */
struct gpu_indices {
u16 count;
u16 *indices;
};
enum gpu_cmd_kind {
GPU_CMD_KIND_NONE,
GPU_CMD_KIND_DRAW_VIEW,
GPU_CMD_KIND_DRAW_MESH,
GPU_CMD_KIND_DRAW_TEXTURE,
GPU_CMD_KIND_DRAW_GRID,
GPU_CMD_KIND_TEST,
NUM_GPU_CMD_KINDS
};
struct gpu_cmd_params {
enum gpu_cmd_kind kind;
union {
struct {
struct xform xf;
} view;
struct {
struct v2_array vertices;
struct gpu_indices indices;
u32 color;
} mesh;
struct {
struct xform xf;
struct sprite_tag sprite;
struct gpu_texture texture;
struct clip_rect clip;
u32 tint;
f32 emittance;
} texture;
struct {
struct xform xf;
f32 line_thickness;
f32 line_spacing;
struct v2 offset;
u32 bg0_color;
u32 bg1_color;
u32 line_color;
u32 x_color;
u32 y_color;
} grid;
struct {
struct xform xf;
} test;
};
};
struct gpu_cmd_store {
u64 handle;
};
struct gpu_cmd_store gpu_cmd_store_alloc(void);
void gpu_cmd_store_release(struct gpu_cmd_store gpu_cmd_store);
void gpu_push_cmd(struct gpu_cmd_store gpu_cmd_store, struct gpu_cmd_params params);
void gpu_submit_cmds(struct gpu_cmd_store gpu_cmd_store);
/* ========================== *
* Pass
* ========================== */
struct gpu_pass_cmds_array {
u64 count;
struct gpu_cmd_store **cmds;
};
struct gpu_pass_params {
struct gpu_pass_cmds_array cmds_array;
struct gpu_texture draw_target;
struct rect draw_target_viewport;
};
struct gpu_pass_state {
u64 handle;
};
struct gpu_pass_state gpu_pass_state_alloc(void);
void gpu_pass_state_release(struct gpu_pass_state gpu_pass_state);
void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params params);
/* ========================== *
* Backbuffer
* ========================== */
/* Returns a texture representing the internal backbuffer. Lifetime is managed by gpu layer. */
struct gpu_texture gpu_recreate_backbuffer(struct v2i32 size);
/* Presents the backbuffer to the screen */
void gpu_swap_backbuffer(i32 vsync);
#endif