|
|
|
(set-cakelisp-option cakelisp-src-dir "Dependencies/cakelisp/src")
|
|
|
|
(add-cakelisp-search-directory "Dependencies/cakelisp/runtime")
|
|
|
|
|
|
|
|
(import "ComptimeHelpers.cake" "Dependencies.cake" "BuildTools.cake")
|
|
|
|
|
|
|
|
(c-import &with-decls "Tracy.hpp" "TracyC.h")
|
|
|
|
|
|
|
|
(defmacro scope-timed (scope-label string &rest body any)
|
|
|
|
(tokenize-push output
|
|
|
|
(scope
|
|
|
|
(ZoneScopedN (token-splice scope-label))
|
|
|
|
(token-splice-rest body tokens)))
|
|
|
|
(return true))
|
|
|
|
|
|
|
|
;; TODO: Move into Profiler.cake?
|
|
|
|
(defmacro time-this-scope (varname symbol &optional name string)
|
|
|
|
(if name
|
|
|
|
(tokenize-push output (ZoneNamedN (token-splice varname name) 1))
|
|
|
|
;; Doesn't work. Why not?
|
|
|
|
(tokenize-push output (ZoneNamed (token-splice varname) 1)))
|
|
|
|
(return true))
|
|
|
|
|
|
|
|
;; This needed to be a generator to output "FrameMark;" with no parens.
|
|
|
|
(defgenerator profiler-mark-frame (&optional name (arg-index string))
|
|
|
|
(if (!= -1 name)
|
|
|
|
(scope
|
|
|
|
(var define-statement (const ([] CStatementOperation))
|
|
|
|
(array
|
|
|
|
(array KeywordNoSpace "FrameMarkNamed" -1)
|
|
|
|
(array OpenParen null -1)
|
|
|
|
(array Expression null 1)
|
|
|
|
(array CloseParen null -1)
|
|
|
|
(array SmartEndStatement null -1)))
|
|
|
|
(return (c-statement-out define-statement)))
|
|
|
|
(scope
|
|
|
|
(var define-statement (const ([] CStatementOperation))
|
|
|
|
(array
|
|
|
|
(array KeywordNoSpace "FrameMark" -1)
|
|
|
|
(array SmartEndStatement null -1)))
|
|
|
|
(return (c-statement-out define-statement))))
|
|
|
|
(return true))
|
|
|
|
|
|
|
|
(defmacro timing-zone-start (varname symbol name string)
|
|
|
|
(tokenize-push output (TracyCZoneN (token-splice varname name) 1))
|
|
|
|
(return true))
|
|
|
|
|
|
|
|
(defmacro timing-zone-stop (varname symbol)
|
|
|
|
(tokenize-push output (TracyCZoneEnd (token-splice varname)))
|
|
|
|
(return true))
|
|
|
|
|
|
|
|
;;
|
|
|
|
;; Testing
|
|
|
|
;;
|
|
|
|
|
|
|
|
(comptime-cond
|
|
|
|
('auto-test
|
|
|
|
;; TODO: Linux only
|
|
|
|
(c-import "unistd.h")
|
|
|
|
|
|
|
|
(defun test--tracy-main (&return int)
|
|
|
|
(ZoneScopedN "main")
|
|
|
|
|
|
|
|
(fprintf stderr "Waiting for profiler to connect...\n")
|
|
|
|
(while (not (call-on IsConnected (call (in tracy GetProfiler))))
|
|
|
|
(ZoneScopedN "wait for profiler")
|
|
|
|
(sleep 1))
|
|
|
|
|
|
|
|
(var i int 0)
|
|
|
|
(var num-times (const int) 2)
|
|
|
|
(while (< i num-times)
|
|
|
|
(ZoneScopedN "hot loop")
|
|
|
|
(fprintf stderr "hot loop %d / %d\n" i num-times)
|
|
|
|
(sleep 1)
|
|
|
|
(incr i))
|
|
|
|
(return 0))))
|
|
|
|
|
|
|
|
;;
|
|
|
|
;; Building
|
|
|
|
;;
|
|
|
|
|
|
|
|
;; Note that Tracy does not need to be built for the final executable. It's an external tool
|
|
|
|
(defun-comptime build-tracy-profiler (manager (& ModuleManager) module (* Module) &return bool)
|
|
|
|
(comptime-cond
|
|
|
|
('Windows
|
|
|
|
(comptime-error "Tracy build needs to be ported to Windows. See manual at
|
|
|
|
https://github.com/wolfpld/tracy"))
|
|
|
|
('Unix
|
|
|
|
(when (fileExists "Dependencies/tracy/profiler/build/unix/Tracy-release")
|
|
|
|
(return true))
|
|
|
|
(run-process-sequential-or
|
|
|
|
("make" "-j4" :in-directory "Dependencies/tracy/profiler/build/unix")
|
|
|
|
(Log "error: failed to build Tracy profiler. Check the manual at https://github.com/wolfpld/tracy.
|
|
|
|
If this was a build after an update, delete the Dependencies/tracy/profiler/build/unix/obj/ directory
|
|
|
|
and try again")
|
|
|
|
(return false))
|
|
|
|
;; Final check
|
|
|
|
(when (fileExists "Dependencies/tracy/profiler/build/unix/Tracy-release")
|
|
|
|
(return true))))
|
|
|
|
(Log "error: did not build Tracy profiler. Is this platform unsupported? Was Tracy built in an
|
|
|
|
unexpected location?")
|
|
|
|
(return false))
|
|
|
|
|
|
|
|
(add-dependency-git-submodule clone-tracy "https://github.com/wolfpld/tracy" "Dependencies/tracy")
|
|
|
|
(add-compile-time-hook-module pre-build build-tracy-profiler)
|
|
|
|
|
|
|
|
(export-and-evaluate
|
|
|
|
(add-build-options "-DTRACY_ENABLE")
|
|
|
|
;; (add-build-options "-DTRACY_CALLSTACK=10") ;; TODO: Causes exit code 134, failing in tracy alloc
|
|
|
|
(add-c-search-directory-module "Dependencies/tracy"))
|
|
|
|
|
|
|
|
(add-c-search-directory-module "Dependencies/tracy")
|
|
|
|
(add-cpp-build-dependency "TracyClient.cpp")
|
|
|
|
|
|
|
|
(comptime-cond
|
|
|
|
('Unix
|
|
|
|
(add-library-dependency "pthread" "dl")))
|
|
|
|
|
|
|
|
(add-build-config-label "Profile")
|