-#ifndef VG_PROFILER_H
-#define VG_PROFILER_H
-
-#define VG_GAME
-#include "vg.h"
+#pragma once
#include "vg_platform.h"
-
+#include "vg_imgui.h"
#define VG_PROFILE_SAMPLE_COUNT 128
-static int vg_profiler = 0;
+extern int vg_profiler;
struct vg_profile
{
u64 start;
};
-VG_STATIC void vg_profile_begin( struct vg_profile *profile )
-{
- profile->start = SDL_GetPerformanceCounter();
-}
-
-VG_STATIC void vg_profile_increment( struct vg_profile *profile )
-{
- profile->buffer_current ++;
-
- if( profile->buffer_count < VG_PROFILE_SAMPLE_COUNT )
- profile->buffer_count ++;
-
- if( profile->buffer_current >= VG_PROFILE_SAMPLE_COUNT )
- profile->buffer_current = 0;
-
- profile->samples[ profile->buffer_current ] = 0;
-}
-
-VG_STATIC void vg_profile_end( struct vg_profile *profile )
-{
- u64 time_end = SDL_GetPerformanceCounter(),
- delta = time_end - profile->start;
-
- if( profile->mode == k_profile_mode_frame ){
- profile->samples[ profile->buffer_current ] = delta;
- vg_profile_increment( profile );
- }
- else{
- profile->samples[ profile->buffer_current ] += delta;
- }
-}
-
-#if 0
-VG_STATIC void vg_profile_drawn( struct vg_profile **profiles, u32 count,
- float budget, ui_rect panel, u32 colour_offset )
-{
- if( !vg_profiler )
- return;
-
- if( panel[2] == 0 )
- panel[2] = 256;
-
- if( panel[3] == 0 )
- panel[3] = VG_PROFILE_SAMPLE_COUNT * 2;
-
- float sh = panel[3] / VG_PROFILE_SAMPLE_COUNT,
- sw = panel[2];
-
- ui_fill_rect( panel, 0xa0000000 );
-
- assert( count <= 8 );
- double avgs[8];
- int ptrs[8];
-
- for( int i=0; i<count; i++ ){
- ptrs[i] = profiles[i]->buffer_current;
- avgs[i] = 0.0f;
- }
-
- u32 colours[] = { 0xff0000ff, 0xff00ff00, 0xff00ffff, 0xffff0000,
- 0xffff00ff, 0xffffff00 };
-
- double rate_mul = 1000.0 / (double)SDL_GetPerformanceFrequency();
-
- for( int i=0; i<VG_PROFILE_SAMPLE_COUNT-1; i++ ){
- double total = 0.0;
-
- for( int j=0; j<count; j++ ){
- ptrs[j] --;
-
- if( ptrs[j] < 0 )
- ptrs[j] = VG_PROFILE_SAMPLE_COUNT-1;
-
- double sample = (double)profiles[j]->samples[ptrs[j]] * rate_mul,
- px = (total / (budget)) * sw,
- wx = (sample / (budget)) * sw;
-
- ui_rect block = { panel[0] + px, panel[1] + (float)i*sh,
- wx, sh };
-
- u32 colour = colours[ (j+colour_offset) % vg_list_size(colours) ];
- ui_fill_rect( block, colour );
-
- total += sample;
- avgs[j] += sample;
- }
- }
-
- char infbuf[64];
-
- snprintf( infbuf, 64, "accuracy: %.7fms", rate_mul );
- ui_text( (ui_rect){ panel[0] + 4,
- panel[1] + 0 * 14, 0, 0 },
- infbuf,
- 1,
- k_text_align_left );
-
- for( int i=0; i<count; i++ ){
- snprintf( infbuf, 64, "%.4fms %s",
- avgs[i] * (1.0f/(VG_PROFILE_SAMPLE_COUNT-1)),
- profiles[i]->name );
-
- ui_text( (ui_rect){ panel[0] + panel[2] + 4,
- panel[1] + i * 14, 0, 0 },
- infbuf,
- 1,
- k_text_align_left );
- }
-}
-#endif
-
-VG_STATIC void vg_profiler_init(void)
-{
- VG_VAR_I32( vg_profiler, flags=VG_VAR_PERSISTENT );
-}
-
-#endif /* VG_PROFILER_H */
+void vg_profile_begin( struct vg_profile *profile );
+void vg_profile_increment( struct vg_profile *profile );
+void vg_profile_end( struct vg_profile *profile );
+void vg_profile_drawn( struct vg_profile **profiles, u32 count,
+ f64 budget, ui_rect panel,
+ int dir, i32 normalize );
+void vg_profiler_init(void);