Skip to content

Commit d9b3a8f

Browse files
committed
od_get_stats
1 parent 44d29a0 commit d9b3a8f

3 files changed

Lines changed: 70 additions & 36 deletions

File tree

lib/onedraw.c

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
#define COLINEAR_THRESHOLD (.1f)
5252
#define BUFFER_FRAME_COUNT (3)
5353
#define TILE_SIZE (16)
54-
#define MAX_NODES_COUNT (1U<<22)
54+
#define MAX_NODES_COUNT (1U<<20)
5555
#define MAX_COMMANDS (1U<<16)
5656
#define MAX_DRAWDATA (MAX_COMMANDS*4)
5757
#define MAX_CLIPS (256)
@@ -518,6 +518,12 @@ void dynamic_buffer_upload(WGPUQueue queue, dynamic_buffer* b, uint32_t index)
518518
wgpuQueueWriteBuffer(queue, b->buffers[index], 0, b->cpu_buffer, b->num_elements * b->element_size);
519519
}
520520

521+
//-----------------------------------------------------------------------------------------------------------------------------
522+
size_t dynamic_buffer_get_gpu_mem(const dynamic_buffer* b)
523+
{
524+
return BUFFER_FRAME_COUNT * b->element_size * b->num_elements_max;
525+
}
526+
521527
//-----------------------------------------------------------------------------------------------------------------------------
522528
void dynamic_buffer_terminate(struct onedraw* r, dynamic_buffer* b)
523529
{
@@ -1155,17 +1161,20 @@ struct onedraw* od_init(const onedraw_def* def)
11551161
struct onedraw* r = mem_interface.malloc_fn(sizeof(struct onedraw), mem_interface.user);
11561162
assert(def->device != NULL);
11571163

1158-
// clear everything to zero
1159-
*r = (struct onedraw) {0};
1160-
1161-
r->mem_interface = mem_interface;
1162-
r->custom_log = def->log_func;
1163-
r->device = def->device;
1164-
r->rasterizer.srgb_rendertarget = def->srgb_rendertarget;
1165-
r->rasterizer.aa_width = VEC2_SQR2;
1166-
r->rasterizer.clear_rendertarget = def->clear_rendertarget;
1167-
r->rasterizer.clear_color = (vec4) {.x = 0.f, .y = 0.f, .z = 0.f, .w = 1.f};
1168-
r->queue = wgpuDeviceGetQueue(r->device);
1164+
*r = (struct onedraw)
1165+
{
1166+
.mem_interface = mem_interface,
1167+
.custom_log = def->log_func,
1168+
.device = def->device,
1169+
.rasterizer =
1170+
{
1171+
.srgb_rendertarget = def->srgb_rendertarget,
1172+
.aa_width = VEC2_SQR2,
1173+
.clear_rendertarget = def->clear_rendertarget,
1174+
.clear_color = (vec4) {.x = 0.f, .y = 0.f, .z = 0.f, .w = 1.f}
1175+
},
1176+
.queue = wgpuDeviceGetQueue(def->device)
1177+
};
11691178
assert_msg(r->queue != NULL, "cannot create queue from device");
11701179

11711180
// resource creation
@@ -1203,7 +1212,6 @@ struct onedraw* od_init(const onedraw_def* def)
12031212
build_layout(r);
12041213
build_bind_groups(r);
12051214
build_pso(r, def->surface_format);
1206-
// od_build_depthstencil_state(r);
12071215

12081216
return r;
12091217
}
@@ -1397,17 +1405,32 @@ void od_terminate(struct onedraw* r)
13971405
SAFE_RELEASE(r->tiles.counters, wgpuBufferRelease);
13981406
SAFE_RELEASE(r->tiles.nodes, wgpuBufferRelease);
13991407
SAFE_RELEASE(r->tiles.heads, wgpuBufferRelease);
1408+
SAFE_RELEASE(r->tiles.indices, wgpuBufferRelease);
1409+
SAFE_RELEASE(r->tiles.indirect_draw_params, wgpuBufferRelease);
14001410
SAFE_RELEASE(r->rasterizer.pso, wgpuRenderPipelineRelease);
14011411
SAFE_RELEASE(r->tiles.binning_pso, wgpuComputePipelineRelease);
14021412
SAFE_RELEASE(r->tiles.write_indirect_buffer_pso, wgpuComputePipelineRelease);
14031413
r->mem_interface.free_fn(r, r->mem_interface.user);
14041414
}
14051415

