#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); /* ========================== * * 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); /* ========================== * * Cmd buffer * ========================== */ struct gpu_indices { u16 count; u16 *indices; }; enum gpu_cmd_kind { GPU_CMD_KIND_NONE, GPU_CMD_KIND_DRAW_MESH, GPU_CMD_KIND_DRAW_TEXTURE, GPU_CMD_KIND_DRAW_GRID, NU }; struct gpu_cmd_params { enum gpu_cmd_kind kind; union { 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; } 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 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); void gpu_run_cmds(struct gpu_cmd_store gpu_cmd_store, struct gpu_texture target, struct xform view, struct rect viewport); #endif