split preload from asset table

This commit is contained in:
Nilton Constantino 2026-01-22 14:26:38 +00:00
parent c450e530f6
commit 8d97f6225b
No known key found for this signature in database
8 changed files with 42 additions and 18 deletions

View File

@ -15,6 +15,7 @@ impl LoadCartridgeStep {
// Initialize Asset Manager // Initialize Asset Manager
ctx.hw.assets_mut().initialize_for_cartridge( ctx.hw.assets_mut().initialize_for_cartridge(
self.cartridge.asset_table.clone(), self.cartridge.asset_table.clone(),
self.cartridge.preload.clone(),
self.cartridge.assets.clone() self.cartridge.assets.clone()
); );

View File

@ -1,5 +1,5 @@
use crate::hardware::memory_banks::{TileBankPoolInstaller, SoundBankPoolInstaller}; use crate::hardware::memory_banks::{TileBankPoolInstaller, SoundBankPoolInstaller};
use crate::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, SlotRef, SlotStats, TileBank, TileSize, SoundBank, Sample}; use crate::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, SlotRef, SlotStats, TileBank, TileSize, SoundBank, Sample, PreloadEntry};
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock}; use std::sync::{Arc, Mutex, RwLock};
use std::thread; use std::thread;
@ -149,7 +149,7 @@ impl AssetManager {
} }
} }
pub fn initialize_for_cartridge(&self, assets: Vec<AssetEntry>, assets_data: Vec<u8>) { pub fn initialize_for_cartridge(&self, assets: Vec<AssetEntry>, preload: Vec<PreloadEntry>, assets_data: Vec<u8>) {
self.shutdown(); self.shutdown();
{ {
let mut asset_map = self.assets.write().unwrap(); let mut asset_map = self.assets.write().unwrap();
@ -160,9 +160,15 @@ impl AssetManager {
} }
*self.assets_data.write().unwrap() = assets_data; *self.assets_data.write().unwrap() = assets_data;
// Perform Preload for assets marked with preload_slot // Perform Preload for assets in the preload list
for entry in assets { for item in preload {
if let Some(slot_index) = entry.preload_slot { let entry_opt = {
let assets = self.assets.read().unwrap();
assets.get(&item.asset_id).cloned()
};
if let Some(entry) = entry_opt {
let slot_index = item.slot;
match entry.bank_type { match entry.bank_type {
BankType::TILES => { BankType::TILES => {
if let Ok(bank) = Self::perform_load_tile_bank(&entry, self.assets_data.clone()) { if let Ok(bank) = Self::perform_load_tile_bank(&entry, self.assets_data.clone()) {
@ -193,6 +199,8 @@ impl AssetManager {
} }
} }
} }
} else {
eprintln!("[AssetManager] Preload failed: asset '{}' not found in table", item.asset_id);
} }
} }
} }
@ -638,7 +646,6 @@ mod tests {
"width": 16, "width": 16,
"height": 16 "height": 16
}), }),
preload_slot: None,
}; };
let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer); let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer);
@ -688,7 +695,6 @@ mod tests {
"width": 16, "width": 16,
"height": 16 "height": 16
}), }),
preload_slot: None,
}; };
let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer); let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer);
@ -727,7 +733,6 @@ mod tests {
metadata: serde_json::json!({ metadata: serde_json::json!({
"sample_rate": 44100 "sample_rate": 44100
}), }),
preload_slot: None,
}; };
let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer); let am = AssetManager::new(vec![asset_entry], data, gfx_installer, sound_installer);
@ -767,15 +772,18 @@ mod tests {
metadata: serde_json::json!({ metadata: serde_json::json!({
"sample_rate": 44100 "sample_rate": 44100
}), }),
preload_slot: Some(5),
}; };
let preload = vec![
PreloadEntry { asset_id: "preload_sound".to_string(), slot: 5 }
];
let am = AssetManager::new(vec![], vec![], gfx_installer, sound_installer); let am = AssetManager::new(vec![], vec![], gfx_installer, sound_installer);
// Before init, slot 5 is empty // Before init, slot 5 is empty
assert!(banks.sound_bank_slot(5).is_none()); assert!(banks.sound_bank_slot(5).is_none());
am.initialize_for_cartridge(vec![asset_entry], data); am.initialize_for_cartridge(vec![asset_entry], preload, data);
// After init, slot 5 should be occupied because of preload // After init, slot 5 should be occupied because of preload
assert!(banks.sound_bank_slot(5).is_some()); assert!(banks.sound_bank_slot(5).is_some());

View File

