power_play/src/gp/gp_core.h
2025-07-28 19:49:46 -05:00

157 lines
3.9 KiB
C

struct sys_window;
struct snc_counter;
typedef struct G_Indices G_Indices;
struct G_Indices {
u32 count;
u32 *indices;
};
/* ========================== *
* Startup
* ========================== */
void gp_startup(void);
/* ========================== *
* Resource
* ========================== */
typedef struct G_Resource G_Resource;
/* NOTE: Internally, the layer will make sure to not release any resources
* until after any in-flight GPU runs finish using them. However, it is up to
* the caller to make sure the released resources aren't then referenced in
* any runs
*/
void gp_resource_release(G_Resource *resource);
/* ========================== *
* Texture
* ========================== */
typedef enum G_TextureFormat {
GP_TEXTURE_FORMAT_NONE,
GP_TEXTURE_FORMAT_R8_UNORM,
GP_TEXTURE_FORMAT_R8G8B8A8_UNORM,
GP_TEXTURE_FORMAT_R8G8B8A8_UNORM_SRGB,
GP_TEXTURE_FORMAT_R16G16B16A16_FLOAT,
NUM_GP_TEXTURE_FORMATS
} G_TextureFormat;
typedef enum G_TextureFlag {
GP_TEXTURE_FLAG_NONE = (0),
GP_TEXTURE_FLAG_TARGETABLE = (1 << 0)
} G_TextureFlag;
G_Resource *gp_texture_alloc(G_TextureFormat format, u32 flags, V2i32 size, void *initial_data);
V2i32 gp_texture_get_size(G_Resource *texture);
/* ========================== *
* Render
* ========================== */
typedef enum G_RenderCmdKind {
GP_RENDER_CMD_KIND_NONE,
GP_RENDER_CMD_KIND_DRAW_MATERIAL,
GP_RENDER_CMD_KIND_DRAW_UI_RECT,
GP_RENDER_CMD_KIND_DRAW_UI_SHAPE,
GP_RENDER_CMD_KIND_PUSH_GRID,
NUM_GP_RENDER_CMD_KINDS
} G_RenderCmdKind;
typedef struct G_RenderCmdDesc G_RenderCmdDesc;
struct G_RenderCmdDesc {
G_RenderCmdKind kind;
union {
struct {
Xform xf;
G_Resource *texture;
ClipRect clip;
u32 tint;
b32 is_light;
V3 light_emittance;
u32 grid_cmd_id;
} material;
struct {
Xform xf;
G_Resource *texture;
ClipRect clip;
u32 tint;
} ui_rect;
struct {
V2Array vertices;
G_Indices indices;
u32 color;
} ui_shape;
struct {
f32 line_thickness;
f32 line_spacing;
V2 offset;
u32 bg0_color;
u32 bg1_color;
u32 line_color;
u32 x_color;
u32 y_color;
} grid;
};
};
typedef struct G_RenderParams G_RenderParams;
struct G_RenderParams {
V2i32 ui_size;
V2i32 render_size;
Xform world_to_render_xf;
Xform render_to_ui_xf;
b32 effects_disabled;
};
typedef struct G_RenderSig G_RenderSig;
G_RenderSig *gp_render_sig_alloc(void);
/* Returns a cmd id internal to the sig */
u32 gp_push_render_cmd(G_RenderSig *render_sig, G_RenderCmdDesc *desc);
G_Resource *gp_run_render(G_RenderSig *gp_render_sig, G_RenderParams render_params);
/* ========================== *
* Memory info
* ========================== */
typedef struct G_MemoryInfo G_MemoryInfo;
struct G_MemoryInfo {
u64 local_used;
u64 local_budget;
u64 non_local_used;
u64 non_local_budget;
};
G_MemoryInfo gp_query_memory_info(void);
/* ========================== *
* Swapchain
* ========================== */
typedef struct G_Swapchain G_Swapchain;
G_Swapchain *gp_swapchain_alloc(struct sys_window *window, V2i32 resolution);
void gp_swapchain_release(G_Swapchain *gp_swapchain);
/* Waits until a new backbuffer is ready to be written to.
* This should be called before rendering for minimum latency. */
void gp_swapchain_wait(G_Swapchain *gp_swapchain);
/* ========================== *
* Present
* ========================== */
/* 1. Clears the backbuffer and ensures it's at size `backbuffer_resolution`
* 2. Blits `texture` to the backbuffer using `texture_xf`
* 3. Presents the backbuffer */
void gp_present(G_Swapchain *gp_swapchain, V2i32 backbuffer_resolution, G_Resource *texture, Xform texture_xf, i32 vsync);