From 404cec33782436a2acbca02048205ee006f28f20 Mon Sep 17 00:00:00 2001 From: mchughalex <25671999+mchughalex@users.noreply.github.com> Date: Sun, 19 Jul 2026 22:45:33 +0100 Subject: [PATCH] app: gate diagnostic captures and logging behind debug cvars, native renderer on by default --- src/native/skate3_native_diagnostics.cpp | 20 ++++++++--- src/native/skate3_native_entity.cpp | 32 +++++++++++------ src/skate3_app_common.cpp | 11 ++++-- src/skate3_native_debug_dialog.cpp | 2 +- src/skate3_native_debug_dialog.h | 8 ++--- src/skate3_native_render.cpp | 2 +- src/skate3_native_scene.cpp | 44 ++++++++++-------------- src/skate3_native_scene.h | 7 ---- src/skate3_native_scene_gpu.cpp | 36 +++++++++---------- third_party/rexglue-sdk | 2 +- 10 files changed, 89 insertions(+), 75 deletions(-) diff --git a/src/native/skate3_native_diagnostics.cpp b/src/native/skate3_native_diagnostics.cpp index 91f7b92..5128733 100644 --- a/src/native/skate3_native_diagnostics.cpp +++ b/src/native/skate3_native_diagnostics.cpp @@ -82,6 +82,13 @@ REXCVAR_DEFINE_BOOL( REXCVAR_DEFINE_STRING(skate3_native_render_snapshot_dir, "native_render_snapshots", "Skate 3", "Directory for native-render guest memory snapshots and metadata") .lifecycle(rex::cvar::Lifecycle::kHotReload); +REXCVAR_DEFINE_BOOL(skate3_native_render_capture_hotkeys, false, "Skate 3", + "Enable the diagnostic capture triggers: F7 scene-ring dump, F8 " + "cache flush, F9/F10 snapshot recording, F11 A/B parity capture, " + "controller RB+X / RB+A combos, and the snapshot-dir trigger " + "file. Off = no key/pad polling and no capture output.") + .debug_only() + .lifecycle(rex::cvar::Lifecycle::kHotReload); namespace skate3::native_scene { @@ -624,9 +631,11 @@ void OnCaptureFrameEnd(uint8_t* base, uint64_t frame_index, // Manual triggers (work repeatedly): press F9 (window recording per the // snapshot cvars), F10 (IMMEDIATE single-frame capture: full memory // snapshot + this frame's records/draws, for catching a broken object the - // moment it is on screen), or create \trigger. + // moment it is on screen), or create \trigger. All of them + // (and their key/pad polling) sit behind skate3_native_render_capture_hotkeys. + const bool capture_hotkeys = REXCVAR_GET(skate3_native_render_capture_hotkeys); #if defined(_WIN32) - if (!g_collecting) { + if (capture_hotkeys && !g_collecting) { static bool f9_was_down = false; const bool f9_down = (GetAsyncKeyState(VK_F9) & 0x8000) != 0; if (f9_down && !f9_was_down) { @@ -733,7 +742,10 @@ void OnCaptureFrameEnd(uint8_t* base, uint64_t frame_index, static uint64_t ab_resume_frame = 0; static char ab_tag[24] = {}; static bool f11_was_down = false; - const bool f11_down = (GetAsyncKeyState(VK_F11) & 0x8000) != 0; + // Gate the poll itself; a sequence already in flight still runs to + // completion so the renderer is never left toggled to emulated. + const bool f11_down = + capture_hotkeys && (GetAsyncKeyState(VK_F11) & 0x8000) != 0; constexpr uint64_t kSettleFrames = 60; switch (ab_state) { case AbState::kIdle: @@ -919,7 +931,7 @@ void OnCaptureFrameEnd(uint8_t* base, uint64_t frame_index, } } #endif - if (!g_collecting && frame_index % 32 == 0) { + if (capture_hotkeys && !g_collecting && frame_index % 32 == 0) { const std::filesystem::path trigger = SnapshotDir() / "trigger"; std::error_code ec; if (std::filesystem::exists(trigger, ec)) { diff --git a/src/native/skate3_native_entity.cpp b/src/native/skate3_native_entity.cpp index 84fd2e0..803f94c 100644 --- a/src/native/skate3_native_entity.cpp +++ b/src/native/skate3_native_entity.cpp @@ -23,10 +23,16 @@ REXCVAR_DEFINE_BOOL( skate3_native_render_scene_entity_ident, true, "Skate 3", "Build the presentation-entity identity store (MeshContext -> owning " - "entity, from the game's BindConstants walks) and compare the entity's " - "direct fields (world transform, opacity) against the renderer's " - "captured values. Observer only: emits the ident[] stats line, serves " - "nothing.") + "entity, from the game's BindConstants walks). The store feeds the " + "entity serve paths (fade serve, ROPA world serve, palette identity); " + "off disables those consumers as well.") + .lifecycle(rex::cvar::Lifecycle::kHotReload); + +REXCVAR_DEFINE_BOOL( + skate3_native_render_scene_entity_ident_log, false, "Skate 3", + "Log identity-store diagnostics: the periodic ident[] stats line and " + "rate-limited serve-path lines.") + .debug_only() .lifecycle(rex::cvar::Lifecycle::kHotReload); REXCVAR_DEFINE_BOOL( @@ -279,7 +285,8 @@ void OnBindClass(uint32_t entity, EntClass cls) { // table, for promoting vtable-based classification later. static std::unordered_map s_seen; const uint64_t key = (uint64_t(it->second.vtable) << 8) | uint8_t(cls); - if (s_seen.size() < 64 && s_seen.emplace(key, true).second) { + if (REXCVAR_GET(skate3_native_render_scene_entity_ident_log) && + s_seen.size() < 64 && s_seen.emplace(key, true).second) { REXLOG_INFO("native-entity: class {} vtbl={:08X} entity={:08X}", ClassName(cls), it->second.vtable, entity); } @@ -377,7 +384,8 @@ void ObserveRopaWorld(uint8_t* base, uint32_t ctx, const float rows[12]) { if (c416 == 2 && c352 == 2) { static std::atomic s_logged{0}; const uint32_t ln = s_logged.fetch_add(1, std::memory_order_relaxed); - if (ln < 8 || (ln & 1023u) == 0) { + if (REXCVAR_GET(skate3_native_render_scene_entity_ident_log) && + (ln < 8 || (ln & 1023u) == 0)) { REXLOG_INFO( "native-entity: ropa world DIVERGES both fields ctx={:08X} " "cls={} entity={:08X} bank=({:.3f},{:.3f},{:.3f},{:.2f}) " @@ -424,7 +432,8 @@ void ObserveCharItem(uint8_t* base, uint32_t ctx, uint32_t family, g_fade_div.fetch_add(1, std::memory_order_relaxed); static std::atomic s_logged{0}; const uint32_t ln = s_logged.fetch_add(1, std::memory_order_relaxed); - if (ln < 8 || (ln & 2047u) == 0) { + if (REXCVAR_GET(skate3_native_render_scene_entity_ident_log) && + (ln < 8 || (ln & 2047u) == 0)) { REXLOG_INFO( "native-entity: fade divergence ctx={:08X} cls={} fam={} " "e496={:.3f} used={:.3f} (n={})", @@ -441,7 +450,8 @@ void NoteAcceptedWorldCompare(const float bank_rows[12], g_wprim_div.fetch_add(1, std::memory_order_relaxed); static std::atomic s_logged{0}; const uint32_t ln = s_logged.fetch_add(1, std::memory_order_relaxed); - if (ln < 8 || (ln & 1023u) == 0) { + if (REXCVAR_GET(skate3_native_render_scene_entity_ident_log) && + (ln < 8 || (ln & 1023u) == 0)) { REXLOG_INFO( "native-entity: PRIMARY world diverges from accepted bank " "i={} bank={:.4f} ent={:.4f} (n={})", @@ -633,7 +643,8 @@ bool ServeRopaWorld(uint8_t* base, uint32_t ctx, uint32_t vb_obj, g_wserve.fetch_add(1, std::memory_order_relaxed); static std::atomic s_logged{0}; const uint32_t ln = s_logged.fetch_add(1, std::memory_order_relaxed); - if (ln < 8 || (ln & 2047u) == 0) { + if (REXCVAR_GET(skate3_native_render_scene_entity_ident_log) && + (ln < 8 || (ln & 2047u) == 0)) { REXLOG_INFO( "native-entity: ropa world SERVED ctx={:08X} cls={} entity={:08X} " "t=({:.2f},{:.2f},{:.2f}) (n={})", @@ -644,7 +655,8 @@ bool ServeRopaWorld(uint8_t* base, uint32_t ctx, uint32_t vb_obj, } void EmitStats() { - if (!REXCVAR_GET(skate3_native_render_scene_entity_ident)) { + if (!REXCVAR_GET(skate3_native_render_scene_entity_ident) || + !REXCVAR_GET(skate3_native_render_scene_entity_ident_log)) { return; } const uint32_t frame = diff --git a/src/skate3_app_common.cpp b/src/skate3_app_common.cpp index 8e1ad6b..3a59583 100644 --- a/src/skate3_app_common.cpp +++ b/src/skate3_app_common.cpp @@ -714,8 +714,8 @@ std::optional Skate3BaseApp::OnFinalizePaths( } void Skate3BaseApp::OnCreateDialogs(rex::ui::ImGuiDrawer* drawer) { - // Always-on native/emulated corner readout (top right; cvar - // skate3_native_render_mode_indicator hides it live). Input-transparent, + // Native/emulated corner readout (top right; off by default, cvar + // skate3_native_render_mode_indicator shows it live). Input-transparent, // so it never affects cursor or focus handling. render_mode_indicator_ = std::make_unique(drawer); rex::ui::RegisterBind("bind_skate3_menu", "Escape", "Skate 3 settings", [this] { @@ -746,7 +746,12 @@ void Skate3BaseApp::OnCreateDialogs(rex::ui::ImGuiDrawer* drawer) { }); rex::ui::RegisterBind("bind_skate3_ultrawide_targets", "F7", "Skate 3 ultrawide targets", [this] { - ToggleUltrawideTargets(); + // Developer tuning dialog; rides the same opt-in as + // the F4 cvar browser. + if (rex::cvar::Query( + "advanced_settings_overlay_enabled")) { + ToggleUltrawideTargets(); + } }); rex::ui::RegisterBind("bind_skate3_save_draw_fingerprints", "F8", "Save draw fingerprint log", [this] { diff --git a/src/skate3_native_debug_dialog.cpp b/src/skate3_native_debug_dialog.cpp index 3d0dbe3..457639f 100644 --- a/src/skate3_native_debug_dialog.cpp +++ b/src/skate3_native_debug_dialog.cpp @@ -13,7 +13,7 @@ #include "skate3_native_scene.h" -REXCVAR_DEFINE_BOOL(skate3_native_render_mode_indicator, true, "Skate 3", +REXCVAR_DEFINE_BOOL(skate3_native_render_mode_indicator, false, "Skate 3", "Small top-right corner readout of which renderer produced the " "last presented frame: NATIVE (native scene renderer) or " "EMULATED (Xenos GPU emulation: menus/loading yields, F5 off).") diff --git a/src/skate3_native_debug_dialog.h b/src/skate3_native_debug_dialog.h index a7ecdfe..9e5f5e4 100644 --- a/src/skate3_native_debug_dialog.h +++ b/src/skate3_native_debug_dialog.h @@ -24,11 +24,11 @@ class NativeDebugDialog final : public rex::ui::ImGuiDialog { bool visible_ = false; }; -// Tiny always-on top-right corner readout of which renderer produced the -// last presented frame: NATIVE (native scene renderer) or EMULATED (Xenos +// Tiny top-right corner readout of which renderer produced the last +// presented frame: NATIVE (native scene renderer) or EMULATED (Xenos // GPU emulation; menus/loading yields, F5 off). Input-transparent, no -// continuous repaint (updates ride the guest frame paints); hidden via -// skate3_native_render_mode_indicator (hot). +// continuous repaint (updates ride the guest frame paints); off by +// default, shown via skate3_native_render_mode_indicator (hot). class RenderModeIndicator final : public rex::ui::ImGuiDialog { public: explicit RenderModeIndicator(rex::ui::ImGuiDrawer* drawer) : ImGuiDialog(drawer) {} diff --git a/src/skate3_native_render.cpp b/src/skate3_native_render.cpp index 72facb9..9065993 100644 --- a/src/skate3_native_render.cpp +++ b/src/skate3_native_render.cpp @@ -23,7 +23,7 @@ #include #include -REXCVAR_DEFINE_BOOL(skate3_native_render, false, "Skate 3", +REXCVAR_DEFINE_BOOL(skate3_native_render, true, "Skate 3", "Enable the Skate 3 data-driven native renderer hook layer") .lifecycle(rex::cvar::Lifecycle::kRequiresRestart); REXCVAR_DEFINE_INT32(skate3_native_render_log_interval, 0, "Skate 3", diff --git a/src/skate3_native_scene.cpp b/src/skate3_native_scene.cpp index 2791d4f..5b2aea9 100644 --- a/src/skate3_native_scene.cpp +++ b/src/skate3_native_scene.cpp @@ -59,7 +59,7 @@ REXCVAR_DECLARE(std::string, skate3_native_render_snapshot_dir); -REXCVAR_DEFINE_BOOL(skate3_native_render_scene, false, "Skate 3", +REXCVAR_DEFINE_BOOL(skate3_native_render_scene, true, "Skate 3", "Render the game scene natively from the hooked MeshContext stream, " "replacing the emulated GPU output (requires skate3_native_render). " "Hot-toggles live between the native and emulated renderers (F5).") @@ -967,8 +967,13 @@ REXCVAR_DEFINE_BOOL(skate3_native_render_scene_stretch_guard, true, "Skate 3", "Draw-time stretch veto: skin cached sample verts of each " "skinned mesh's GPU-resident decode with the final palette " "every frame; wider than bind size = the 1-frame mangled-" - "ribbon flash: skip the item's draws (blink) and dump the " - "palette to logs/stretch_*.txt for diagnosis") + "ribbon flash; skip the item's draws (blink)") + .lifecycle(rex::cvar::Lifecycle::kHotReload); +REXCVAR_DEFINE_BOOL(skate3_native_render_scene_stretch_guard_dump, false, "Skate 3", + "On a stretch veto, dump the full bone palette and probe " + "verts to logs/stretch_*.txt (first 6 trips) for offline " + "diagnosis of which rows are junk") + .debug_only() .lifecycle(rex::cvar::Lifecycle::kHotReload); REXCVAR_DEFINE_BOOL(skate3_native_render_scene_lm_dump, false, "Skate 3", "Diagnostic: dump the decoded mip 0 of every generated-mip " @@ -1036,8 +1041,8 @@ REXCVAR_DEFINE_DOUBLE( REXCVAR_DEFINE_INT32(skate3_native_render_scene_synthetic_pan, 0, "Skate 3", "Synthetic constant-rate camera pan (judder isolation): 0 = off, " "1 = time-based at scene build, 2 = fixed angle step per frame, " - "3 = synthetic samples through the camera smoother. Hotkey P " - "cycles the modes.") + "3 = synthetic samples through the camera smoother.") + .debug_only() .lifecycle(rex::cvar::Lifecycle::kHotReload); REXCVAR_DEFINE_DOUBLE(skate3_native_render_scene_synthetic_pan_rate, 90.0, "Skate 3", "Synthetic pan rate in degrees/second") @@ -2524,19 +2529,6 @@ void RequestSceneRingDump() { } void FlushMeshCache() { g_flush_meshes.store(true, std::memory_order_relaxed); } -int CycleSyntheticPan() { - const int mode = - (std::clamp(int(REXCVAR_GET(skate3_native_render_scene_synthetic_pan)), 0, 3) + 1) % - 4; - REXCVAR_SET(skate3_native_render_scene_synthetic_pan, mode); - static const char* kModeNames[] = {"off", "time-based (host clock at scene build)", - "fixed angle step per frame", - "synthetic samples through the smoother"}; - REXLOG_INFO("native-scene synthetic-pan: hotkey -> mode {} ({})", mode, - kModeNames[mode]); - return mode; -} - // RecordBoneSignal / RecordCameraSignal: native/skate3_native_diagnostics.cpp. bool ToggleSceneEnabled() { @@ -7580,7 +7572,7 @@ void Publish2dDraws(uint8_t* base) { s_seen.clear(); } if (s_seen.size() < 24 && s_seen.insert(d.fetch[1]).second) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: BIG 2D quad tex=({:08x},{:08x},{:08x}) flags={:02x} " "src_stride={} count={} bbox=({:.0f},{:.0f})-({:.0f},{:.0f}) " "c8=({:.2f},{:.2f},{:.2f},{:.2f}) (n={})", @@ -7618,7 +7610,7 @@ void Publish2dDraws(uint8_t* base) { s_fade_logs.store(0, std::memory_order_relaxed); } if (s_fade_logs.fetch_add(1, std::memory_order_relaxed) < 6) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: transition fade fill alpha={:.2f} " "rgb=({:.2f},{:.2f},{:.2f}) flags={:02x}", alpha, d.consts[32], d.consts[33], d.consts[34], d.flags); @@ -7921,7 +7913,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { g_slow_frame_log_budget.fetch_sub(1, std::memory_order_relaxed) > 0) { const double ours_ms = double(s_prev_build_ns + s_prev_cap_ns) * 1e-6; - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: slow guest frame dt={:.2f}ms prev[cap={:.2f} build={:.2f} " "(2d={:.2f} spl={:.2f} pal={:.2f} ptail={:.2f} walk={:.2f}) rest={:.2f}]ms", dt_ms, double(s_prev_cap_ns) * 1e-6, double(s_prev_build_ns) * 1e-6, @@ -8053,7 +8045,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { static std::atomic s_aux_views{0}; const uint64_t n = s_aux_views.fetch_add(1, std::memory_order_relaxed); if (n < 4 || (n & 255u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: aux perspective view skipped (portrait RTT " "pass, proj aspect {:.2f}) (n={})", m00 > 1e-6f ? m11 / m00 : 0.0f, n); @@ -8274,7 +8266,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { static std::atomic incoh_logged{0}; const uint32_t ln = incoh_logged.fetch_add(1, std::memory_order_relaxed); if (ln < 32 || (ln & 255u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: publish INCOHERENT palette mesh={:08X} fam={} " "ropa={} src={} spread={:.2f} bind=({:.2f},{:.2f},{:.2f}) " "bone0_t=({:.1f},{:.1f},{:.1f})", @@ -8570,7 +8562,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { const uint32_t ln = s_fam_logged.fetch_add(1, std::memory_order_relaxed); if (ln < 8 || (ln & 1023u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: rows bridge cross-family serve " "mesh={:08X} fam {}->{} (n={})", item.mesh, item.char_family, eit->second.fam, ln); @@ -9072,7 +9064,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { const uint32_t ln = s_sub_logged.fetch_add(1, std::memory_order_relaxed); if (ln < 16 || (ln & 511u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: LW palette substituted ctx={:08X} mesh={:08X} " "fam={} rows={} (n={})", item.ctx, item.mesh, item.char_family, n, ln); @@ -9723,7 +9715,7 @@ void BuildFrameScene(uint8_t* base, const SubmitRecord* records, size_t count) { probe.fp == item.fingerprint ? 1 : 0, item.bones[3], item.bones[7], item.bones[11]); } - if (ln < 6) { + if (ln < 6 && REXCVAR_GET(skate3_native_render_scene_stretch_guard_dump)) { // Full palette + probe dump for offline diagnosis (which rows are // junk, which bones the stretched samples weight to). char path[128]; diff --git a/src/skate3_native_scene.h b/src/skate3_native_scene.h index 7a620db..bc12cb7 100644 --- a/src/skate3_native_scene.h +++ b/src/skate3_native_scene.h @@ -638,13 +638,6 @@ bool ToggleSceneEnabled(); void FlushTextureCache(); void FlushMeshCache(); -// Synthetic camera pan probe (judder isolation, hotkey P): cycles -// skate3_native_render_scene_synthetic_pan 0 -> 1 -> 2 -> 3 -> 0 and returns -// the new mode. 1 = time-based constant-rate pan injected at scene build, -// 2 = fixed angle step per published frame, 3 = synthetic pose samples fed -// through the camera smoother (reconstruction error logged numerically). -int CycleSyntheticPan(); - // Camera-signal recorder (judder diagnosis): for `seconds`, records every // distinct guest camera pose (1 kHz sampler timestamps) plus the per-frame // raw and smoothed headings, then writes logs/cam_signal_.csv. Pan the diff --git a/src/skate3_native_scene_gpu.cpp b/src/skate3_native_scene_gpu.cpp index 490b56e..1dce58b 100644 --- a/src/skate3_native_scene_gpu.cpp +++ b/src/skate3_native_scene_gpu.cpp @@ -2135,8 +2135,8 @@ bool EnsureGuestCubeTexture(const NativeGuestOutputRenderContext& context, uint8 } } device->Unmap(out.upload); - REXLOG_INFO("native-scene: cube {:08X} {}x{} fmt={} -> RGBA full chain ({} levels)", - tex_ptr, width, height, uint32_t(info.format), levels); + REXLOG_DEBUG("native-scene: cube {:08X} {}x{} fmt={} -> RGBA full chain ({} levels)", + tex_ptr, width, height, uint32_t(info.format), levels); nrhi::Swizzle swizzle_mapping[4]; ComposeSrvSwizzle(fetch.swizzle, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA, swizzle_mapping); @@ -2256,8 +2256,8 @@ bool EnsureGuestCubeTexture(const NativeGuestOutputRenderContext& context, uint8 } device->Unmap(out.upload); - REXLOG_INFO("native-scene: cube {:08X} {}x{} fmt={} mips={} (of {} avail)", tex_ptr, - width, height, uint32_t(info.format), mip_levels, info.mip_levels()); + REXLOG_DEBUG("native-scene: cube {:08X} {}x{} fmt={} mips={} (of {} avail)", tex_ptr, + width, height, uint32_t(info.format), mip_levels, info.mip_levels()); if (g_tex_stage_out != nullptr) { // Decode worker: export the commit recipe, face-major (face * levels + // mip) entries matching the old D3D12 subresource numbering. @@ -3765,8 +3765,8 @@ void WarmItemResources(const NativeGuestOutputRenderContext& context, uint8_t* b if (within()) { if (g_warm_mesh_log_budget.load(std::memory_order_relaxed) > 0 && g_warm_mesh_log_budget.fetch_sub(1, std::memory_order_relaxed) > 0) { - REXLOG_INFO("native-scene: settle mesh REVALIDATE mesh={:08X} fp {:016X}->{:016X}", - item.mesh, mit->second.fingerprint, item.fingerprint); + REXLOG_DEBUG("native-scene: settle mesh REVALIDATE mesh={:08X} fp {:016X}->{:016X}", + item.mesh, mit->second.fingerprint, item.fingerprint); } g_r.device->DestroyDeferred(mit->second.vb); g_r.device->DestroyDeferred(mit->second.ib); @@ -3816,9 +3816,9 @@ void WarmItemResources(const NativeGuestOutputRenderContext& context, uint8_t* b } if (g_warm_tex_log_budget.load(std::memory_order_relaxed) > 0 && g_warm_tex_log_budget.fetch_sub(1, std::memory_order_relaxed) > 0) { - REXLOG_INFO("native-scene: settle tex RETIRE ptr={:08X} key={:016X} incomplete={} " - "fp {:016X}->{:016X}", - tex_ptr, key, it->second.incomplete, it->second.payload_fp, fp); + REXLOG_DEBUG("native-scene: settle tex RETIRE ptr={:08X} key={:016X} incomplete={} " + "fp {:016X}->{:016X}", + tex_ptr, key, it->second.incomplete, it->second.payload_fp, fp); } RetireGuestTexture(it->second, context.device->CurrentSubmission()); g_r.tex_store.erase(it); @@ -4450,7 +4450,7 @@ void PrewarmCommit(const NativeGuestOutputRenderContext& context, s_swap_logs.store(0, std::memory_order_relaxed); } if (s_swap_logs.fetch_add(1) < 8) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: texture heal commit key={:016X} fp {:016X} " "-> {:016X}", t.words_key, wit->second.payload_fp, t.gt.payload_fp); @@ -6475,7 +6475,7 @@ void LogFrameStats(const FrameScene& scene, uint64_t frames, uint32_t drawn, g_warm_tex_log_budget.store(4, std::memory_order_relaxed); g_slow_frame_log_budget.store(3, std::memory_order_relaxed); } - if (frames % 600 == 0) { + if (frames % 600 == 0 && REXCVAR_GET(skate3_native_render_scene_perf_log)) { uint32_t lw_ctxs = 0, lw_ents = 0; skate3::native_lw::QueryLwStats(&lw_ctxs, &lw_ents); REXLOG_INFO( @@ -7018,7 +7018,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat static std::atomic s_sh_logged{0}; const uint32_t sl = s_sh_logged.fetch_add(1, std::memory_order_relaxed); if (sl < 24 || (sl & 1023u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: SHADOW ALTERNATION valid={} ready={} draws={} " "row0=({:.3f},{:.3f},{:.3f},{:.3f}) (n={})", scene.shadow_valid ? 1 : 0, shadow_ready ? 1 : 0, shadow_draws, @@ -8645,7 +8645,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat const uint32_t ln = s_stale.fetch_add(1, std::memory_order_relaxed); if (ln < 16 || (ln & 1023u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: ropa shape STALE gen dropped mesh={:08X} " "age={:.2f}s seq_gap={} (n={})", item.mesh, ring_newest_t - g.t, @@ -8703,7 +8703,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat const uint32_t ln = s_blend_miss_log.fetch_add(1, std::memory_order_relaxed); if (ln < 64 || (ln & 63u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: ropa blend MISS mesh={:08X} sc={} ng={} " "total={:.2f} stride={} ring={} ring_off={} (n={})", item.mesh, item.shape_count, ng, total, buffers.vb_view.stride, @@ -8855,7 +8855,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat static std::atomic s_flip_logged{0}; const uint32_t fl = s_flip_logged.fetch_add(1, std::memory_order_relaxed); if (fl < 24 || (fl & 511u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: hair ROUTE FLIP mesh={:08X} ctx={:08X} fam={} " "alpha={} -> route {} rows14=({:.3f},{:.3f},{:.3f}) (n={})", item.mesh, item.ctx, item.char_family, item.char_alpha ? 1 : 0, @@ -8869,7 +8869,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat static std::atomic s_bone_alt_logged{0}; const uint32_t bl = s_bone_alt_logged.fetch_add(1, std::memory_order_relaxed); if (bl < 24 || (bl & 1023u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: hair BONES ALTERNATION mesh={:08X} ctx={:08X} " "fam={} bones={} src={} caster_bank={} (n={})", item.mesh, item.ctx, item.char_family, item.bones.size() / 12, @@ -8918,7 +8918,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat static std::atomic s_blinks{0}; const uint64_t n = s_blinks.fetch_add(1, std::memory_order_relaxed); if (n < 16 || (n & 255u) == 0) { - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: fade BLINK repaired mesh={:08X} fam={} ropa={} " "src={} rows13=({:.3f},{:.3f},{:.3f},{:.3f}) " "rows14=({:.3f},{:.3f}) (n={})", @@ -9705,7 +9705,7 @@ bool RenderScene(const NativeGuestOutputRenderContext& context, void* /*user_dat if (frame_number - s_pfx_log_frame > 120) { s_pfx_log_frame = frame_number; const auto& fx = scene.photo_fx; - REXLOG_INFO( + REXLOG_DEBUG( "native-scene: pfx live rows: visualfx c2=({:.3f},{:.3f}) " "c4.x={:.5f} c7=({:.4f},{:.4f},{:.4f},{:.4f}) | dofmb " "c2.x={:.3f} | dof c0.x={:.3f} | uber c0.x={:.3f} " diff --git a/third_party/rexglue-sdk b/third_party/rexglue-sdk index b6c738c..2365c97 160000 --- a/third_party/rexglue-sdk +++ b/third_party/rexglue-sdk @@ -1 +1 @@ -Subproject commit b6c738c8e136957a28c604c86c0907ff57758a1e +Subproject commit 2365c9784eb7a529ec7f44f74f51836519c6ab4b