implements PR-016 asset codec NONE in runtime
This commit is contained in:
parent
a024e199fb
commit
ecc1a864bb
@ -180,6 +180,10 @@ impl AssetBridge for AssetManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl AssetManager {
|
impl AssetManager {
|
||||||
|
fn codec_is_none_or_legacy_raw(codec: &str) -> bool {
|
||||||
|
matches!(codec, "NONE" | "RAW")
|
||||||
|
}
|
||||||
|
|
||||||
fn decode_tile_bank_layout(
|
fn decode_tile_bank_layout(
|
||||||
entry: &AssetEntry,
|
entry: &AssetEntry,
|
||||||
) -> Result<(TileSize, usize, usize, usize), String> {
|
) -> Result<(TileSize, usize, usize, usize), String> {
|
||||||
@ -246,9 +250,13 @@ impl AssetManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn op_mode_for(entry: &AssetEntry) -> Result<AssetOpMode, String> {
|
fn op_mode_for(entry: &AssetEntry) -> Result<AssetOpMode, String> {
|
||||||
match (entry.bank_type, entry.codec.as_str()) {
|
match entry.bank_type {
|
||||||
(BankType::TILES, "RAW") => Ok(AssetOpMode::StageInMemory),
|
BankType::TILES if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
|
||||||
(BankType::SOUNDS, "RAW") => Ok(AssetOpMode::DirectFromSlice),
|
Ok(AssetOpMode::StageInMemory)
|
||||||
|
}
|
||||||
|
BankType::SOUNDS if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
|
||||||
|
Ok(AssetOpMode::DirectFromSlice)
|
||||||
|
}
|
||||||
_ => Err(format!("Unsupported codec: {}", entry.codec)),
|
_ => Err(format!("Unsupported codec: {}", entry.codec)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -914,7 +922,7 @@ mod tests {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
size: expected_tile_payload_size(width, height) as u64,
|
size: expected_tile_payload_size(width, height) as u64,
|
||||||
decoded_size: expected_tile_decoded_size(width, height) as u64,
|
decoded_size: expected_tile_decoded_size(width, height) as u64,
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: serde_json::json!({
|
metadata: serde_json::json!({
|
||||||
"tile_size": 16,
|
"tile_size": 16,
|
||||||
"width": width,
|
"width": width,
|
||||||
@ -966,14 +974,22 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_op_mode_for_tiles_raw_stages_in_memory() {
|
fn test_op_mode_for_tiles_none_stages_in_memory() {
|
||||||
let entry = test_tile_asset_entry("tiles", 16, 16);
|
let entry = test_tile_asset_entry("tiles", 16, 16);
|
||||||
|
|
||||||
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
|
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_op_mode_for_sounds_raw_reads_direct_from_slice() {
|
fn test_op_mode_for_tiles_raw_is_legacy_alias() {
|
||||||
|
let mut entry = test_tile_asset_entry("tiles", 16, 16);
|
||||||
|
entry.codec = "RAW".to_string();
|
||||||
|
|
||||||
|
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_op_mode_for_sounds_none_reads_direct_from_slice() {
|
||||||
let entry = AssetEntry {
|
let entry = AssetEntry {
|
||||||
asset_id: 1,
|
asset_id: 1,
|
||||||
asset_name: "sound".to_string(),
|
asset_name: "sound".to_string(),
|
||||||
@ -981,7 +997,7 @@ mod tests {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
size: 8,
|
size: 8,
|
||||||
decoded_size: 8,
|
decoded_size: 8,
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: serde_json::json!({
|
metadata: serde_json::json!({
|
||||||
"sample_rate": 44100
|
"sample_rate": 44100
|
||||||
}),
|
}),
|
||||||
@ -1077,7 +1093,7 @@ mod tests {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
size: data.len() as u64,
|
size: data.len() as u64,
|
||||||
decoded_size: data.len() as u64,
|
decoded_size: data.len() as u64,
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: serde_json::json!({
|
metadata: serde_json::json!({
|
||||||
"sample_rate": 44100
|
"sample_rate": 44100
|
||||||
}),
|
}),
|
||||||
@ -1122,7 +1138,7 @@ mod tests {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
size: data.len() as u64,
|
size: data.len() as u64,
|
||||||
decoded_size: data.len() as u64,
|
decoded_size: data.len() as u64,
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: serde_json::json!({
|
metadata: serde_json::json!({
|
||||||
"sample_rate": 44100
|
"sample_rate": 44100
|
||||||
}),
|
}),
|
||||||
|
|||||||
@ -20,7 +20,7 @@ pub struct AssetEntry {
|
|||||||
pub offset: u64,
|
pub offset: u64,
|
||||||
pub size: u64,
|
pub size: u64,
|
||||||
pub decoded_size: u64,
|
pub decoded_size: u64,
|
||||||
pub codec: String, // e.g., "RAW"
|
pub codec: String, // e.g., "NONE" (legacy alias: "RAW")
|
||||||
pub metadata: serde_json::Value,
|
pub metadata: serde_json::Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -369,7 +369,7 @@ mod tests {
|
|||||||
offset,
|
offset,
|
||||||
size,
|
size,
|
||||||
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: json!({
|
metadata: json!({
|
||||||
"tile_size": 16,
|
"tile_size": 16,
|
||||||
"width": 16,
|
"width": 16,
|
||||||
@ -451,7 +451,7 @@ mod tests {
|
|||||||
offset: 4,
|
offset: 4,
|
||||||
size: 4,
|
size: 4,
|
||||||
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: json!({
|
metadata: json!({
|
||||||
"tile_size": 16,
|
"tile_size": 16,
|
||||||
"width": 16,
|
"width": 16,
|
||||||
|
|||||||
@ -109,7 +109,7 @@ fn test_tile_asset_entry(asset_name: &str, data_len: usize) -> AssetEntry {
|
|||||||
offset: 0,
|
offset: 0,
|
||||||
size: data_len as u64,
|
size: data_len as u64,
|
||||||
decoded_size: test_tile_decoded_size(16, 16) as u64,
|
decoded_size: test_tile_decoded_size(16, 16) as u64,
|
||||||
codec: "RAW".to_string(),
|
codec: "NONE".to_string(),
|
||||||
metadata: serde_json::json!({
|
metadata: serde_json::json!({
|
||||||
"tile_size": 16,
|
"tile_size": 16,
|
||||||
"width": 16,
|
"width": 16,
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
# 016 Asset Codec `NONE` Runtime and Tests
|
|
||||||
|
|
||||||
## Briefing
|
|
||||||
|
|
||||||
Com a decision `013`, o runtime deve migrar o valor canonico de `codec` para `NONE` sem quebrar a transicao curta a partir de `RAW`.
|
|
||||||
|
|
||||||
Esta PR executa a propagacao em codigo, fixtures e testes do runtime.
|
|
||||||
|
|
||||||
## Decisions de Origem
|
|
||||||
|
|
||||||
- `docs/runtime/decisions/013-asset-codec-none-vs-raw.md`
|
|
||||||
|
|
||||||
## Alvo
|
|
||||||
|
|
||||||
Atualizar o runtime para que:
|
|
||||||
|
|
||||||
1. `NONE` seja aceito como valor principal de `codec`;
|
|
||||||
2. `RAW` seja aceito apenas como alias legado durante a janela curta de transicao;
|
|
||||||
3. fixtures e testes passem a publicar `NONE` como valor canonico;
|
|
||||||
4. `TILES` e `SOUNDS` fiquem coerentes com a decision.
|
|
||||||
|
|
||||||
## Escopo
|
|
||||||
|
|
||||||
- atualizar `crates/console/prometeu-drivers/src/asset.rs`
|
|
||||||
- atualizar fixtures/testes em `prometeu-drivers`, `prometeu-hal` e `prometeu-system`
|
|
||||||
- ajustar comentarios inline onde `RAW` ainda apareca como valor canonico
|
|
||||||
|
|
||||||
## Fora de Escopo
|
|
||||||
|
|
||||||
- remover imediatamente a compatibilidade com `RAW`
|
|
||||||
- alterar packer
|
|
||||||
- introduzir novos codecs
|
|
||||||
- mudar contratos de layout de `TILES` ou `SOUNDS`
|
|
||||||
- publicar banks genericos novos como `BLOB`
|
|
||||||
|
|
||||||
## Plano de Execucao
|
|
||||||
|
|
||||||
1. Atualizar o path de resolucao de `codec` para aceitar `NONE` como valor canonico.
|
|
||||||
2. Preservar `RAW` como alias legado durante a transicao curta.
|
|
||||||
3. Migrar fixtures e testes para emitir `NONE`.
|
|
||||||
4. Revisar comentarios e exemplos inline para remover `RAW` como default canonico.
|
|
||||||
5. Validar que `TILES` e `SOUNDS` continuam operando sem regressao comportamental.
|
|
||||||
|
|
||||||
## Criterios de Aceite
|
|
||||||
|
|
||||||
- runtime aceita `NONE` em `TILES` e `SOUNDS`
|
|
||||||
- runtime continua aceitando `RAW` apenas como alias legado
|
|
||||||
- fixtures e testes passam a usar `NONE` como valor canonico
|
|
||||||
- nenhum comentario ou helper novo reforca `RAW` como valor principal
|
|
||||||
|
|
||||||
## Tests / Validacao
|
|
||||||
|
|
||||||
- testes unitarios do asset loader
|
|
||||||
- testes do runtime/VM que passam por asset loading
|
|
||||||
- revisao de fixtures de cartridge/asset metadata
|
|
||||||
|
|
||||||
## Riscos
|
|
||||||
|
|
||||||
- deixar paths diferentes tratando `NONE` e `RAW` de forma inconsistente
|
|
||||||
- migrar fixtures parcialmente e mascarar regressao real
|
|
||||||
- prolongar compatibilidade legacy sem rastro claro para remocao futura
|
|
||||||
@ -36,7 +36,7 @@ Uma PR deste diretório deve:
|
|||||||
|
|
||||||
## Roadmap Atual
|
## Roadmap Atual
|
||||||
|
|
||||||
- `016-asset-codec-none-runtime-and-tests.md`
|
Nenhuma PR em aberto no momento.
|
||||||
|
|
||||||
## PRs Finalizadas
|
## PRs Finalizadas
|
||||||
|
|
||||||
@ -44,3 +44,4 @@ Uma PR deste diretório deve:
|
|||||||
- `013-tile-bank-runtime-contract-alignment.md`: concluída. Contrato normativo de `tile bank` v1 alinhado entre `specs/04` e `specs/15`.
|
- `013-tile-bank-runtime-contract-alignment.md`: concluída. Contrato normativo de `tile bank` v1 alinhado entre `specs/04` e `specs/15`.
|
||||||
- `014-tile-bank-loader-packed-nibbles-and-palette-boundary.md`: concluída. Loader/runtime atualizado para consumir payload serializado `4bpp` packed com `64` paletas por bank.
|
- `014-tile-bank-loader-packed-nibbles-and-palette-boundary.md`: concluída. Loader/runtime atualizado para consumir payload serializado `4bpp` packed com `64` paletas por bank.
|
||||||
- `015-asset-codec-none-canonicalization-in-specs.md`: concluída. `NONE` publicado como valor canonico de ausencia de codec adicional nas specs.
|
- `015-asset-codec-none-canonicalization-in-specs.md`: concluída. `NONE` publicado como valor canonico de ausencia de codec adicional nas specs.
|
||||||
|
- `016-asset-codec-none-runtime-and-tests.md`: concluída. Runtime e fixtures migrados para `NONE`, preservando `RAW` apenas como alias legado temporário.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user