diff --git a/agb/src/display/background.rs b/agb/src/display/background.rs index 78f55751..e64b5323 100644 --- a/agb/src/display/background.rs +++ b/agb/src/display/background.rs @@ -25,6 +25,18 @@ const TILE_BACKGROUND: MemoryMapped1DArray = const PALETTE_BACKGROUND: MemoryMapped1DArray = unsafe { MemoryMapped1DArray::new(0x0500_0000) }; +#[cfg(debug_assertions)] +const unsafe fn debug_unreachable_unchecked() -> ! { + unreachable!(); +} + +#[cfg(not(debug_assertions))] +const unsafe fn debug_unreachable_unchecked() -> ! { + use core::hint::unreachable_unchecked; + + unreachable_unchecked(); +} + #[derive(Clone, Copy, Debug)] pub enum TileFormat { FourBpp, @@ -72,7 +84,7 @@ impl VRamState { if let VRamState::ReferenceCounted(count, _) = self { *count += 1; } else { - panic!("Corrupted vram state"); + unsafe { debug_unreachable_unchecked() }; } } @@ -81,7 +93,7 @@ impl VRamState { *count -= 1; (*count, *tile_ref) } else { - panic!("Corrupted vram state"); + unsafe { debug_unreachable_unchecked() }; } } } @@ -134,7 +146,7 @@ impl<'a> VRamManager<'a> { self.tilesets[ptr] = tileset; ptr } - _ => panic!("Free pointer shouldn't point to valid data"), + _ => unsafe { debug_unreachable_unchecked() }, } } else { self.tilesets.push(tileset); @@ -149,7 +161,7 @@ impl<'a> VRamManager<'a> { match tileset { ArenaStorageItem::Data(_, generation) => { - assert_eq!( + debug_assert_eq!( *generation, tile_set_ref.generation, "Tileset generation must be the same when removing" ); @@ -162,7 +174,7 @@ impl<'a> VRamManager<'a> { self.free_pointer = Some(tile_set_ref.id as usize); } - _ => panic!("Already freed, probably a double free?"), + _ => unsafe { debug_unreachable_unchecked() }, } } @@ -182,7 +194,7 @@ impl<'a> VRamManager<'a> { self.vram_free_pointer = Some(next_free as usize); } } - VRamState::ReferenceCounted(_, _) => panic!("Corrupted tile reference state"), + VRamState::ReferenceCounted(_, _) => unsafe { debug_unreachable_unchecked() }, } self.references[ptr] = VRamState::ReferenceCounted(1, tile_ref); @@ -196,7 +208,7 @@ impl<'a> VRamManager<'a> { let tile_slice = if let ArenaStorageItem::Data(data, generation) = &self.tilesets[tile_set_ref.id as usize] { - assert_eq!( + debug_assert_eq!( *generation, tile_set_ref.generation, "Stale tile data requested" ); @@ -204,7 +216,7 @@ impl<'a> VRamManager<'a> { let tile_offset = (tile as usize) * data.format.tile_size() / 4; &data.tiles[tile_offset..(tile_offset + data.format.tile_size() / 4)] } else { - panic!("Cannot find tile data at given reference"); + unsafe { debug_unreachable_unchecked() }; }; let tile_size_in_words = TileFormat::FourBpp.tile_size() / 4; diff --git a/examples/the-hat-chooses-the-wizard/Cargo.lock b/examples/the-hat-chooses-the-wizard/Cargo.lock index aed684ac..c6a6fad7 100644 --- a/examples/the-hat-chooses-the-wizard/Cargo.lock +++ b/examples/the-hat-chooses-the-wizard/Cargo.lock @@ -25,6 +25,7 @@ dependencies = [ "bare-metal", "bitflags", "hashbrown", + "rustc-hash", ] [[package]] @@ -89,12 +90,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" -[[package]] -name = "bare-metal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" - [[package]] name = "bitflags" version = "1.3.2" @@ -103,9 +98,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bytemuck" -version = "1.7.3" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f" +checksum = "0e851ca7c24871e7336801608a4797d7376545b6928a10d32d75685687141ead" [[package]] name = "byteorder" @@ -248,15 +243,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "png" -version = "0.17.4" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cd7d51cea7e2fa6bbcb8af5fbcad15b871451bfc2d20ed72dff2f4ae072a84" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", @@ -318,6 +313,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "ryu" version = "1.0.9" diff --git a/examples/the-hat-chooses-the-wizard/src/main.rs b/examples/the-hat-chooses-the-wizard/src/main.rs index fc475f8c..3a44e8ba 100644 --- a/examples/the-hat-chooses-the-wizard/src/main.rs +++ b/examples/the-hat-chooses-the-wizard/src/main.rs @@ -285,8 +285,11 @@ impl<'a, 'b> Map<'a, 'b> { self.foreground.commit(); } - pub fn init(&mut self, vram: &mut VRamManager) { + pub fn init_background(&mut self, vram: &mut VRamManager) { self.background.init(vram, self.position.floor()); + } + + pub fn init_foreground(&mut self, vram: &mut VRamManager) { self.foreground.init(vram, self.position.floor()); } } @@ -874,7 +877,13 @@ fn main(mut agb: agb::Gba) -> ! { agb::input::ButtonController::new(), ); - level.background.init(&mut vram); + level.background.init_background(&mut vram); + music_box.before_frame(&mut mixer); + mixer.frame(); + vblank.wait_for_vblank(); + mixer.after_vblank(); + + level.background.init_foreground(&mut vram); for _ in 0..60 { music_box.before_frame(&mut mixer);