#ifndef GP_H #define GP_H struct sys_window; struct snc_counter; struct gp_indices { u32 count; u32 *indices; }; /* ========================== * * Startup * ========================== */ void gp_startup(void); /* ========================== * * Resource * ========================== */ struct gp_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(struct gp_resource *resource); /* ========================== * * Texture * ========================== */ enum gp_texture_format { 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 }; enum gp_texture_flag { GP_TEXTURE_FLAG_NONE = (0), GP_TEXTURE_FLAG_TARGETABLE = (1 << 0) }; struct gp_resource *gp_texture_alloc(enum gp_texture_format format, u32 flags, struct v2i32 size, void *initial_data); struct v2i32 gp_texture_get_size(struct gp_resource *texture); /* ========================== * * Render * ========================== */ enum gp_render_cmd_kind { 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 }; struct gp_render_cmd_desc { enum gp_render_cmd_kind kind; union { struct { struct xform xf; struct sprite_tag sprite; struct gp_resource *texture; struct clip_rect clip; u32 tint; b32 is_light; struct v3 light_emittance; i32 grid_cmd_id; } material; struct { struct xform xf; struct sprite_tag sprite; struct gp_resource *texture; struct clip_rect clip; u32 tint; } ui_rect; struct { struct v2_array vertices; struct gp_indices indices; u32 color; } ui_shape; struct { 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 gp_render_params { struct v2i32 ui_size; struct v2i32 render_size; struct xform world_to_render_xf; struct xform render_to_ui_xf; b32 effects_disabled; }; struct gp_render_sig *gp_render_sig_alloc(void); /* Returns a cmd id internal to the sig */ i32 gp_push_render_cmd(struct gp_render_sig *render_sig, struct gp_render_cmd_desc *desc); struct gp_resource *gp_run_render(struct gp_render_sig *render_sig, struct gp_render_params render_params); /* ========================== * * Memory info * ========================== */ struct gp_memory_info { u64 local_used; u64 local_budget; u64 non_local_used; u64 non_local_budget; }; struct gp_memory_info gp_query_memory_info(void); /* ========================== * * Swapchain * ========================== */ struct gp_swapchain *gp_swapchain_alloc(struct sys_window *window, struct v2i32 resolution); void gp_swapchain_release(struct gp_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(struct gp_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` (applied to centered unit square) * 3. Presents the backbuffer */ void gp_present(struct gp_swapchain *gp_swapchain, struct v2i32 backbuffer_resolution, struct gp_resource *texture, struct xform texture_xf, i32 vsync); #endif