@ -20,8 +20,12 @@ pub struct AssetEntry {
pub decoded_size: u64, pub decoded_size: u64,
pub codec: String, // e.g., "RAW" pub codec: String, // e.g., "RAW"
pub metadata: serde_json::Value, pub metadata: serde_json::Value,
#[serde(default)] }
pub preload_slot: Option<usize>,
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PreloadEntry {
pub asset_id: String,
pub slot: usize,
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]

View File

@ -1,4 +1,4 @@
use crate::model::asset::AssetEntry; use crate::model::asset::{AssetEntry, PreloadEntry};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
@ -17,6 +17,7 @@ pub struct Cartridge {
pub program: Vec<u8>, pub program: Vec<u8>,
pub assets: Vec<u8>, pub assets: Vec<u8>,
pub asset_table: Vec<AssetEntry>, pub asset_table: Vec<AssetEntry>,
pub preload: Vec<PreloadEntry>,
} }
#[derive(Debug, Clone, Deserialize, Serialize)] #[derive(Debug, Clone, Deserialize, Serialize)]
@ -30,6 +31,8 @@ pub struct CartridgeDTO {
pub assets: Vec<u8>, pub assets: Vec<u8>,
#[serde(default)] #[serde(default)]
pub asset_table: Vec<AssetEntry>, pub asset_table: Vec<AssetEntry>,
#[serde(default)]
pub preload: Vec<PreloadEntry>,
} }
impl From<CartridgeDTO> for Cartridge { impl From<CartridgeDTO> for Cartridge {
@ -43,6 +46,7 @@ impl From<CartridgeDTO> for Cartridge {
program: dto.program, program: dto.program,
assets: dto.assets, assets: dto.assets,
asset_table: dto.asset_table, asset_table: dto.asset_table,
preload: dto.preload,
} }
} }
} }
@ -68,4 +72,6 @@ pub struct CartridgeManifest {
pub entrypoint: String, pub entrypoint: String,
#[serde(default)] #[serde(default)]
pub asset_table: Vec<AssetEntry>, pub asset_table: Vec<AssetEntry>,
#[serde(default)]
pub preload: Vec<PreloadEntry>,
} }

View File

@ -64,6 +64,7 @@ impl DirectoryCartridgeLoader {
program, program,
assets, assets,
asset_table: manifest.asset_table, asset_table: manifest.asset_table,
preload: manifest.preload,
}; };
Ok(Cartridge::from(dto)) Ok(Cartridge::from(dto))

View File

@ -11,7 +11,7 @@ mod cartridge;
mod cartridge_loader; mod cartridge_loader;
mod window; mod window;
pub use asset::{AssetEntry, BankType, BankStats, LoadStatus, SlotRef, SlotStats, HandleId}; pub use asset::{AssetEntry, BankType, BankStats, LoadStatus, SlotRef, SlotStats, HandleId, PreloadEntry};
pub use button::{Button, ButtonId}; pub use button::{Button, ButtonId};
pub use cartridge::{AppMode, Cartridge, CartridgeDTO, CartridgeError}; pub use cartridge::{AppMode, Cartridge, CartridgeDTO, CartridgeError};
pub use cartridge_loader::{CartridgeLoader, DirectoryCartridgeLoader, PackedCartridgeLoader}; pub use cartridge_loader::{CartridgeLoader, DirectoryCartridgeLoader, PackedCartridgeLoader};

View File

@ -399,6 +399,7 @@ mod tests {
program: rom, program: rom,
assets: vec![], assets: vec![],
asset_table: vec![], asset_table: vec![],
preload: vec![],
}; };
os.initialize_vm(&mut vm, &cartridge); os.initialize_vm(&mut vm, &cartridge);
@ -440,6 +441,7 @@ mod tests {
program: rom, program: rom,
assets: vec![], assets: vec![],
asset_table: vec![], asset_table: vec![],
preload: vec![],
}; };
os.initialize_vm(&mut vm, &cartridge); os.initialize_vm(&mut vm, &cartridge);

View File

@ -16,8 +16,7 @@
"codec": "RAW", "codec": "RAW",
"metadata": { "metadata": {
"sample_rate": 44100 "sample_rate": 44100
}, }
"preload_slot": 0
}, },
{ {
"asset_id": "mouse_cursor", "asset_id": "mouse_cursor",
@ -30,8 +29,11 @@
"tile_size": 16, "tile_size": 16,
"width": 16, "width": 16,
"height": 16 "height": 16
}, }
"preload_slot": 1
} }
],
"preload": [
{ "asset_id": "bgm_music", "slot": 0 },
{ "asset_id": "mouse_cursor", "slot": 1 }
] ]
} }