Drawing API
A drawing API in a graphical application is built on top of a renderer API and distinguishes itself by being concerned with higher-level, cross-platform ways of issuing draw commands of e.g. shapes, lines and text (as opposed to vertices, buffers etc.). The distinction may blur when such functions are part of the renderer API.
Design
Buckets
- Idea: Encapsulate a command buffer in a data structure called bucket
- …
typedef struct D_Bucket D_Bucket; struct D_Bucket { R_PassList passes; // pass list // pass parameter stacks U64 last_cmd_stack_gen; U64 current_stack_gen; D_DeclBucketStacks; };
API
void D_BeginFrame(); void D_EndFrame(); D_Bucket *D_BucketMake(Arena *arena); void D_BucketConcatInPlace(D_Bucket *to_push); void D_PushBucket(Arena *arena, D_Bucket *bucket); void D_PopBucket(void); #define D_BucketScope(arena, bucket) DeferLoop(D_PushBucket((arena), (bucket)), D_PopBucket()) Arena *D_ActiveArena(void); D_Bucket *D_ActiveBucket(void); void D_Submit(R_Handle window_r, D_Bucket *bucket); // text drawing F32 D_Text2D(Vec2F32 position, F_Tag font, F32 size, Vec4F32 color, String8 string); F32 D_Text2DF(Vec2F32 position, F_Tag font, F32 size, Vec4F32 color, char *fmt, ...);