From 84fbaaf7cd1264f246fa7bd31ce04fcbdebb0b51 Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 10 Dec 2025 22:00:04 -0600 Subject: [PATCH] working shader printf w/ formatting & logging --- src/base/base_string.c | 37 ++++++++++++++++------------ src/base/base_string.h | 12 --------- src/base/base_util.h | 14 ++++++----- src/base/base_win32/base_win32_log.c | 2 +- src/gpu/gpu_dx12/gpu_dx12_core.c | 7 +++++- src/gpu/gpu_shader_core.cgh | 11 +++++---- src/ui/ui_core.c | 25 +++++++++++-------- src/ui/ui_extras.c | 10 ++++---- src/ui/ui_extras.h | 4 +-- src/ui/ui_shaders.g | 2 +- 10 files changed, 65 insertions(+), 59 deletions(-) diff --git a/src/base/base_string.c b/src/base/base_string.c index e15f15dd..1ef8f07a 100644 --- a/src/base/base_string.c +++ b/src/base/base_string.c @@ -537,21 +537,21 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) result.text = ArenaNext(arena, u8); u8 *end = fmt.text + fmt.len; - b32 no_more_args = 0; + b32 no_more_valid_args = 0; u64 arg_idx = 0; for (u8 *c = fmt.text; c < end; ++c) { u8 *next = ((c + 1) < end) ? (c + 1) : (u8 *)"\0"; /* Escape '%%' */ - b32 escape = !no_more_args && *c == '%' && *next == '%'; + b32 escape = !no_more_valid_args && *c == '%' && *next == '%'; if (escape) { /* Skip the escaped '%' char from parsing */ ++c; } - if (!no_more_args && !escape && *c == '%' && *next == 'F') + if (!no_more_valid_args && !escape && *c == '%' && *next == 'F') { String parsed_arg = ZI; @@ -563,7 +563,7 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) } else { - no_more_args = 1; + no_more_valid_args = 1; } switch (arg.kind) @@ -573,7 +573,7 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) /* Unknown format type */ Assert(0); parsed_arg = PushString(arena, Lit("")); - no_more_args = 1; + no_more_valid_args = 1; } break; case FmtArgKind_Char: @@ -626,12 +626,12 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) /* Unexpected end. Not enough FMT args passed to function. */ Assert(0); parsed_arg = PushString(arena, Lit("")); - no_more_args = 1; + no_more_valid_args = 1; } break; } /* Update final string len / start */ - final_len += parsed_arg.len; + result.len += parsed_arg.len; /* Skip 'F' from parsing */ ++c; @@ -640,32 +640,37 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) { /* Parse character normally */ StringFromChar(arena, *c); - ++final_len; + ++result.len; } } #if IsRtcEnabled - if (!no_more_args) + if (!no_more_valid_args) { FmtArg last_arg = ZI; if (arg_idx < args.count) { last_arg = args.args[arg_idx]; + /* End arg not reached. Too many args supplied. */ + Assert(last_arg.kind == FmtArgKind_End); } - /* End arg not reached. Too many args supplied. */ - Assert(last_arg.kind == FmtArgKind_End); } #endif return result; } -String FormatStringV_(Arena *arena, String fmt, ...) +String StringF_(Arena *arena, String fmt, ...) { - va_list args; - va_start(args, fmt); - String result = FormatStringVL(arena, fmt, args); - va_end(args); + String result = ZI; + TempArena scratch = BeginScratch(arena); + { + va_list args; + va_start(args, fmt); + result = FormatString(arena, fmt, FmtArgsFromVaList(scratch.arena, args)); + va_end(args); + } + EndScratch(scratch); return result; } diff --git a/src/base/base_string.h b/src/base/base_string.h index d830f500..2fb13664 100644 --- a/src/base/base_string.h +++ b/src/base/base_string.h @@ -117,24 +117,12 @@ String StringFromList(Arena *arena, StringList l, String separator); #define FmtUid(v, ...) FMTARG(FmtArgKind_Uid, .value.uid = (v), __VA_ARGS__) #define FmtEnd FMTARG(FmtArgKind_End) /* Denotes end of VA list */ -// #define StringF(arena, lit, ...) FormatString_((arena), Lit(lit), __VA_ARGS__, FmtEnd) -// #define FormatString(arena, fmt, ...) FormatString_((arena), (fmt), __VA_ARGS__, FmtEnd) -// String FormatString_(Arena *arena, String fmt, ...); -// String FormatStringV(Arena *arena, String fmt, va_list args); - String FormatString(Arena *arena, String fmt, FmtArgArray args); String StringF_(Arena *arena, String fmt, ...); #define StringF(arena, lit, ...) StringF_((arena), Lit(lit), __VA_ARGS__, FmtEnd) FmtArgArray FmtArgsFromVaList(Arena *arena, va_list vl); - - - - - - - //////////////////////////////////////////////////////////// //~ Unicode diff --git a/src/base/base_util.h b/src/base/base_util.h index 64ca8782..b94ebb74 100644 --- a/src/base/base_util.h +++ b/src/base/base_util.h @@ -62,15 +62,17 @@ Inline u64 HashFnv64(u64 seed, String s) #define HashF(fmt_cstr, ...) HashF_(StringFromCstrNoLimit(fmt_cstr), __VA_ARGS__, FmtEnd) Inline u64 HashF_(String fmt, ...) { - TempArena scratch = BeginScratchNoConflict(); u64 result = 0; - va_list args; - va_start(args, fmt); + TempArena scratch = BeginScratchNoConflict(); { - String str = FormatStringV(scratch.arena, fmt, args); - result = HashFnv64(Fnv64Basis, str); + va_list args; + va_start(args, fmt); + { + String str = FormatString(scratch.arena, fmt, FmtArgsFromVaList(scratch.arena, args)); + result = HashFnv64(Fnv64Basis, str); + } + va_end(args); } - va_end(args); EndScratch(scratch); return result; } diff --git a/src/base/base_win32/base_win32_log.c b/src/base/base_win32/base_win32_log.c index 67b016d2..291fa2af 100644 --- a/src/base/base_win32/base_win32_log.c +++ b/src/base/base_win32/base_win32_log.c @@ -124,7 +124,7 @@ void LogF_(i32 level, String fmt, ...) va_list args; va_start(args, fmt); { - String msg = FormatStringV(scratch.arena, fmt, args); + String msg = FormatString(scratch.arena, fmt, FmtArgsFromVaList(scratch.arena, args)); W32_Log(level, msg); } va_end(args); diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.c b/src/gpu/gpu_dx12/gpu_dx12_core.c index 69d48e65..c2ae3a52 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.c +++ b/src/gpu/gpu_dx12/gpu_dx12_core.c @@ -2908,7 +2908,7 @@ void G_D12_CollectionWorkerEntry(WaveLaneCtx *lane) if (args_count > 0) { args.args = PushStructs(scratch.arena, FmtArg, args_count); - for (u32 arg_idx = 0; arg_idx <= args_count; ++arg_idx) + for (u32 arg_idx = 0; arg_idx < args_count; ++arg_idx) { G_FmtArgKind gpu_kind = (G_FmtArgKind)(*at); at += 1; @@ -2933,6 +2933,7 @@ void G_D12_CollectionWorkerEntry(WaveLaneCtx *lane) { dst->kind = FmtArgKind_Float; dst->value.f = *(f32 *)&gpu_value; + dst->p = 6; } break; } } @@ -2940,6 +2941,10 @@ void G_D12_CollectionWorkerEntry(WaveLaneCtx *lane) } String final_str = FormatString(scratch.arena, fmt, args); + if (GPU_SHADER_PRINT_LOG) + { + LogDebug(final_str); + } at = (u8 *)AlignU64((u64)at, 4); } diff --git a/src/gpu/gpu_shader_core.cgh b/src/gpu/gpu_shader_core.cgh index ca382c65..125828f3 100644 --- a/src/gpu/gpu_shader_core.cgh +++ b/src/gpu/gpu_shader_core.cgh @@ -167,13 +167,14 @@ Struct(G_FmtArg) u32 base; rw.InterlockedAdd(0, alloc_size, base); - u32 pos = base; - pos += 4; /* Offset for base counter */ - pos += 4; /* Offset for success counter */ - pos += 4; /* Offset for overflow counter */ + base += 4; /* Offset for allocation counter */ + base += 4; /* Offset for success counter */ + base += 4; /* Offset for overflow counter */ - if ((pos + alloc_size) < countof(rw)) + if ((base + alloc_size) < countof(rw)) { + u32 pos = 0; + /* Increment success counter */ rw.InterlockedAdd(4, 1); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index ec091e67..6a88ce1c 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -28,15 +28,15 @@ UI_Key UI_KeyFromString(String str) UI_Key UI_KeyF_(String fmt, ...) { - TempArena scratch = BeginScratchNoConflict(); UI_Key key = ZI; - va_list args; - va_start(args, fmt); + TempArena scratch = BeginScratchNoConflict(); { - String name = FormatStringV(scratch.arena, fmt, args); + va_list args; + va_start(args, fmt); + String name = FormatString(scratch.arena, fmt, FmtArgsFromVaList(scratch.arena, args)); key = UI_KeyFromString(name); + va_end(args); } - va_end(args); EndScratch(scratch); return key; } @@ -75,11 +75,16 @@ UI_Box *UI_BoxFromKey(UI_Key key) String UI_StringF_(String fmt, ...) { UI_Frame *frame = UI_CurrentFrame(); - va_list args; - va_start(args, fmt); - String str = FormatStringV(frame->arena, fmt, args); - va_end(args); - return str; + String result = ZI; + TempArena scratch = BeginScratchNoConflict(); + { + va_list args; + va_start(args, fmt); + String str = FormatString(frame->arena, fmt, FmtArgsFromVaList(scratch.arena, args)); + va_end(args); + } + EndScratch(scratch); + return result; } //////////////////////////////////////////////////////////// diff --git a/src/ui/ui_extras.c b/src/ui/ui_extras.c index 86aa251a..d77321a9 100644 --- a/src/ui/ui_extras.c +++ b/src/ui/ui_extras.c @@ -28,17 +28,17 @@ UI_Key UI_BuildLabel(String text) return key; } -UI_Key UI_BuildLabelF_(char *fmt_cstr, ...) +UI_Key UI_BuildLabelF_(String fmt, ...) { + UI_Key key = ZI; TempArena scratch = BeginScratchNoConflict(); - String str = ZI; { va_list va; - va_start(va, fmt_cstr); - str = FormatStringV(scratch.arena, StringFromCstrNoLimit(fmt_cstr), va); + va_start(va, fmt); + String str = FormatString(scratch.arena, fmt, FmtArgsFromVaList(scratch.arena, va)); + key = UI_BuildLabel(str); va_end(va); } - UI_Key key = UI_BuildLabel(str); EndScratch(scratch); return key; } diff --git a/src/ui/ui_extras.h b/src/ui/ui_extras.h index cc040407..713caea1 100644 --- a/src/ui/ui_extras.h +++ b/src/ui/ui_extras.h @@ -2,8 +2,8 @@ //~ Label helpers UI_Key UI_BuildLabel(String text); -#define UI_BuildLabelF(fmt_cstr, ...) UI_BuildLabelF_(fmt_cstr, __VA_ARGS__, FmtEnd) -UI_Key UI_BuildLabelF_(char *fmt_cstr, ...); +#define UI_BuildLabelF(fmt_cstr, ...) UI_BuildLabelF_(Lit(fmt_cstr), __VA_ARGS__, FmtEnd) +UI_Key UI_BuildLabelF_(String fmt, ...); //////////////////////////////////////////////////////////// //~ Spacing helpers diff --git a/src/ui/ui_shaders.g b/src/ui/ui_shaders.g index 43d9247c..3099f02b 100644 --- a/src/ui/ui_shaders.g +++ b/src/ui/ui_shaders.g @@ -146,7 +146,7 @@ PixelShader(UI_BlitPS, UI_BlitPSOutput, UI_BlitPSInput input) Vec4 result = tex.Sample(sampler, uv); // G_Print("Hello there!"); - G_PrintF("Hello there: \"%F\"", G_Fmt(3.123)); + G_PrintF("Bla: (%F, %F)", G_Fmt(uv.x), G_Fmt(uv.y));