#ifndef PROF_H #define PROF_H #if PROFILING #if COMPILER_MSVC # error "MSVC not supported for profiling (cleanup attributes are required for profiling markup)" #endif #define PROFILING_SYSTEM_TRACE 0 #define PROFILING_CAPTURE_FRAME_IMAGE 0 #define PROFILING_LOCKS 0 #define PROFILING_GPU 1 #define PROFILING_GPU_STABLE_POWER_STATE 1 //#define PROFILER_THREAD_AFFINITY_MASK 0x000000000000F000ull #define PROFILER_THREAD_AFFINITY_MASK 0 #define PROFILER_THREAD_PREFIX_WSTR L"Tracy" #define PROFILING_FILE_WSTR L".tracy" #define PROFILING_CMD_WSTR L"cmd /C start \"\" /wait tracy-capture.exe -o .tracy -a 127.0.0.1 && start \"\" tracy-profiler.exe .tracy" //#define PROFILING_CMD_WSTR L"tracy-profiler.exe -a 127.0.0.1" /* Tracy defines */ #define TRACY_ENABLE #define TRACY_FIBERS #if !PROFILING_SYSTEM_TRACE # define TRACY_NO_CALLSTACK # define TRACY_NO_SYSTEM_TRACING #endif /* Include tracy client */ #pragma clang diagnostic ignored "-Wshadow" #pragma clang diagnostic ignored "-Wextra-semi" #pragma clang diagnostic ignored "-Wextra-semi-stmt" #pragma clang diagnostic ignored "-Wpointer-sign" #pragma clang diagnostic ignored "-Wincompatible-pointer-types-discards-qualifiers" #include TRACY_CLIENT_HEADER_PATH INLINE void __prof_zone_cleanup_func(TracyCZoneCtx *ctx) { TracyCZoneEnd(*ctx) } #define __profnc(name, color) static const struct ___tracy_source_location_data CAT(__tracy_source_location,__LINE__) = { (name), __func__, __FILE__, (uint32_t)__LINE__, BGR32(color) }; __attribute((cleanup(__prof_zone_cleanup_func))) TracyCZoneCtx __tracy_zone_ctx = ___tracy_emit_zone_begin( &CAT(__tracy_source_location,__LINE__), 1 ) #define __profn(name) __profnc(name, 0) #define __prof __profnc(0, 0) #define __profvalue(v) TracyCZoneValue(__tracy_zone_ctx, (v)) #define __profalloc(ptr, size) TracyCAlloc((ptr), (size)) #define __proffree(ptr) TracyCFree((ptr)) #define __profmsg(txt, len, col) TracyCMessageC((txt), (len), BGR32(col)) #define __profframe(name) TracyCFrameMarkNamed((name)) #define __profthread(name, group_hint) TracyCSetThreadNameWithHint((name), (group_hint)) enum __prof_plot_type { __prof_plot_type_number = TracyPlotFormatNumber, __prof_plot_type_memory = TracyPlotFormatMemory, __prof_plot_type_percentage = TracyPlotFormatPercentage, __prof_plot_type_watt = TracyPlotFormatWatt }; #define __prof_plot_init(name, type, step, fill, color) TracyCPlotConfig(name, type, step, fill, BGR32(color)) #define __prof_plot(name, val) TracyCPlot(name, val) #define __prof_plot_i(name, val) TracyCPlotI(name, val) #define __prof_is_connected() ___tracy_connected() #else #define PROFILING_CAPTURE_FRAME_IMAGE 0 #define PROFILING_LOCKS 0 #define PROFILING_GPU 0 #define __profnc(name, color) #define __profn(name) #define __prof #define __profvalue(v) #define __profalloc(ptr, size) #define __proffree(ptr) #define __profmsg(txt, len, col) #define __profframe(name) #define __profthread(name, group_hint) #define __prof_plot_init(name, type, step, fill, color) #define __prof_plot(name, val) #define __prof_plot_i(name, val) #define __prof_is_connected() 0 #endif /* PROFILING */ #if PROFILING_LOCKS # define __proflock_ctx(name) struct TracyCSharedLockCtx *name # define __proflock_alloc(ctx) TracyCSharedLockAnnounce((ctx)) # define __proflock_release(ctx) TracyCSharedLockTerminate((ctx)) # define __proflock_before_exclusive_lock(ctx) TracyCSharedLockBeforeExclusiveLock((ctx)) # define __proflock_after_exclusive_lock(ctx) TracyCSharedLockAfterExclusiveLock((ctx)) # define __proflock_after_exclusive_unlock(ctx) TracyCSharedLockAfterExclusiveUnlock((ctx)) # define __proflock_after_try_exclusive_lock(ctx, acquired) TracyCSharedLockAfterTryExclusiveLock((ctx), (acquired)) # define __proflock_before_shared_lock(ctx) TracyCSharedLockBeforeSharedLock((ctx)) # define __proflock_after_shared_lock(ctx) TracyCSharedLockAfterSharedLock((ctx)) # define __proflock_after_shared_unlock(ctx) TracyCSharedLockAfterSharedUnlock((ctx)) # define __proflock_after_try_shared_lock(ctx, acquired) TracyCSharedLockAfterTrySharedLock((ctx), (acquired)) # define __proflock_mark(ctx) TracyCSharedLockMark((ctx)) # define __proflock_custom_name(ctx, name, len) TracyCSharedLockCustomName((ctx), (name), (len)) #else # define __proflock_alloc(ctx) # define __proflock_release(ctx) # define __proflock_before_exclusive_lock(ctx) # define __proflock_after_exclusive_lock(ctx) # define __proflock_after_exclusive_unlock(ctx) # define __proflock_after_try_exclusive_lock(ctx, acquired) # define __proflock_before_shared_lock(ctx) # define __proflock_after_shared_lock(ctx) # define __proflock_after_shared_unlock(ctx) # define __proflock_after_try_shared_lock(ctx, acquired) # define __proflock_mark(ctx) # define __proflock_custom_name(ctx, name, len) #endif /* PROFILING && PROFILING_LOCKS */ #if PROFILING_GPU /* Dx11 */ INLINE void __prof_dx11_zone_cleanup_func(TracyCD3D11ZoneCtx *ctx) { ___tracy_d3d11_emit_zone_end(*ctx); } # define __profnc_dx11(dx11_ctx, name, color) static const struct ___tracy_source_location_data CAT(__tracy_gpu_d3d11_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, BGR32(color) }; __attribute((cleanup(__prof_dx11_zone_cleanup_func))) TracyCD3D11ZoneCtx __tracy_d3d11_zone_ctx; ___tracy_d3d11_emit_zone_begin( dx11_ctx, &__tracy_d3d11_zone_ctx, &CAT(__tracy_gpu_d3d11_source_location,__LINE__), 1) # define __prof_dx11_ctx(name) struct TracyCD3D11Ctx *name # define __prof_dx11_ctx_alloc(ctx, device, device_ctx, name, name_len) ctx = ___tracy_d3d11_context_announce(device, device_ctx, name, name_len) # define __prof_dx11_ctx_release(ctx) ___tracy_d3d11_context_terminate(ctx) # define __prof_dx11_collect(ctx) ___tracy_d3d11_context_collect(ctx) /* Dx12 */ INLINE void __prof_dx12_zone_cleanup_func(TracyCD3D12ZoneCtx *ctx) { ___tracy_d3d12_emit_zone_end(*ctx); } # define __profnc_dx12(dx12_ctx, cmd_list, name, color) static const struct ___tracy_source_location_data CAT(__tracy_gpu_d3d12_source_location,__LINE__) = { name, __func__, __FILE__, (uint32_t)__LINE__, BGR32(color) }; __attribute((cleanup(__prof_dx12_zone_cleanup_func))) TracyCD3D12ZoneCtx __tracy_d3d12_zone_ctx; ___tracy_d3d12_emit_zone_begin( dx12_ctx, cmd_list, &__tracy_d3d12_zone_ctx, &CAT(__tracy_gpu_d3d12_source_location,__LINE__), 1) # define __prof_dx12_ctx(name) struct TracyCD3D12Ctx *name # define __prof_dx12_ctx_alloc(ctx, device, queue, name, name_len) ctx = ___tracy_d3d12_context_announce(device, queue, name, name_len) # define __prof_dx12_ctx_release(ctx) ___tracy_d3d12_context_terminate(ctx) # define __prof_dx12_new_frame(ctx) ___tracy_d3d12_context_new_frame(ctx) # define __prof_dx12_collect(ctx) ___tracy_d3d12_context_collect(ctx) #else # define __profnc_dx11(dx11_ctx, name, color) # define __prof_dx11_ctx_alloc(ctx, device, device_ctx, name, name_len) # define __prof_dx11_ctx_release(ctx) # define __prof_dx11_collect(ctx) # define __profnc_dx12(dx11_ctx, queue, name, color) # define __prof_dx12_ctx_alloc(ctx, device, queue, name, name_len) # define __prof_dx12_ctx_release(ctx) # define __prof_dx12_new_frame(ctx) # define __prof_dx12_collect(ctx) #endif /* PROFILING_GPU */ #if PROFILING_CAPTURE_FRAME_IMAGE # define __profframeimage(image, width, height, offset, flipped) TracyCFrameImage((image), (width), (height), (offset), (flipped)) #else # define __profframeimage(image, width, height, offset, flipped) #endif /* PROFILING_CAPTURE_FRAME_IMAGE */ #ifdef TRACY_FIBERS /* Tracy fiber methods are wrapped in FORCE_NO_INLINE because otherwise issues can arise * accross fiber context boundaries during optimization */ FORCE_NO_INLINE INLINE void __prof_fiber_enter(char *fiber_name, i32 profiler_group) { TracyCFiberEnterWithHint(fiber_name, profiler_group); } FORCE_NO_INLINE INLINE void __prof_fiber_leave(void) { TracyCFiberLeave; } #else # define __prof_fiber_enter(fiber_name, profiler_group) # define __prof_fiber_leave() #endif #endif