14061416
//----------------------------------------------------------------------------------------------------------------------------
1407-
void od_get_stats(struct onedraw* r, od_stats* stats)
1408-
{
1409-
UNUSED_VARIABLE(r);
1410-
UNUSED_VARIABLE(stats);
1417+
void od_get_stats(const struct onedraw* r, od_stats* stats)
1418+
{
1419+
stats->frame_index = r->stats.frame_index;
1420+
stats->gpu_memory_usage = dynamic_buffer_get_gpu_mem(&r->commands.aabb);
1421+
stats->gpu_memory_usage += dynamic_buffer_get_gpu_mem(&r->commands.clipshapes);
1422+
stats->gpu_memory_usage += dynamic_buffer_get_gpu_mem(&r->commands.colors);
1423+
stats->gpu_memory_usage += dynamic_buffer_get_gpu_mem(&r->commands.float_data);
1424+
stats->gpu_memory_usage += dynamic_buffer_get_gpu_mem(&r->commands.list);
1425+
stats->gpu_memory_usage += dynamic_buffer_get_gpu_mem(&r->commands.draw_args);
1426+
stats->gpu_memory_usage += wgpuBufferGetSize(r->font.glyphs);
1427+
stats->gpu_memory_usage += wgpuBufferGetSize(r->tiles.counters);
1428+
stats->gpu_memory_usage += wgpuBufferGetSize(r->tiles.heads);
1429+
stats->gpu_memory_usage += wgpuBufferGetSize(r->tiles.indices);
1430+
stats->gpu_memory_usage += wgpuBufferGetSize(r->tiles.indirect_draw_params);
1431+
stats->gpu_memory_usage += wgpuBufferGetSize(r->tiles.nodes);
1432+
stats->gpu_memory_usage += r->font.desc.texture_width * r->font.desc.texture_height;
1433+
stats->gpu_memory_usage += r->atlas.width * r->atlas.height * r->atlas.num_slices * 4; // assuming atlas is RGBA8
14111434
}
14121435

14131436
//----------------------------------------------------------------------------------------------------------------------------
@@ -1471,6 +1494,26 @@ void private_draw_disc(struct onedraw* r, vec2 center, float radius, float thick
14711494
DB_PUSH(&r->commands.aabb, quantized_aabb, aabb);
14721495
}
14731496

1497+
//-----------------------------------------------------------------------------------------------------------------------------
1498+
float od_get_text_height(const struct onedraw* r)
1499+
{
1500+
return r->font.desc.font_height;
1501+
}
1502+
1503+
//-----------------------------------------------------------------------------------------------------------------------------
1504+
float od_get_text_width(const struct onedraw* r, const char* text)
1505+
{
1506+
float width = 0.f;
1507+
for(const char *c = text; *c != 0; c++)
1508+
{
1509+
if (*c >= r->font.desc.first_glyph && *c <= (r->font.desc.first_glyph + r->font.desc.num_glyphs))
1510+
width += r->font.desc.glyphs[*c - r->font.desc.first_glyph].advance_x;
1511+
else
1512+
width += r->font.desc.glyphs['_'- r->font.desc.first_glyph].advance_x * .65f;
1513+
}
1514+
return width;
1515+
}
1516+
14741517
//----------------------------------------------------------------------------------------------------------------------------
14751518
void od_draw_ring(struct onedraw* r, float cx, float cy, float radius, float thickness, draw_color color)
14761519
{
@@ -1748,10 +1791,7 @@ void od_draw_arc(struct onedraw* r, float cx, float cy, float dx, float dy, floa
17481791
//-----------------------------------------------------------------------------------------------------------------------------
17491792
void od_draw_box(struct onedraw* r, float x0, float y0, float x1, float y1, float radius, draw_color srgb_color)
17501793
{
1751-
if ((r->commands.float_data.num_elements + 5 >= r->commands.float_data.num_elements_max) ||
1752-
(r->commands.colors.num_elements >= r->commands.colors.num_elements_max) ||
1753-
(r->commands.list.num_elements >= r->commands.list.num_elements_max) ||
1754-
(r->commands.aabb.num_elements >= r->commands.aabb.num_elements_max))
1794+
if (buffers_are_full(r, 5))
17551795
{
17561796
od_log(r, "buffers for primitive are full, expect graphical artefacts");
17571797
return;
@@ -1784,10 +1824,7 @@ void od_draw_box(struct onedraw* r, float x0, float y0, float x1, float y1, floa
17841824
//-----------------------------------------------------------------------------------------------------------------------------
17851825
void od_draw_blurred_box(struct onedraw* r, float cx, float cy, float width, float height, float roundness, draw_color srgb_color)
17861826
{
1787-
if ((r->commands.float_data.num_elements + 5 >= r->commands.float_data.num_elements_max) ||
1788-
(r->commands.colors.num_elements >= r->commands.colors.num_elements_max) ||
1789-
(r->commands.list.num_elements >= r->commands.list.num_elements_max) ||
1790-
(r->commands.aabb.num_elements >= r->commands.aabb.num_elements_max))
1827+
if (buffers_are_full(r, 5))
17911828
{
17921829
od_log(r, "buffers for primitive are full, expect graphical artefacts");
17931830
return;
@@ -1822,10 +1859,7 @@ void od_draw_char(struct onedraw* r, float x, float y, char c, draw_color srgb_c
18221859
if (c < r->font.desc.first_glyph || c > (r->font.desc.first_glyph + r->font.desc.num_glyphs))
18231860
return;
18241861

1825-
if ((r->commands.float_data.num_elements + 2 >= r->commands.float_data.num_elements_max) ||
1826-
(r->commands.colors.num_elements >= r->commands.colors.num_elements_max) ||
1827-
(r->commands.list.num_elements >= r->commands.list.num_elements_max) ||
1828-
(r->commands.aabb.num_elements >= r->commands.aabb.num_elements_max))
1862+
if (buffers_are_full(r, 2))
18291863
{
18301864
od_log(r, "buffers for primitive are full, expect graphical artefacts");
18311865
return;

lib/onedraw.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ void od_terminate(struct onedraw* r);
164164
//-----------------------------------------------------------------------------------------------------------------------------
165165
// Fill the od_stats structure with latest data
166166
// [stats] non-NULL pointer to the structure
167-
void od_get_stats(struct onedraw* r, od_stats* stats);
167+
void od_get_stats(const struct onedraw* r, od_stats* stats);
168168

169169
//-----------------------------------------------------------------------------------------------------------------------------
170170
// Sets the clear color
@@ -199,11 +199,11 @@ void od_end_group(struct onedraw* r, draw_color outline_color);
199199

200200
//-----------------------------------------------------------------------------------------------------------------------------
201201
// Returns the height of the font in pixels
202-
float od_text_height(struct onedraw* r);
202+
float od_get_text_height(const struct onedraw* r);
203203

204204
//-----------------------------------------------------------------------------------------------------------------------------
205205
// Returns the width of the string [text] in pixels
206-
float od_text_width(struct onedraw* r, const char* text);
206+
float od_get_text_width(const struct onedraw* r, const char* text);
207207

208208
//-----------------------------------------------------------------------------------------------------------------------------
209209
// Draws a ring (circle)

tests/test.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ void all_primitives(float width, float height)
261261
od_draw_text(renderer, cx-radius, cy-radius*1.25f, "capsule_gradient", miya_brown);
262262

263263

264-
// od_stats stats;
265-
// od_get_stats(renderer, &stats);
266-
// snprintf(string, 256, "GPU Memory usage : %zu kb", stats.gpu_memory_usage>>10);
267-
// od_draw_text(renderer, 0, sapp_heightf() - od_text_height(renderer) * 2.f, string, miya_blue);
264+
od_stats stats;
265+
od_get_stats(renderer, &stats);
266+
snprintf(string, 256, "GPU Memory usage : %zu kb", stats.gpu_memory_usage>>10);
267+
od_draw_text(renderer, 0, height - od_get_text_height(renderer) * 2.f, string, miya_blue);
268268

269269
// snprintf(string, 256, "num commands : %u", stats.peak_num_draw_cmd);
270270
// od_draw_text(renderer, (sapp_widthf() - od_text_width(renderer, string)) * .5f,

0 commit comments

Comments
 (0)