summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-05-20 22:44:44 +0200
committerskal <pascal.massimino@gmail.com>2026-05-20 22:44:44 +0200
commit5d20c892dedce7bc7486acbd72fbd35da69e413e (patch)
tree05e04d5e689504c2421cd5772e91a42ee69608ab /src/util
parent6ef8f578817ee0134fd5867ca3b80590e3eb2368 (diff)
fix: code review cleanup — bugs, dead code, factorization (-167 lines)
Bugs: - B1: fix dead tempo debug (prev_tempo captured after assignment) - B2: fix ReloadAssetsFromFile leak for disk-loaded assets; simplify DropAsset - B3: fix get_free_pool_slot leak (unregister synth + free data on reuse) - B4: volatile -> std::atomic with acquire/release in miniaudio_backend, synth - B5: fix unaligned reads in scene_loader (memcpy-based read_f32/read_u32) - B6: fix shader module + BGL + pipeline layout leaks in gpu.cc, pipeline_builder Dead code: - D1: remove unused particle_defs.h - D3: remove create_post_process_pipeline_simple (zero callers) - D4: remove empty gpu_draw() - D5: remove write-only Hybrid3D::initialized_ - D6: remove legacy pending buffer path in audio.cc Factorization: - F1: Effect::run_fullscreen_pass() replaces boilerplate in 5 effects - F2: particle_common.wgsl snippet, #include in 3 WGSL shaders - F3: gpu_create_shader_module() helper, used in 3 call sites - F5: get_world_aabb() shared between bvh.cc and physics.cc - F6: samples_to_seconds() replaces 6 inline expressions - F7: gpu_create_linear/nearest_sampler use SamplerCache; add nearest() preset 37/37 tests passing. handoff(Claude): code review batch — all items verified, no regressions.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/asset_manager.cc36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/util/asset_manager.cc b/src/util/asset_manager.cc
index 264ddda..82c07be 100644
--- a/src/util/asset_manager.cc
+++ b/src/util/asset_manager.cc
@@ -245,29 +245,25 @@ void DropAsset(AssetId asset_id, const uint8_t* asset) {
return; // Invalid asset_id
}
- // Check if the asset is in cache and is procedural, and if the pointer
- // matches. This prevents accidentally freeing static data or freeing twice.
- if (g_asset_cache[index].data == asset &&
- (g_asset_cache[index].type == AssetType::PROC ||
- g_asset_cache[index].type == AssetType::PROC_GPU)) {
- delete[] g_asset_cache[index].data;
- g_asset_cache[index] = {}; // Zero out the struct to force re-generation
- }
- // Heap-allocated decompressed buffer (compression != NONE): cache owns it.
- if (g_asset_cache[index].data == asset &&
- g_asset_cache[index].compression != AssetCompression::NONE) {
- delete[] g_asset_cache[index].data;
- g_asset_cache[index] = {};
+ // Check if the asset is in cache and the pointer matches.
+ // This prevents accidentally freeing static data or freeing twice.
+ if (g_asset_cache[index].data != asset) {
+ return; // Pointer mismatch — not our allocation
}
+
+ // Heap-owned: procedural, compressed, or disk-loaded (debug)
+ if (g_asset_cache[index].type == AssetType::PROC ||
+ g_asset_cache[index].type == AssetType::PROC_GPU ||
+ g_asset_cache[index].compression != AssetCompression::NONE
#if !defined(STRIP_ALL)
- if (g_asset_cache[index].data == asset &&
- (g_asset_cache[index].type == AssetType::SPEC ||
- g_asset_cache[index].type == AssetType::MP3 ||
- g_asset_cache[index].type == AssetType::WGSL)) {
+ || g_asset_cache[index].type == AssetType::SPEC ||
+ g_asset_cache[index].type == AssetType::MP3 ||
+ g_asset_cache[index].type == AssetType::WGSL
+#endif
+ ) {
delete[] g_asset_cache[index].data;
g_asset_cache[index] = {};
}
-#endif
// For static assets, no dynamic memory to free.
}
@@ -283,7 +279,9 @@ bool ReloadAssetsFromFile(const char* config_path) {
const AssetRecord& e = g_asset_cache[i];
if (e.data &&
(e.type == AssetType::PROC || e.type == AssetType::PROC_GPU ||
- e.compression != AssetCompression::NONE)) {
+ e.compression != AssetCompression::NONE ||
+ e.type == AssetType::SPEC || e.type == AssetType::MP3 ||
+ e.type == AssetType::WGSL)) {
delete[] e.data;
}
g_asset_cache[i] = {};