#pragma once #include "pxl8_colormap.h" #include "pxl8_render_types.h" #include "pxl8_shader.h" #ifndef PXL8_GFX_ENABLE_STATS #define PXL8_GFX_ENABLE_STATS 1 #endif #ifdef __cplusplus extern "C" { #endif typedef struct pxl8_renderer pxl8_renderer; typedef struct pxl8_gfx_cmdbuf pxl8_gfx_cmdbuf; typedef struct pxl8_gfx_stats { u64 draw_calls; u64 triangles; u64 clipped_triangles; u64 depth_tests; u64 depth_passes; u64 shader_calls; u64 pixels_written; u64 light_writes; u64 submit_ns; u64 execute_draw_ns; u64 raster_ns; } pxl8_gfx_stats; pxl8_renderer* pxl8_renderer_create(u32 width, u32 height); void pxl8_renderer_destroy(pxl8_renderer* r); void pxl8_renderer_set_shader(pxl8_renderer* r, pxl8_shader_fn fn); void pxl8_renderer_reset_stats(pxl8_renderer* r); const pxl8_gfx_stats* pxl8_renderer_get_stats(const pxl8_renderer* r); u32 pxl8_renderer_get_width(const pxl8_renderer* r); u32 pxl8_renderer_get_height(const pxl8_renderer* r); pxl8_gfx_bindings pxl8_create_bindings(pxl8_renderer* r, const pxl8_gfx_bindings_desc* desc); pxl8_gfx_buffer pxl8_create_buffer(pxl8_renderer* r, const pxl8_gfx_buffer_desc* desc); pxl8_gfx_pass pxl8_create_pass(pxl8_renderer* r, const pxl8_gfx_pass_desc* desc); pxl8_gfx_pipeline pxl8_create_pipeline(pxl8_renderer* r, const pxl8_gfx_pipeline_desc* desc); pxl8_gfx_texture pxl8_create_texture(pxl8_renderer* r, const pxl8_gfx_texture_desc* desc); void pxl8_destroy_bindings(pxl8_renderer* r, pxl8_gfx_bindings bnd); void pxl8_destroy_buffer(pxl8_renderer* r, pxl8_gfx_buffer buf); void pxl8_destroy_pass(pxl8_renderer* r, pxl8_gfx_pass pass); void pxl8_destroy_pipeline(pxl8_renderer* r, pxl8_gfx_pipeline pip); void pxl8_destroy_texture(pxl8_renderer* r, pxl8_gfx_texture tex); void pxl8_update_buffer(pxl8_renderer* r, pxl8_gfx_buffer buf, const pxl8_gfx_range* data); i32 pxl8_append_buffer(pxl8_renderer* r, pxl8_gfx_buffer buf, const pxl8_gfx_range* data); void pxl8_update_texture(pxl8_renderer* r, pxl8_gfx_texture tex, const pxl8_gfx_range* data, u32 x, u32 y, u32 w, u32 h); void* pxl8_buffer_ptr(pxl8_renderer* r, pxl8_gfx_buffer buf); u32 pxl8_buffer_size(pxl8_renderer* r, pxl8_gfx_buffer buf); void* pxl8_texture_get_data(pxl8_renderer* r, pxl8_gfx_texture tex); u32 pxl8_texture_get_width(pxl8_renderer* r, pxl8_gfx_texture tex); u32 pxl8_texture_get_height(pxl8_renderer* r, pxl8_gfx_texture tex); pxl8_gfx_texture_format pxl8_texture_get_format(pxl8_renderer* r, pxl8_gfx_texture tex); pxl8_gfx_cmdbuf* pxl8_cmdbuf_create(u32 capacity); void pxl8_cmdbuf_destroy(pxl8_gfx_cmdbuf* cb); void pxl8_cmdbuf_reset(pxl8_gfx_cmdbuf* cb); void pxl8_begin_pass(pxl8_gfx_cmdbuf* cb, pxl8_gfx_pass pass); void pxl8_end_pass(pxl8_gfx_cmdbuf* cb); void pxl8_set_bindings(pxl8_gfx_cmdbuf* cb, pxl8_gfx_bindings bindings); void pxl8_set_draw_params(pxl8_gfx_cmdbuf* cb, const pxl8_gfx_cmd_draw_params* p); void pxl8_set_pipeline(pxl8_gfx_cmdbuf* cb, pxl8_gfx_pipeline pipeline); void pxl8_set_scissor(pxl8_gfx_cmdbuf* cb, i32 x, i32 y, u32 w, u32 h); void pxl8_set_viewport(pxl8_gfx_cmdbuf* cb, i32 x, i32 y, u32 w, u32 h); void pxl8_draw(pxl8_gfx_cmdbuf* cb, pxl8_gfx_buffer vb, pxl8_gfx_buffer ib, u32 first, u32 count, u32 base_vertex); void pxl8_gfx_submit(pxl8_renderer* r, pxl8_gfx_cmdbuf* cb); void pxl8_clear(pxl8_renderer* r, pxl8_gfx_texture target, u8 color); void pxl8_clear_depth(pxl8_renderer* r, pxl8_gfx_texture target); void pxl8_clear_light(pxl8_renderer* r, pxl8_gfx_texture target); void pxl8_draw_pixel(pxl8_renderer* r, pxl8_gfx_texture target, i32 x, i32 y, u8 color); u8 pxl8_get_pixel(pxl8_renderer* r, pxl8_gfx_texture target, i32 x, i32 y); void pxl8_draw_line(pxl8_renderer* r, pxl8_gfx_texture target, i32 x0, i32 y0, i32 x1, i32 y1, u8 color); void pxl8_draw_rect(pxl8_renderer* r, pxl8_gfx_texture target, i32 x, i32 y, i32 w, i32 h, u8 color); void pxl8_draw_rect_fill(pxl8_renderer* r, pxl8_gfx_texture target, i32 x, i32 y, i32 w, i32 h, u8 color); void pxl8_draw_circle(pxl8_renderer* r, pxl8_gfx_texture target, i32 cx, i32 cy, i32 radius, u8 color); void pxl8_draw_circle_fill(pxl8_renderer* r, pxl8_gfx_texture target, i32 cx, i32 cy, i32 radius, u8 color); void pxl8_resolve_to_rgba(pxl8_renderer* r, pxl8_gfx_texture color, pxl8_gfx_texture light_accum, const u32* palette, u32* output); #ifdef __cplusplus } #endif